From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail.kernel.org ([198.145.29.99]:42466 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753281AbeCYQ3S (ORCPT ); Sun, 25 Mar 2018 12:29:18 -0400 Date: Sun, 25 Mar 2018 17:29:11 +0100 From: Jonathan Cameron To: John Syne Cc: Rodrigo Siqueira , devel@driverdev.osuosl.org, Lars-Peter Clausen , linux-iio@vger.kernel.org, Greg Kroah-Hartman , linux-kernel@vger.kernel.org, Peter Meerwald-Stadler , Hartmut Knaack , daniel.baluta@nxp.com, Michael Hennerich Subject: Re: meter ABI: (was Re: [PATCH v2 1/3] staging:iio:meter: Replaces IIO_DEV_ATTR_CH_OFF by IIO_DEVICE_ATTR) Message-ID: <20180325172911.39c0e42f@archlinux> In-Reply-To: References: <3af0e5a795059a8418cf08ff29f05f8d5e00da9b.1520382753.git.rodrigosiqueiramelo@gmail.com> <20180307200730.08ed3c2f@archlinux> <20180309003733.aichruo53vqryafg@smtp.gmail.com> <20180310151045.4570e85d@archlinux> <79D3051B-FF2F-4DD3-AF75-F6A4BAD81838@gmail.com> <20180317203037.1093cc11@archlinux> <20180318122312.0d395367@archlinux> <20180324150205.709aa211@archlinux> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Sender: linux-iio-owner@vger.kernel.org List-Id: linux-iio@vger.kernel.org On Sat, 24 Mar 2018 15:45:21 -0700 John Syne wrote: > > On Mar 24, 2018, at 8:02 AM, Jonathan Cameron wrote: > > > > On Mon, 19 Mar 2018 22:57:16 -0700 > > John Syne wrote: > > > >> Hi Jonathan, > >> > >> Thank you for all your hard work. Your feedback is really helpful. I’m surprised that no one from Analog Device has offered any suggestions. > >> > > > > Sadly those active in the mainline linux kernel from ADI are focused in > > other areas currently :( > Good point. I will reach out to Analog Devices and get a name of someone > who is knowledgeable in this area. Perhaps Lars-Peters has a suggestion. Yes, Lars or Michael Hennerich (+CC) are my normal contact points. I believe this is outside both of their areas, but they may be able to put you in contact with the right person. If nothing else it would be good to make someone in ADI aware that people care about linux support for these parts! > >> Anyway, please see my comments inline below > >> > >> Regards, > >> John > >> > >> > >> > >> > >> > >>> On Mar 18, 2018, at 5:23 AM, Jonathan Cameron wrote: > >>> > >>> On Sat, 17 Mar 2018 23:11:45 -0700 > >>> John Syne wrote: > >>> > >>>> Hi Jonathan, > >>> Hi John and All, > >>> > >>> I'd love to get some additional input on this from anyone interested. > >>> There are a lot of weird and wonderful derived quantities in an energy > >>> meter and it seems we need to make some fundamental changes to support > >>> them - including potentially a userspace breaking change to the event > >>> code description. > >>> > >>>> > >>>> Here is the complete list of registers for the ADE7878 which I copied from the data sheet. I added a column “IIO Attribute” which I hope follows your IIO ABI. Please make any changes you feel are incorrect. BTW, there are several registers that cannot be generalized and are used purely for chip configuration. I think we should add a new naming convention, namely {register}_{}. Also, I see in the sys_bus_iio doc No, registers can always be broken up in to real meaningful values if they are exposed to userspace and userspace has a reason to tweak them. We never expose raw registers to userspace except through debugfs and the clue is in the name - purely for debug. > > > > > > > > > >>>> in_accel_x_peak_raw > >>>> > >>>> so shouldn’t the phase be represented as follows: > >>>> > >>>> in_current_A_scale > >>> I'm still confused. What does A represent here? I assumed that was a wild > >>> card for the channel number before but clearly not. > >>> > >>> Ah, you are labelling the 3 separate phases as A, B and C. Hmm. > >>> I guess they sort of look like axis, and sort of like independent channels. > >>> So could be indexed or done via modifiers depending on how you look at it. > >> In metering terminology, the three phases are commonly referred to as RED, GREEN, BLUE or PhaseA, PhaseB, PhaseC and Neutral. Analog Devices uses the ABCN nomenclature so anyone using this driver will probably have referenced the Analog Devices datasheet so this terminology should be familiar. > > Which is more commonly used in general? We are designing what we hope > > will be a general interface and last thing we want is to have everyone > > not using ADI parts confused! Personally not assigning 'colours' makes > > more sense to me. > I did a little research and here is the naming used by vendor: > > ST Microelectronics: P1, P2, P3, N > http://www.st.com/content/ccc/resource/technical/document/application_note/5e/f4/22/4d/90/96/4c/c4/CD00153264.pdf/files/CD00153264.pdf/jcr:content/translations/en.CD00153264.pdf > > Teridian: ABCN > https://www.mouser.com/ds/2/256/71M6513-71M6513H-22603.pdf > > Maxim Integrated: ABCN > https://datasheets.maximintegrated.com/en/ds/78M6631.pdf > > Microchip: ABCN > http://ww1.microchip.com/downloads/en/DeviceDoc/51643b.pdf > > NXP: L1, L2, L3, N > https://www.nxp.com/support/developer-resources/reference-designs/kinetis-km3x-256-mcu-three-phase-metering-reference-design:RD-KM3x-256-3PH-METERING > > Renesas: ABCN > https://www.renesas.com/en-us/solutions/home/metering/power-meter-three.html > > So the most consistent would be ABCN Cool. Makes sense to go with that. Thanks for checking this out. > > > All vendor providing three phase energy metering ICs use the ABCN terminology. > > > > (btw please wrap any lines that don't need to be long to around 80 characters). > > > >>> > >>> Hmm. With neutral in there as well I guess we need to make them > >>> modifiers (but might change my mind later ;) > >>> > >>> Particularly as we are using the the modifier for RMS under the previous > >>> plan... It appears we should treat that instead like we did for peak > >>> and do it as an additional info mask element. The problem with doing that > >>> on a continuous measurement is that we can't treat it as a channel to > >>> be output through the buffered interface. > >> I’ve changed the layout of the spreadsheet to breakout the Direction, Type, Index, Modifier and Info Mask to make sure there is no miss-understanding and will help identify all the items we need to add. > >> > >> The ADE7878 channels that will use the buffer are IAWV, VAWV, IBWV, VBWV, ICWV, VCWV, INWV, AVA, BVA, CVA, AWATT, BWATT, CWATT, AVAR, BVAR, and CVAR. So I guess we have to add an index > > Probably a good idea anyway, we are sort of slowly moving away > > from index less channels. The ABI always allowed index assignment > > and it makes for easier userspace code. > > > >> > >> Address Register IIO Attribute Dir Type Index Modifier Info Mask R/W Bit Bit Length Type Default Description > >> Length During Comm Value > >> 0xE50C IAWV in_current0_phaseA_instantaneous in current 0 phaseA instantaneous R 24 32 SE S N/A Instantaneous value of Phase A current. > > > > I'm unconvinced by "instantaneous". That is the default assumption that you are > > measuring current at this point in time. I'm still confused on what this actually > > is. Is it effectively the DC current? I.e. the wave form value for current? > > You answer this below. They are DC measurements.. > No, they are the output of the ADC at a point in time. The ADC samples > continuous at 8,000 samples per second, so when you read this register > you are getting the sample measured just before your read. I don’t know > why anyone would read this register. The samples are streamed via > the SPI interface, with IAWV, VAWV, IBWV, VBWV, ICWV, VCWV, INWV, > AVA, BVA, CVA, AWATT, BWATT, CWATT, AVAR, BVAR, and CVAR transmitted > every 125uS. Probably better not to expose these registers to user space. I'm happy not to expose them, but if they are the instantaneous values they are what I mean by DC values, literally the number you would see on an oscilloscope if you were to probe them. > > > > > > Which actually raises a point I'd forgotten. We have an explicit type > > for altvoltage (defined for DDS devices as the waveform amplitude IIRC). > > We should be consistent with that if possible. > > > > So I think this should be. > > in_current0_phaseA_raw > Yeah, that sounds correct, which reminds me of another issue that does not make > sense. To me, gain is something that is hardware related and is used to magnify > an input signal or is used to calibrate a measurement. Scale on the other had is > something that is used to convert a raw measurement into something that is more > meaningful, such as 0x820000 = 220V. So everywhere we have used scale and gain > interchangeable is confusing. Agreed - up to a point. If you have a hardware gain control which for whatever reason results in a different scaling needing to be applied to go from userspace value to real world value (sometimes happens with multi range devices) then we expose it only once - as scale. We have hardwaregain and calibgain for tweaking the gain to account for cases where it isn't apparent in the output value (hardware gain - normally used when we are measuring something about the signal that isn't it's magnitude), or is compensating for inaccuracies in the circuitry or sensor (calibgain) > > > etc > > A channel can be uniquely identified using index and modifier as as pair (if we add > > the new field for computation applied that will also allow separate identification). > > So the later channels can be. > > > > in_current0_phaseB_raw etc > > > > Indexes can be shared by different types as well. Often done to associate > > different measurements of the same signal (though the ABI doesn't specify > > that). > > > >> 0xE50D IBWV in_current1_phaseB_instantaneous in current 1 phaseB instantaneous R 24 32 SE S N/A Instantaneous value of Phase B current. > >> 0xE50E ICWV in_current2_phaseC_instantaneous in current 2 phaseC instantaneous R 24 32 SE S N/A Instantaneous value of Phase C current. > >> 0xE50F INWV in_current3_phaseN_instantaneous in current 3 neutral instantaneous R 24 32 SE S N/A Instantaneous value of neutral current (ADE7868 and ADE7878 only). > > in_voltage0_phaseA_raw > > > >> 0xE510 VAWV in_voltage4_phaseA_instantaneous in voltage 4 phaseA instantaneous R 24 32 SE S N/A Instantaneous value of Phase A voltage. > >> 0xE511 VBWV in_voltage5_phaseB_instantaneous in voltage 5 phaseB instantaneous R 24 32 SE S N/A Instantaneous value of Phase B voltage. > >> 0xE512 VCWV in_voltage6_phaseC_instantaneous in voltage 6 phaseC instantaneous R 24 32 SE S N/A Instantaneous value of Phase C voltage. > >> 0xE513 AWATT in_power7_phaseA_instantaneous in power 7 phaseA instantaneous R 24 32 SE S N/A Instantaneous value of Phase A total active power. > >> 0xE514 BWATT in_power8_phaseB_instantaneous in power 8 phaseB instantaneous R 24 32 SE S N/A Instantaneous value of Phase B total active power. > >> 0xE515 CWATT in_power9_phaseC_instantaneous in power 9 phaseC instantaneous R 24 32 SE S N/A Instantaneous value of Phase C total active power. > > in_power0_phaseC_raw > > > >> 0xE516 AVAR in_powerreactive10_phaseA_instantaneous in powerreactive 10 phaseA instantaneous R 24 32 SE S N/A Instantaneous value of Phase A total reactive power (ADE7858, ADE7868, and ADE7878 only). > > in_powerreactive0_phaseA_raw etc > >> 0xE517 BVAR in_powerreactive11_phaseB_instantaneous in powerreactive 11 phaseB instantaneous R 24 32 SE S N/A Instantaneous value of Phase B total reactive power (ADE7858, ADE7868, and ADE7878 only). > >> 0xE518 CVAR in_powerreactive12_phaseC_instantaneous in powerreactive 12 phaseC instantaneous R 24 32 SE S N/A Instantaneous value of Phase C total reactive power (ADE7858, ADE7868, and ADE7878 only). > >> 0xE519 AVA in_powerapparent13_phaseA_instantaneous in powerapparent 13 phaseA instantaneous R 24 32 SE S N/A Instantaneous value of Phase A apparent power. > >> 0xE51A BVA in_powerapparent14_phaseB_instantaneous in powerapparent 14 phaseB instantaneous R 24 32 SE S N/A Instantaneous value of Phase B apparent power. > >> 0xE51B CVA in_powerappatent15_phaseC_instantaneous in powerapparent 15 phaseC instantaneous R 24 32 SE S N/A Instantaneous value of Phase C apparent power. > >> > >> The ADE9000 channels that use the buffer are IA, VA, IB, VB, IC, VC and IN > >>> > >>> So again we have run out of space. It's increasingly looking like we need > >>> room for another field in the events - to cleanly represent computed values. > >>> > >>> Hmm. What is the current usage? - it's been a while so I had to go > >>> look in the header. > >>> > >>> 0-15 Channel (lots of channels) > >>> 31-16 Channel 2 (36 modifiers - lots of channels) > >>> 47-32 Channel Type (31 used so far - this looks most likely to run out of > >>> space in the long run so leave this one alone). > >>> 54-48 Event Direction (4 used) > >>> 55 Differential (1: channel 2 as differential pair 0: as a modifier) > >>> 63-56 Event Type (6 used) > >>> > >>> So I think we can pinch bit 53 as another flag to indicate we have > >>> a computed value or possibly bit 63 as event types are few and > >>> far between as well. > >>> > >>> Probably reasonable to assume we never have 16 bits worth > >>> of channels and computed channels at the same time? > >>> Hence I think we can steal bits off the top of Channel. > >>> How many do we need? Not sure unfortunately but feels like > >>> 8 should be plenty. > >> When you speak of Channels here, are you referring to measurements that will use the buffer? Even when counting all the IIO attributes, the ADE9000 has 462 registers, and not all of those would be defined as attributes. I think 8 Bits should be more than enough. > > Not quite. This is all about allowing us to differentiate between > > the actual channels where a channel is a single measurement that we > > are interested in. > > So we care about 256 measurements that are otherwise indistinguishable > > using combination of index, modifier and our new propose > > computedvalue bit. > Got it. > > > >>> > >>> The other element of this is we add a new field to iio_chan_spec > >>> to contain 'derived_type' or something like that which has > >>> rms and sum squared etc. Over time we can move some of those > >>> from the modifiers and free up a few entires there. > >>> So modifier might be "X and Y and Z" with a derived_type of > >>> sum_squared to give existing sum_squared_x_y_z but no > >>> rush on that. > >>> > >>> Anyhow so now we have an extra element to play that will result > >>> in a different channel. > >>> > >>> Whilst here we should think about any other mods needed to > >>> that event structure. It is a little unfortunate that this > >>> will be a breaking change for any old userspace code playing > >>> with new drivers but it can't be helped as we didn't have > >>> reserved values in the original definition (oops). > >>> > >>> At somepoint we may need to add the 'shared by derived_value' > >>> info mask but I think we can ignore that for now (seems > >>> moderately unlikely to have anything in it!) > >>>> > >>>> But for now, I followed your instructions from your reply. > >>>> > >>>> After finalizing this one, I will work on the ADE9000, which as way more registers ;-) > >>>> > >>>> Once we can agree on the register naming, I will update the ADE7854 driver for Rodrigo, which will go a long way to getting it out of staging. > >>> I'll edit to fit with new scheme and insert indexes which I think would be > >>> preferred though optional under the ABI as we only have one of each type/ > >>>> > >>>> Address Register IIO Attribute R/W Bit Length Bit Length During Communications Type Default Value Description > >>>> 0x4380 AIGAIN in_current0_phaseA_scale R/W 24 32 ZPSE S 0x000000 Phase A current gain adjust. > >>> A, B, C, N aren't obvious to the lay reader so I suggest we burn a few characters and stick phase in for ABC and just have neutral for > >>> the neutral one. Not sure about capitalization or not though. > >>> > >>>> 0x4381 AVGAIN in_voltage0_phaseA_scale R/W 24 32 ZPSE S 0x000000 Phase A voltage gain adjust. > >>>> 0x4382 BIGAIN in_current0_phaseB_scale R/W 24 32 ZPSE S 0x000000 Phase B current gain adjust. > >>>> 0x4383 BVGAIN in_voltage0_phaseB_scale R/W 24 32 ZPSE S 0x000000 Phase B voltage gain adjust. > >>>> 0x4384 CIGAIN in_current0_phaseC_scale R/W 24 32 ZPSE S 0x000000 Phase C current gain adjust. > >>>> 0x4385 CVGAIN in_voltage0_phaseC_scale R/W 24 32 ZPSE S 0x000000 Phase C voltage gain adjust. > >>>> 0x4386 NIGAIN in_current0_neutral_scale R/W 24 32 ZPSE S 0x000000 Neutral current gain adjust (ADE7868 and ADE7878 only). > >>>> 0x4387 AIRMSOS in_current0_phaseA_rms_offset R/W 24 32 ZPSE S 0x000000 Phase A current rms offset. > >>>> 0x4388 AVRMSOS in_voltage0_phaseA_rms_offset R/W 24 32 ZPSE S 0x000000 Phase A voltage rms offset. > >>>> 0x4389 BIRMSOS in_current0_phaseB_rms_offset R/W 24 32 ZPSE S 0x000000 Phase B current rms offset. > >>>> 0x438A BVRMSOS in_voltage0_phaseB_rms_offset R/W 24 32 ZPSE S 0x000000 Phase B voltage rms offset. > >>>> 0x438B CIRMSOS in_current0_phaseC_rms_offset R/W 24 32 ZPSE S 0x000000 Phase C current rms offset. > >>>> 0x438C CVRMSOS in_voltage0_phaseC_rms_offset R/W 24 32 ZPSE S 0x000000 Phase C voltage rms offset. > >>>> 0x438D NIRMSOS in_current0_neutral_rms_offset R/W 24 32 ZPSE S 0x000000 Neutral current rms offset (ADE7868 and ADE7878 only). > >>>> 0x438E AVAGAIN in_powerapparent0_phaseA_scale R/W 24 32 ZPSE S 0x000000 Phase A apparent power gain adjust. > >>>> 0x438F BVAGAIN in_powerapparent0_phaseB_scale R/W 24 32 ZPSE S 0x000000 Phase B apparent power gain adjust. > >>>> 0x4390 CVAGAIN in_powerapparent0_phaseC_scale R/W 24 32 ZPSE S 0x000000 Phase C apparent power gain adjust. > >>>> 0x4391 AWGAIN in_power0_phaseA_scale R/W 24 32 ZPSE S 0x000000 Phase A total active power gain adjust. > >>>> 0x4392 AWATTOS in_power0_phaseA_offset R/W 24 32 ZPSE S 0x000000 Phase A total active power offset adjust. > >>>> 0x4393 BWGAIN in_power0_phaseB_scale R/W 24 32 ZPSE S 0x000000 Phase B total active power gain adjust. > >>>> 0x4394 BWATTOS in_power0_phaseB_offset R/W 24 32 ZPSE S 0x000000 Phase B total active power offset adjust. > >>>> 0x4395 CWGAIN in_power0_PhaseC_scale R/W 24 32 ZPSE S 0x000000 Phase C total active power gain adjust. > >>>> 0x4396 CWATTOS in_power0_phaseC_offset R/W 24 32 ZPSE S 0x000000 Phase C total active power offset adjust. > >>>> 0x4397 AVARGAIN in_powerreactive0_phaseA_scale R/W 24 32 ZPSE S 0x000000 Phase A total reactive power gain adjust (ADE7858, ADE7868, and ADE7878). > >>>> 0x4398 AVAROS in_powerreactive0_phaseA_offset R/W 24 32 ZPSE S 0x000000 Phase A total reactive power offset adjust (ADE7858, ADE7868, and ADE7878). > >>>> 0x4399 BVARGAIN in_powerreactive0_phaseB_scale R/W 24 32 ZPSE S 0x000000 Phase B total reactive power gain adjust (ADE7858, ADE7868, and ADE7878). > >>>> 0x439A BVAROS in_powerreactive0_phaseB_offset R/W 24 32 ZPSE S 0x000000 Phase B total reactive power offset adjust (ADE7858, ADE7868, and ADE7878). > >>>> 0x439B CVARGAIN in_powerreactive0_phaseC_scale R/W 24 32 ZPSE S 0x000000 Phase C total reactive power gain adjust (ADE7858, ADE7868, and ADE7878). > >>>> 0x439C CVAROS in_powerreactive0_phaseC_offset R/W 24 32 ZPSE S 0x000000 Phase C total reactive power offset adjust (ADE7858, ADE7868, and ADE7878). > >>>> 0x439D AFWGAIN in_power0_phaseA_fundamental_scale R/W 24 32 ZPSE S 0x000000 Phase A fundamental active power gain adjust. Location reserved for ADE7854, ADE7858, and ADE7868. > >>> Hmm. fundamental is the oddity here. I here because it is sort of a derived value > >>> and sort of a filter applied. Can it be sensible combined with RMS? probably not but > >>> it can be combined with peak for example (which I'd also ideally move into > >>> the derived representation.). > >> Includes only the measurement spectrum at 50Hz or 60Hz and does not include harmonic. > > I think for that we need to define a different indexed channel and define > > the filters applied with appropriate values to make it a band pass at these > > frequencies. We may need to expand the current filter definitions to do this > > but that is fine if needed. > > > > > >> > >>> > >>>> 0x439E AFWATTOS in_power0_phaseA_fundamental_offset R/W 24 32 ZPSE S 0x000000 Phase A fundamental active power offset adjust. Location reserved for ADE7854, ADE7858, and ADE7868. > >>>> 0x439F BFWGAIN in_power0_phaseB_fundamental_scale R/W 24 32 ZPSE S 0x000000 Phase B fundamental active power gain adjust (ADE7878 only). > >>>> 0x43A0 BFWATTOS in_power0_phaseB_fundamental_offset R/W 24 32 ZPSE S 0x000000 Phase B fundamental active power offset adjust (ADE7878 only). > >>>> 0x43A1 CFWGAIN in_power0_phaseC_fundamental_scale R/W 24 32 ZPSE S 0x000000 Phase C fundamental active power gain adjust. > >>>> 0x43A2 CFWATTOS in_power0_phaseC_fundamental_offset R/W 24 32 ZPSE S 0x000000 Phase C fundamental active power offset adjust (ADE7878 only). > >>>> 0x43A3 AFVARGAIN in_powerreactive0_phaseA_fundamental_scale R/W 24 32 ZPSE S 0x000000 Phase A fundamental reactive power gain adjust (ADE7878 only). > >>>> 0x43A4 AFVAROS in_powerreactive0_phaseA_fundamental_offset R/W 24 32 ZPSE S 0x000000 Phase A fundamental reactive power offset adjust (ADE7878 only). > >>>> 0x43A5 BFVARGAIN in_powerreactive0_phaseB_fundamental_scale R/W 24 32 ZPSE S 0x000000 Phase B fundamental reactive power gain adjust (ADE7878 only). > >>>> 0x43A6 BFVAROS in_powerreactive0_phaseB_fundamental_offset R/W 24 32 ZPSE S 0x000000 Phase B fundamental reactive power offset adjust (ADE7878 only). > >>>> 0x43A7 CFVARGAIN in_powerreactive0_phaseC_fundamental_scale R/W 24 32 ZPSE S 0x000000 Phase C fundamental reactive power gain adjust (ADE7878 only). > >>>> 0x43A8 CFVAROS in_powerreactive0_phaseC_fundamental_offset R/W 24 32 ZPSE S 0x000000 Phase C fundamental reactive power offset adjust (ADE7878 only). > >>>> 0x43A9 VATHR1 regiister_VATHR1 R/W 24 32 ZP U 0x000000 Most significant 24 bits of VATHR[47:0] threshold used in phase apparent power datapath. > >>> Do not expose these to userspace. Why would it care? > >> Brilliant, yes these should be moved the the DeviceTree (DT) > > > > Cool > > > >>> > >>>> 0x43AA VATHR0 register_VATHR0 R/W 24 32 ZP U 0x000000 Less significant 24 bits of VATHR[47:0] threshold used in phase apparent power datapath. > >>>> 0x43AB WTHR1 register_WTHR1 R/W 24 32 ZP U 0x000000 Most significant 24 bits of WTHR[47:0] threshold used in phase total/fundamental active power datapath. > >>>> 0x43AC WTHR0 register_WTHR0 R/W 24 32 ZP U 0x000000 Less significant 24 bits of WTHR[47:0] threshold used in phase total/fundamental active power datapath. > >>>> 0x43AD VARTHR1 register_VARTHR1 R/W 24 32 ZP U 0x000000 Most significant 24 bits of VARTHR[47:0] threshold used in phase total/fundamental reactive power datapath (ADE7858, ADE7868, and ADE7878). > >>>> 0x43AE VARTHR0 register_VARTHR0 R/W 24 32 ZP U 0x000000 Less significant 24 bits of VARTHR[47:0] threshold used in phase total/fundamental reactive power datapath (ADE7858, ADE7868, and ADE7878). > >>>> 0x43AF Reserved N/A4 N/A4 N/A4 N/A4 0x000000 This memory location should be kept at 0x000000 for proper operation. > >>>> 0x43B0 VANOLOAD register_VANOLOAD R/W 24 32 ZPSE S 0x0000000 No load threshold in the apparent power datapath. > >>> This one is kind of an event parameter, but one that controls internal creep prevention. > >>> This will be a driver specific attr I think for now. We may add it to info_mask > >>> later if we get lots of meter drivers. > >>> Something like > >>> in_power0_no_load_thresh though I haven't really thought about it or looked > >>> for similar precedence. > >> Again, this is something that would be set and never changed, so I think this should be moved to DT. > > > > Cool. > > > >>> > >>> > >>>> 0x43B1 APNOLOAD register_APNOLOAD R/W 24 32 ZPSE S 0x0000000 No load threshold in the total/fundamental active power datapath. > >>> in_activepower0_no_load_thresh > >> DT > >>>> 0x43B2 VARNOLOAD register_VARNOLOAD R/W 24 32 ZPSE S 0x0000000 No load threshold in the total/fundamental reactive power datapath. Location reserved for ADE7854. > >>> in_reactivpower0_no_load_thresh > >> DT > >>> > >>>> 0x43B3 VLEVEL register_VLEVEL R/W 24 32 ZPSE S 0x000000 Register used in the algorithm that computes the fundamental active and reactive powers (ADE7878 only). > >>> This one looks like a characteristic of the circuit attached. So should be devicetree > >>> or similar and not exposed to userspace. > >> DT > >>> > >>>> 0x43B5 DICOEFF register_DICOEFF R/W 24 32 ZPSE S 0x0000000 Register used in the digital integrator algorithm. If the integrator is turned on, it must be set at 0xFF8000. In practice, it is transmitted as 0xFFF8000. > >>> no userspace interface. > >> DT > >>> > >>>> 0x43B6 HPFDIS register_HPFDIS R/W 24 32 ZP U 0x000000 Disables/enables the HPF in the current datapath (see Table 34). > >>> We have controls for high pass filters, you'll need to map on to them. > >>> Disable is usually setting 3DB point to 0 IIRC. > >> DT > >>> > >>>> 0x43B8 ISUMLVL register_ISUMLVL R/W 24 32 ZPSE S 0x000000 Threshold used in comparison between the sum of phase currents and the neutral current (ADE7868 and ADE7878 only). > >>> This is an event threshold so needs to map to the events infrastructure > >>> as best we can. It's actually a pain to describe so may be device specific ABI. > >> DT. I’m not sure why this would be mapped to the events infrastructure? There is no event generated by this register. > > Control parameter of an event I think? > > So the event description is separate from that of the channels and has it's > > own extended ABI to describe this sort of value. > Do you have an example where a control parameter is used with an event? > I have not seen this anywhere. Sure in the abi docs these are easy to find as they have the type of event in the name. Taking a few relevant entries... /sys/.../events/in_accel_thresh_rising_en /sys/.../events/in_accel_thresh_rising_value /sys/.../events/in_accel_x_thresh_rising_hysteresis /sys/.../events/in_accel_x_thresh_rising_period /sys/.../events/in_accel_thresh_rising_low_pass_filter_3db Grep for iio_event_spec to find how they are defined. It's pretty similar to a channel and they are associated with a particular channel. > > > >>> > >>>> 0x43BF ISUM register_ISUM R 28 32 ZP S N/A4 Sum of IAWV, IBWV, and ICWV registers (ADE7868 and ADE7878 only). > >>> So this would be using a modifier for AandBandC phases (similar to the XandYanZ ones for mems devices and > >>> a derived value of sum I think So would look something like. > >>> in_current0_phaseA&phaseB&phaseC_sum and yet another channel > >>> > >>>> 0x43C0 AIRMS in_current0_phaseA_rms R 24 32 ZP S N/A4 Phase A current rms value. > >>>> 0x43C1 AVRMS in_voltage0_phaseA_rms R 24 32 ZP S N/A4 Phase A voltage rms value. > >>>> 0x43C2 BIRMS in_current0_phaseB_rms R 24 32 ZP S N/A4 Phase B current rms value. > >>>> 0x43C3 BVRMS in_voltage0_phaseB_rms R 24 32 ZP S N/A4 Phase B voltage rms value. > >>>> 0x43C4 CIRMS in_current0_phaseC_rms R 24 32 ZP S N/A4 Phase C current rms value. > >>>> 0x43C5 CVRMS in_voltage0_phaseC_rms R 24 32 ZP S N/A4 Phase C voltage rms value. > >>>> 0x43C6 NIRMS in_current0_neutral_rms R 24 32 ZP S N/A4 Neutral current rms value (ADE7868 and ADE7878 only). > >>>> 0xE228 Run register_Run R/W 16 16 U 0x0000 Run register starts and stops the DSP. See the Digital Signal Processor section for more details. > >>> Not exposed to userspace. > >> DT > >>> > >>>> 0xE400 AWATTHR in_energy0_phaseA_raw R 32 32 S 0x00000000 Phase A total active energy accumulation. > >>>> 0xE401 BWATTHR in_energy0_phaseB_raw R 32 32 S 0x00000000 Phase B total active energy accumulation. > >>>> 0xE402 CWATTHR in_energy0_phaseC_raw R 32 32 S 0x00000000 Phase C total active energy accumulation. > >>>> 0xE403 AFWATTHR in_energy0_phaseA_fundamental_raw R 32 32 S 0x00000000 Phase A fundamental active energy accumulation (ADE7878 only). > >>>> 0xE404 BFWATTHR in_energy0_phaseB_fundamental_raw R 32 32 S 0x00000000 Phase B fundamental active energy accumulation (ADE7878 only). > >>>> 0xE405 CFWATTHR in_energy0_phaseC_fundamental_raw R 32 32 S 0x00000000 Phase C fundamental active energy accumulation (ADE7878 only). > >>>> 0xE406 AVARHR in_energyreactive0_phaseA_raw R 32 32 S 0x00000000 Phase A total reactive energy accumulation (ADE7858, ADE7868, and ADE7878 only). > >>>> 0xE407 BVARHR in_energyreactive0_phaseB_raw R 32 32 S 0x00000000 Phase B total reactive energy accumulation (ADE7858, ADE7868, and ADE7878 only). > >>>> 0xE408 CVARHR in_energyreactive0_phaseC_raw R 32 32 S 0x00000000 Phase C total reactive energy accumulation (ADE7858, ADE7868, and ADE7878 only). > >>>> 0xE409 AFVARHR in_energyreactive0_phaseA_fundamental_raw R 32 32 S 0x00000000 Phase A fundamental reactive energy accumulation (ADE7878 only). > >>>> 0xE40A BFVARHR in_energyreactive0_phaseB_fundamental_raw R 32 32 S 0x00000000 Phase B fundamental reactive energy accumulation (ADE7878 only). > >>>> 0xE40B CFVARHR in_energyreactive0_phaseC_fundamental_raw R 32 32 S 0x00000000 Phase C fundamental reactive energy accumulation (ADE7878 only). > >>>> 0xE40C AVAHR in_energyapparent0_phaseA_raw R 32 32 S 0x00000000 Phase A apparent energy accumulation. > >>>> 0xE40D BVAHR in_energyapparent0_phaseB_raw R 32 32 S 0x00000000 Phase B apparent energy accumulation. > >>>> 0xE40E CVAHR in_energyapparent0_phaseC_raw R 32 32 S 0x00000000 Phase C apparent energy accumulation. > >>>> 0xE500 IPEAK in_current0_peak R 32 32 U N/A Current peak register. See Figure 50 and Table 35 for details about its composition. > >>> Oh goody. I have no idea how we expose the which phase element of this > >>> cleanly. One option I suppose is to have in_current0_phaseA_peak etc > >>> and have all but the current peak return an error when read? It is a bit > >>> nasty but only so much we can do and keep with a consistent interface. > >>> > >>>> 0xE501 VPEAK in_voltage_peak R 32 32 U N/A Voltage peak register. See Figure 50 and Table 36 for details about its composition. > >>> Same as peak. > >>> > >>>> 0xE502 STATUS0 register_STATUS0 R/W 32 32 U N/A Interrupt Status Register 0. See Table 37. > >>>> 0xE503 STATUS1 register_STATUS1 R/W 32 32 U N/A Interrupt Status Register 1. See Table 38. > >>> No userspace interface except via events interface or error reports. > >> Isn’t this tied to the event framework? My thinking is the user interface should be notified when certain conditions occur. > > > > Probably depending on the condition. If it looks like a threshold on something > > it can go through as an event. If it is a 'fault' detection in the measurement > > hardware we need to look at a RAS type notification. This is always a tricky > > topic and the upshot is we normally just end up dumping them in the kernel log > > as anything else is hard to do (from a persuading other people of it's importance > > point of view). > Let’s take some examples: > STATUS0:0 AEHF Bit set when the Watt hour registers reach threshold. > This means the Watt hour registers must be read or the watt hour register will > wrap and you will loose the energy accumulated. So I’m not sure how IIO handles > events with user space, but can I assume it is using a poll or select to monitor for > events? Do we get interrupts to indicate a state change in here? We can poll otherwise but it's not exactly elegant to do so. Had a quick look - as this is the interrupt status register we are fine :) This would be controlled by something like. in_power0_thresh_rising_value >>From a userspace point of view, there is an ioctl that gets you an anonymous chardev. Once you have that you can use poll / select to monitor for events and act on them. There is example code in the iio_event_monitor program in toos/iio in the kernel tree. > > STATUS0:6 REVAPA ACCMODE has changed sign. Power is exported rather > than imported. User space application would use this to indicate the direction > of power flow. This is where we start to run into a problem - mostly IIO only allows for a single threshold for rising and falling on a given channel. No way to tell which one triggered in the ABI - even code says what and on what channel it doesn't distinguish multiple levels. We can play games with defining additional channels but it isn't that elegant. Now assuming we want to do both directions of change.. in_power0_thresh_either_value = 0 (to indicate a transition across 0 power - I assume the other direction is negative?) and associated event code. > > STATUS1:0 NLOAD At least one phase has entered no load condition. User > space app would probably alert the user of a faulty condition. Not sure what this maps to - but would be based on how it was detected. Is this effectively 0 current? > > STATUS1:3 ZXTOVA Indicates Phase A voltage zero crossing is missing. This > is another fault condition. Similar to the rate of change detection in some ways, but only explicitly looks at the 0 point. We would need something new to represent this I think... > > STATUS1:16 SAG This indicates a sag occurred on one of the phases. User > space appmight signal the user and record this condition to a log file. This is effectively a measurement of our AC voltage dropping? Simple threshold event on the phase voltage I think. > > STATUS1:17 OV This indicates that an over voltage event occurred and a > user space app would signal the user and record this to a log file. Voltage threshold. > > All of these conditions can be masked via the MASK0 and MASK1 registers. > > Not sure how IIO would handle this? Masking is handled via the relevant *_en attributes for the events. > > > > > > >>> > >>>> 0xE504 AIMAV in_currentA_mav R 20 32 ZP U N/A Phase A current mean absolute value computed during PSM0 and PSM1 modes (ADE7868 and ADE7878 only). > >>> Probably a longer name as mav is cryptic. > >>> in_current0_phaseA_meanabs_raw - it could have a scale and all sorts of fun. > >>> So I think this needs to be using the new derived infrastructure proposed here > >>> rather than being an info_mask element. > >> The same way a knowledgeable person understands what RMS means, so they should also understand what MAV means. > > hehe. I know RMS and not MAV so I suspect it a bit dependent on where exactly you came across > > the terms ;) > MAV is just another way to calculate RMS, but is not as accurate. It is just a statistical term, > Mean Absolute Value (MAV). Sure. > > > >>> > >>>> 0xE505 BIMAV in_currentB_mav R 20 32 ZP U N/A Phase B current mean absolute value computed during PSM0 and PSM1 modes (ADE7868 and ADE7878 only). > >>>> 0xE506 CIMAV in_currentC_mav R 20 32 ZP U N/A Phase C current mean absolute value computed during PSM0 and PSM1 modes (ADE7868 and ADE7878 only). > >>>> 0xE507 OILVL register_OILVL R/W 24 32 ZP U 0xFFFFFF Overcurrent threshold. > >>>> 0xE508 OVLVL register_OVLVL R/W 24 32 ZP U 0xFFFFFF Overvoltage threshold. > >>> These presumably result in interrupts? (I'm running out of time so not checking) > >>> In which case standard event interface should work. > >>> > >>>> 0xE509 SAGLVL register_SAGLVL R/W 24 32 ZP U 0x000000 Voltage SAG level threshold. > >>> That's another event I think… > >> Again, this is only setting the threshold, not generating any event. > > > > What does the threshold result it? Presumably an event so this is exposed as a > > control parameter of the event. There is a whole set of ABI for that… > Where can I read about this. Are there any good implementations to help me understand? In a simple case see something like adc/max1363.c There are more complex cases - just grep iio_event_spec. > > > > > >>> > >>>> 0xE50A MASK0 register_MASK0 R/W 32 32 U 0x00000000 Interrupt Enable Register 0. See Table 39. > >>>> 0xE50B MASK1 register_MASK1 R/W 32 32 U 0x00000000 Interrupt Enable Register 1. See Table 40. > >>> > >>>> 0xE50C IAWV in_currentA_instantaneous R 24 32 SE S N/A Instantaneous value of Phase A current. > >>>> 0xE50D IBWV in_currentB_instantaneous R 24 32 SE S N/A Instantaneous value of Phase B current. > >>>> 0xE50E ICWV in_currentC_instantaneous R 24 32 SE S N/A Instantaneous value of Phase C current. > >>>> 0xE50F INWV in_currentN_instantaneous R 24 32 SE S N/A Instantaneous value of neutral current (ADE7868 and ADE7878 only). > >>>> 0xE510 VAWV in_voltageA_instantaneous R 24 32 SE S N/A Instantaneous value of Phase A voltage. > >>>> 0xE511 VBWV in_voltageB_instantaneous R 24 32 SE S N/A Instantaneous value of Phase B voltage. > >>>> 0xE512 VCWV in_voltageC_instantaneous R 24 32 SE S N/A Instantaneous value of Phase C voltage. > >>> OK, this is getting silly. I presume this means the values above are filtered and these > >>> aren't? If so you need to have channels for both and different filter values. > >> These are the actual samples from the ADC and not a calculated measurement over 10/12 cycles. These are the samples that are placed in the buffer. > > OK, so DC values which answers my question above. > > So this is the 'normal' measurement. For the multi cycle ones we need to > > represent them as additional measurements using the index and describe the > > filtering applied to them (or use altvoltage etc to say we are looking > > at measurements related to the fact they are alternating rather than DC. > I answered this above. I think we should remove these registers as I cannot see how anyone would use > them Cool. Even easier. Though if we have a device that will allow us to push these through the buffered interface (rather than the SPI master stuff on here) then we would have the channels, but not export the _RAW attribute - thus making them readable only as a stream of data. > > > >>> > >>>> 0xE513 AWATT in_powerA_instantaneous R 24 32 SE S N/A Instantaneous value of Phase A total active power. > >>>> 0xE514 BWATT in_powerB_instantaneous R 24 32 SE S N/A Instantaneous value of Phase B total active power. > >>>> 0xE515 CWATT in_powerC_instantaneous R 24 32 SE S N/A Instantaneous value of Phase C total active power. > >>>> 0xE516 AVAR in_powerreactiveA_instantaneous R 24 32 SE S N/A Instantaneous value of Phase A total reactive power (ADE7858, ADE7868, and ADE7878 only). > >>>> 0xE517 BVAR in_powerreactiveB_instantaneous R 24 32 SE S N/A Instantaneous value of Phase B total reactive power (ADE7858, ADE7868, and ADE7878 only). > >>>> 0xE518 CVAR in_powerreactiveC_instantaneous R 24 32 SE S N/A Instantaneous value of Phase C total reactive power (ADE7858, ADE7868, and ADE7878 only). > >>>> 0xE519 AVA in_powerapparentA_instantaneous R 24 32 SE S N/A Instantaneous value of Phase A apparent power. > >>>> 0xE51A BVA in_powerapparentB_instantaneous R 24 32 SE S N/A Instantaneous value of Phase B apparent power. > >>>> 0xE51B CVA in_powerappatentC_instantaneous R 24 32 SE S N/A Instantaneous value of Phase C apparent power. > >>> Same for all of these. > >>> > >>>> 0xE51F CHECKSUM register_CHECKSUM R 32 32 U 0x33666787 Checksum verification. See the Checksum Register section for details. > >>> Not exposed to userspace. > >> Yeah, this is only used to check the communication for errors. > >>> > >>>> 0xE520 VNOM in_voltage_rms_nominal R/W 24 32 ZP S 0x000000 Nominal phase voltage rms used in the alternative computation of the apparent power. When the VNOMxEN bit is set, the applied voltage input in the corresponding phase is ignored and all corresponding rms voltage instances are replaced by the value in the VNOM register. > >>> Why would this be done? Sounds like something that is a circuit design time > >>> decision so a job for DT to me. > >> Yeah, I agree. > >>> > >>>> 0xE600 PHSTATUS in_current_phase_peak R 16 16 U N/A Phase peak register. See Table 41. > >>>> 0xE601 ANGLE0 register_ANGLE0 R 16 16 U N/A Time Delay 0. See the Time Interval Between Phases section for details. > >>>> 0xE602 ANGLE1 register_ANGLE1 R 16 16 U N/A Time Delay 1. See the Time Interval Between Phases section for details. > >>>> 0xE603 ANGLE2 register_ANGLE2 R 16 16 U N/A Time Delay 2. See the Time Interval Between Phases section for details. > >>> Hmm. More fun. These are derived values between to phase measurements. > >>> The phase as a modifier falls down a bit here - if we had just treated > >>> them as channels we could have done this a differential angle channel. > >>> Right now I'm not sure how we do this, could do it as a derived values so something like > >>> in_angle0_phaseA&phaseB_diff_raw etc but that feels odd. > >>> This one needs more thought. > >>> > >>>> 0xE604 to 0xE606 Reserved These addresses should not be written for proper operation. > >>>> 0xE607 PERIOD register_PERIOD R 16 16 U N/A Network line period. > >>> Superficially this sounds like a channel free element so shared_by_all. > >>> > >>>> 0xE608 PHNOLOAD register_PHNOLOAD R 16 16 U N/A Phase no load register. See Table 42. > >>> Hmm. So this is kind of a set of events with but without I think an interrupt. > >>> Odd. > >>> > >>>> 0xE60C LINECYC register_LINECYC R/W 16 16 U 0xFFFF Line cycle accumulation mode count. > >>> in_count0_raw probably though it's a bit of a stretch. > >>> > >>>> 0xE60D ZXTOUT register_ZXTOUT R/W 16 16 U 0xFFFF Zero-crossing timeout count. > >>> This is going to be another top level one I think and device specific for now. > >>> > >>>> 0xE60E COMPMODE register_COMPMODE R/W 16 16 U 0x01FF Computation-mode register. See Table 43. > >>> If there is stuff to control in here it need breaking out. > >>> > >>>> 0xE60F Gain register_Gain R/W 16 16 U 0x0000 PGA gains at ADC inputs. See Table 44. > >>> Oh goody another scale value. Needs breaking up into separate controls. > >>> Do these directly effect the measured output voltage etc? If they do then > >>> I'm not sure how to separate the two gains, there ought to be a 'right' > >>> answer. If this is about matching to the circuit present then they > >>> should probably be coming from DT or simillar. > >>> > >>> > >>>> 0xE610 CFMODE register_CFMODE R/W 16 16 U 0x0E88 CFx configuration register. See Table 45. > >>>> 0xE611 CF1DEN register_CF1DEN R/W 16 16 U 0x0000 CF1 denominator. > >>>> 0xE612 CF2DEN register_CF2DEN R/W 16 16 U 0x0000 CF2 denominator. > >>>> 0xE613 CF3DEN register_CF3DEN R/W 16 16 U 0x0000 CF3 denominator. > >>> Are these things that should be in DT? Look very quickly like they are todo with other circuits nearby. > >> Agreed > >>> > >>>> 0xE614 APHCAL register_APHCAL R/W 10 16 ZP S 0x0000 Phase calibration of Phase A. See Table 46. > >>>> 0xE615 BPHCAL register_BPHCAL R/W 10 16 ZP S 0x0000 Phase calibration of Phase B. See Table 46. > >>>> 0xE616 CPHCAL register__CPHCAL R/W 10 16 ZP S 0x0000 Phase calibration of Phase C. See Table 46. > >>> I'm not actually sure how you would set these. Per circuit design? > >> There should be some base calibration stored in DT and fine tuned calibration stored in an INI file or custom eeprom of nvram. > > Hmm. Then we need to expose them to userspace to allow that INI to be applied. > > > > Lets deal with the rest first and come back to these. May well need > > some device specific ABI which is always annoying.. > Agreed > > > >>> > >>>> 0xE617 PHSIGN register_PHSIGN R 16 16 U N/A Power sign register. See Table 47. > >>>> 0xE618 CONFIG register_CONFIG R/W 16 16 U 0x0000 ADE7878 configuration register. See Table 48. > >>>> 0xE700 MMODE register__MMODE R/W 8 8 U 0x1C Measurement mode register. See Table 49. > >>>> 0xE701 ACCMODE register__ACCMODE R/W 8 8 U 0x00 Accumulation mode register. See Table 50. > >>>> 0xE702 LCYCMODE register_LCYCMODE R/W 8 8 U 0x78 Line accumulation mode behavior. See Table 52. > >> All to DT > >>>> 0xE703 PEAKCYC register_PEAKCYC R/W 8 8 U 0x00 Peak detection half line cycles. > >>>> 0xE704 SAGCYC register_SAGCYC R/W 8 8 U 0x00 SAG detection half line cycles. > >>> Some of these are event controls. Map them as such. > >> Agreed > >>> > >>>> 0xE705 CFCYC register_CFCYC R/W 8 8 U 0x01 Number of CF pulses between two consecutive energy latches. See the Synchronizing Energy Registers with CFx Outputs section. > >>>> 0xE706 HSDC_CFG register_HSDC_CFG R/W 8 8 U 0x00 HSDC configuration register. See Table 53. > >> DT > >>>> 0xE707 Version register_Version R 8 8 U Version of die. > >> Might want to expose this to User Space as there could be differences between die version > >> in_version0_raw > >>>> 0xEBFF Reserved 8 8 This address can be used in manipulating the SS/HSA pin when SPI is chosen as the active port. See the Serial Interfaces section for details. > >>>> 0xEC00 LPOILVL register_LPOILVL R/W 8 8 U 0x07 "Overcurrent threshold used during PSM2 mode (ADE7868 and ADE7878 > >>>> only). See Table 54 in which the register is detailed." > >>>> 0xEC01 CONFIG2 register_CONFIG2 R/W 8 8 U 0x00 Configuration register used during PSM1 mode. See Table 55. > >> All to DT > >>> > >>> As you can guess I was running out of stamina towards the end of that. > >>> > >>> I'm not totally sure of the answer I provided. It may take some more thought. > >>> Ideally some others will give input on this question. > >> > >> Thank you again for all your feedback. I’ll generate a new list and send it next. > > Cool. > > > > Jonathan > > > >> > >> Regards, > >> John > >>> > >>> Jonathan > >>>> > >>>> Regards, > >>>> John > >>>> > >>>> > >>>> > >>>> > >>>> > >>>>> On Mar 17, 2018, at 1:30 PM, Jonathan Cameron wrote: > >>>>> > >>>>> On Wed, 14 Mar 2018 23:12:02 -0700 > >>>>> John Syne wrote: > >>>>> > >>>>>> Hi Jonathan, > >>>>>> > >>>>>> I have been looking at the IIO ABI docs and if I understand > >>>>>> correctly, the idea is to use consistent naming conventions? So for > >>>>>> example, looking at the ADE7854 datasheet, the naming matching the > >>>>>> ADE7854 registers would be as follows: > >>>>> > >>>>> Welcome to one of the big reasons no one tidied these drivers > >>>>> up originally. Still we have moved on somewhat since then > >>>>> so similar circumstances have come up in other types of sensor. > >>>>> > >>>>>> > >>>>>> {direction}_{type}_{index}_{modifier}_{info_mask} > >>>>>> > >>>>>> AIGAIN - In_current_a_gain > >>>>> Other than the fact that gain isn't an ABI element and that index > >>>>> doesn't have > >>>>> _ before it that is right. > >>>>> in_voltageA_scale > >>>>> > >>>>> That was a weird quirk a long time back which we should probably > >>>>> not have done (copied it from hwmon) > >>>>> > >>>>>> AVGAIN - in_voltage_a_gain > >>>>>> BIGAIN - in_current_b_gain > >>>>>> BVGAIN - in_voltage_b_gain > >>>>>> — > >>>>>> How do we represent the rms and offset > >>>>>> AIRMSOS - in_current_a_rmsoffset > >>>>>> AVRMSOS - in_voltage_a_rmsoffset > >>>>> > >>>>> Right now we can't unfortunately though this one is easier to fix. > >>>>> We already have modifiers for multi axis devices doing sum_squared > >>>>> so add one of those for root_mean_square - this one is well known > >>>>> enough that rms is fine in the string. > >>>>> > >>>>> It's a effectively a different channel be it one derived from a simple > >>>>> one. This is going to get tricky however as we would normally use > >>>>> modifier to specialise a channel type - thoughts on this below. > >>>>> > >>>>>> — > >>>>>> Here I don’t understand how to represent both the phase and the active/reactive/apparent power components. Do we combine the phase and quadrature part like this > >>>>>> AVAGAIN - in_power_a_gain /* apparent power */ > >>>>>> — > >>>>>> AWGAIN - in_power_ai_gain /* active power */ > >>>>> And that is the problem. How do we represent the various power types. > >>>>> Hmm. We could do it with modifiers but above we show that we have already used them. > >>>>> > >>>>> It would be easy enough to add yet another field to the channel spec to specify > >>>>> this but there is a problem - Events. The event format is already pretty full > >>>>> so where do we put this extra element if we need to define a channel separated > >>>>> only by it. > >>>>> > >>>>> One thought is we could instead define these as different top level > >>>>> IIO_CHAN_TYPES in a similar fashion to we do for relative humidity vs > >>>>> the proposed absolute humidity. > >>>>> > >>>>> in_powerreactiveA_scale > >>>>> in_poweractivceA_scale > >>>>> (or in_powerrealA_scale to match with what I got taught years ago?) > >>>>> > >>>>> I presume we keep in_powerA_scale etc for the apparent power and > >>>>> modify any docs to make that clear. > >>>>> > >>>>>> — > >>>>>> AVARGAIN - in_power_aq_gain /* reactive power */ > >>>>>> — > >>>>>> Now here it becomes more complicated. Not sure how this gets handled. > >>>>>> AFWATTOS - in_power_a_active/fundamental/offset > >>>>> Yeah, some of these are getting odd. > >>>>> If I read this correctly this is the active power estimate based on only > >>>>> the fundamental frequency - so no harmonics? > >>>>> > >>>>> Hmm. This then becomes a separate channel with additional properties > >>>>> specifying it is only the fundamental. This feels a bit like a filter > >>>>> be it an unusual one? Might just be necessary to add a _fundamental_only > >>>>> element on the end (would be info_mask if this is common enough to > >>>>> justify that rather than using the extended methods to define it.). > >>>>> > >>>>> > >>>>>> — > >>>>>> AWATTHR - in_energy_ai_accumulation > >>>>> Great, just when I thought we had gone far enough they define reactive > >>>>> energy which is presumably roughly the same as reactivepower * time? > >>>>> In that case we need types for that as well. > >>>>> in_energyreactiveA_* > >>>>> in_energyactiveA_* > >>>>> > >>>>>> — > >>>>>> AVARHR - in_energy_aq_accumulation > >>>>>> — > >>>>>> IPEAK - in_current_peak > >>>>> That one is easy as we have an info_mask element for peak and one > >>>>> for peak_scale that has always been a bit odd but was needed somewhere. > >>>>> > >>>>>> — > >>>>>> > >>>>>> I’ll leave it there, because there are some even more complicated register naming issues. > >>>>> Something to look forward to. Gah, I always hated power engineering > >>>>> though I taught it very briefly (I really pity those students :( > >>>>> > >>>>> Jonathan > >>>>> > >>>>>> > >>>>>> Regards, > >>>>>> John > >>>>>> > >>>>>> > >>>>>> > >>>>>> > >>>>>> > >>>>>>> On Mar 10, 2018, at 7:10 AM, Jonathan Cameron wrote: > >>>>>>> > >>>>>>> On Thu, 8 Mar 2018 21:37:33 -0300 > >>>>>>> Rodrigo Siqueira wrote: > >>>>>>> > >>>>>>>> On 03/07, Jonathan Cameron wrote: > >>>>>>>>> On Tue, 6 Mar 2018 21:43:47 -0300 > >>>>>>>>> Rodrigo Siqueira wrote: > >>>>>>>>> > >>>>>>>>>> The macro IIO_DEV_ATTR_CH_OFF is a wrapper for IIO_DEVICE_ATTR, with a > >>>>>>>>>> tiny change in the name definition. This extra macro does not improve > >>>>>>>>>> the readability and also creates some checkpatch errors. > >>>>>>>>>> > >>>>>>>>>> This patch fixes the checkpatch.pl errors: > >>>>>>>>>> > >>>>>>>>>> staging/iio/meter/ade7753.c:391: ERROR: Use 4 digit octal (0777) not > >>>>>>>>>> decimal permissions > >>>>>>>>>> staging/iio/meter/ade7753.c:395: ERROR: Use 4 digit octal (0777) not > >>>>>>>>>> decimal permissions > >>>>>>>>>> staging/iio/meter/ade7759.c:331: ERROR: Use 4 digit octal (0777) not > >>>>>>>>>> decimal permissions > >>>>>>>>>> staging/iio/meter/ade7759.c:335: ERROR: Use 4 digit octal (0777) not > >>>>>>>>>> decimal permissions > >>>>>>>>>> > >>>>>>>>>> Signed-off-by: Rodrigo Siqueira > >>>>>>>>> > >>>>>>>>> Hmm. I wondered a bit about this one. It's a correct patch in of > >>>>>>>>> itself but the interface in question doesn't even vaguely conform > >>>>>>>>> to any of defined IIO ABI. Anyhow, it's still and improvement so > >>>>>>>>> I'll take it. > >>>>>>>> > >>>>>>>> I am not sure if I understood the comment about the ABI. The meter > >>>>>>>> interface is wrong because it uses things like IIO_DEVICE_ATTR? It > >>>>>>>> should use iio_info together with *write_raw and *read_raw. Right? Is it > >>>>>>>> the ABI problem that you refer? > >>>>>>> The ABI is about the userspace interface of IIO. It is defined > >>>>>>> in Documentation/ABI/testing/sysfs-bus-iio* > >>>>>>> So this documents the naming of sysfs attributes and (more or less) > >>>>>>> describes a consistent interface to userspace across lots of different > >>>>>>> types of devices. > >>>>>>> > >>>>>>> A lot of these older drivers in staging involve a good deal of ABI that > >>>>>>> was not reviewed or discussed. That is one of the biggest reasons we > >>>>>>> didn't take them out of staging in the first place. > >>>>>>> > >>>>>>> In order for generic userspace programs to have any idea what to do > >>>>>>> with these devices this all needs to be fixed. > >>>>>>> > >>>>>>> There may well be cases where we need to expand the existing ABI to > >>>>>>> cover new things. That's fine, but it has to be done with full > >>>>>>> review of the relevant documentation patches. > >>>>>>> > >>>>>>> Incidentally if you want an easy driver to work on moving out of staging > >>>>>>> then first thing to do is to compare what it shows to userspace with these > >>>>>>> docs. If it's totally different then you have a big job on your hands > >>>>>>> as often ABI can take a lot of discussion and a long time to establish > >>>>>>> a consensus. > >>>>>>> > >>>>>>> Jonathan > >>>>>>> > >>>>>>> > >>>>>>>> > >>>>>>>> Thanks :) > >>>>>>>> > >>>>>>>>> Applied to the togreg branch of iio.git and pushed out as testing > >>>>>>>>> for the autobuilders to play with it. > >>>>>>>>> > >>>>>>>>> I also added the removal of the header define which is no > >>>>>>>>> longer used. > >>>>>>>>> > >>>>>>>>> Please note, following discussions with Michael, I am going to send > >>>>>>>>> an email announcing an intent to drop these meter drivers next > >>>>>>>>> cycle unless someone can provide testing for any attempt to > >>>>>>>>> move them out of staging. I'm still taking patches on the basis > >>>>>>>>> that 'might' happen - but I wouldn't focus on these until we > >>>>>>>>> have some certainty on whether they will be around long term! > >>>>>>>>> > >>>>>>>>> Jonathan > >>>>>>>>> > >>>>>>>>>> --- > >>>>>>>>>> drivers/staging/iio/meter/ade7753.c | 18 ++++++++++-------- > >>>>>>>>>> drivers/staging/iio/meter/ade7759.c | 18 ++++++++++-------- > >>>>>>>>>> 2 files changed, 20 insertions(+), 16 deletions(-) > >>>>>>>>>> > >>>>>>>>>> diff --git a/drivers/staging/iio/meter/ade7753.c b/drivers/staging/iio/meter/ade7753.c > >>>>>>>>>> index c44eb577dc35..275e8dfff836 100644 > >>>>>>>>>> --- a/drivers/staging/iio/meter/ade7753.c > >>>>>>>>>> +++ b/drivers/staging/iio/meter/ade7753.c > >>>>>>>>>> @@ -388,14 +388,16 @@ static IIO_DEV_ATTR_VPERIOD(0444, > >>>>>>>>>> ade7753_read_16bit, > >>>>>>>>>> NULL, > >>>>>>>>>> ADE7753_PERIOD); > >>>>>>>>>> -static IIO_DEV_ATTR_CH_OFF(1, 0644, > >>>>>>>>>> - ade7753_read_8bit, > >>>>>>>>>> - ade7753_write_8bit, > >>>>>>>>>> - ADE7753_CH1OS); > >>>>>>>>>> -static IIO_DEV_ATTR_CH_OFF(2, 0644, > >>>>>>>>>> - ade7753_read_8bit, > >>>>>>>>>> - ade7753_write_8bit, > >>>>>>>>>> - ADE7753_CH2OS); > >>>>>>>>>> + > >>>>>>>>>> +static IIO_DEVICE_ATTR(choff_1, 0644, > >>>>>>>>>> + ade7753_read_8bit, > >>>>>>>>>> + ade7753_write_8bit, > >>>>>>>>>> + ADE7753_CH1OS); > >>>>>>>>>> + > >>>>>>>>>> +static IIO_DEVICE_ATTR(choff_2, 0644, > >>>>>>>>>> + ade7753_read_8bit, > >>>>>>>>>> + ade7753_write_8bit, > >>>>>>>>>> + ADE7753_CH2OS); > >>>>>>>>>> > >>>>>>>>>> static int ade7753_set_irq(struct device *dev, bool enable) > >>>>>>>>>> { > >>>>>>>>>> diff --git a/drivers/staging/iio/meter/ade7759.c b/drivers/staging/iio/meter/ade7759.c > >>>>>>>>>> index 1decb2b8afab..c078b770fa53 100644 > >>>>>>>>>> --- a/drivers/staging/iio/meter/ade7759.c > >>>>>>>>>> +++ b/drivers/staging/iio/meter/ade7759.c > >>>>>>>>>> @@ -328,14 +328,16 @@ static IIO_DEV_ATTR_ACTIVE_POWER_GAIN(0644, > >>>>>>>>>> ade7759_read_16bit, > >>>>>>>>>> ade7759_write_16bit, > >>>>>>>>>> ADE7759_APGAIN); > >>>>>>>>>> -static IIO_DEV_ATTR_CH_OFF(1, 0644, > >>>>>>>>>> - ade7759_read_8bit, > >>>>>>>>>> - ade7759_write_8bit, > >>>>>>>>>> - ADE7759_CH1OS); > >>>>>>>>>> -static IIO_DEV_ATTR_CH_OFF(2, 0644, > >>>>>>>>>> - ade7759_read_8bit, > >>>>>>>>>> - ade7759_write_8bit, > >>>>>>>>>> - ADE7759_CH2OS); > >>>>>>>>>> + > >>>>>>>>>> +static IIO_DEVICE_ATTR(choff_1, 0644, > >>>>>>>>>> + ade7759_read_8bit, > >>>>>>>>>> + ade7759_write_8bit, > >>>>>>>>>> + ADE7759_CH1OS); > >>>>>>>>>> + > >>>>>>>>>> +static IIO_DEVICE_ATTR(choff_2, 0644, > >>>>>>>>>> + ade7759_read_8bit, > >>>>>>>>>> + ade7759_write_8bit, > >>>>>>>>>> + ADE7759_CH2OS); > >>>>>>>>>> > >>>>>>>>>> static int ade7759_set_irq(struct device *dev, bool enable) > >>>>>>>>>> { > >>>>>>>>> > >>>>>>>> -- > >>>>>>>> To unsubscribe from this list: send the line "unsubscribe linux-iio" in > >>>>>>>> the body of a message to majordomo@vger.kernel.org > >>>>>>>> More majordomo info at http://vger.kernel.org/majordomo-info.html > >>>>>>> > >>>>>>> _______________________________________________ > >>>>>>> devel mailing list > >>>>>>> devel@linuxdriverproject.org > >>>>>>> http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel > From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Cyrus-Session-Id: sloti22d1t05-2814319-1521995373-2-13264030920920780263 X-Sieve: CMU Sieve 3.0 X-Spam-known-sender: no X-Spam-score: 0.0 X-Spam-hits: BAYES_00 -1.9, HEADER_FROM_DIFFERENT_DOMAINS 0.25, RCVD_IN_DNSWL_MED -2.3, SPF_PASS -0.001, LANGUAGES en, BAYES_USED global, SA_VERSION 3.4.0 X-Spam-source: IP='140.211.166.133', Host='smtp2.osuosl.org', Country='US', FromHeader='org', MailFrom='org' X-Spam-charsets: plain='utf-8' X-Resolved-to: greg@kroah.com X-Delivered-to: greg@kroah.com X-Mail-from: driverdev-devel-bounces@linuxdriverproject.org ARC-Seal: i=1; a=rsa-sha256; cv=none; d=messagingengine.com; s=arctest; t=1521995369; b=BKKSEre+itaSHuC3VAekzOayHNxOVxHM9AB813dAwxy7qoR Pn2Pme3s9XMiwTkV9/2t0v6mkJEhCqEMbZ1mk5Pmvh7KzRY1MlIouGxkNr5+lzIN WFbC3E/MC6ivCQlTb9bX+A37tohUmjzLRsQZXQYM4gYDmBeVv18PIWb7GwZDdTAJ yAoxBB/XqDnm0v6H20Vxl3GlhppvZx5G9u9HUBnitKrUW4a5B+NOhkUY/5dPD5gE 6Aru8uI5IqkApGTm/jUFn9vBzRy5n/+FEYs2bZAKUwrZSDihyI0DI42LgMCGqrRx M89RcAvyClC7nYp6IezocgPrYVL4k9DNa2nwjRA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=date:from:to:subject:message-id :in-reply-to:references:mime-version:list-id:list-unsubscribe :list-archive:list-post:list-help:list-subscribe:cc:content-type :content-transfer-encoding:sender; s=arctest; t=1521995369; bh=V hcmn5TpMUbvHg52kKKfmVClFwuaUM55aLHU6JkliuQ=; b=DUAkZEH0Ae+5X6Nn3 LixVWGXstwiaVKdKxLjm8In+YKjaQs0AxWAhwWQ8CT1ivmCt7yqqa/tjnt266gJy ZyKnftdSGOLUGeCsJ9hiT5Visxa8NeahnBA05gAiF7no+YFO/J1tptauXZUKLkNS XA/8JWJ2JT97kBpC/xDuJLN5/B648Jhx63YQvWrNiXOVGJQZaQq17qP2AbYwYBPJ wQR9wm6XYbunKk/5nqy08nMqq3KfRB9OvHdZexCyY/SszGcG/5EFlOvGkHS6Zasz CbCqcSWn5W+J8KfZkOJd812nUvdS4RYRRyjjIJ55RBLHyNsJy3QBdD6D2/9Ygv2x NhDww== ARC-Authentication-Results: i=1; mx4.messagingengine.com; arc=none (no signatures found); dkim=none (no signatures found); dmarc=none (p=none,has-list-id=yes,d=none) header.from=kernel.org; iprev=pass policy.iprev=140.211.166.133 (smtp2.osuosl.org); spf=pass smtp.mailfrom=driverdev-devel-bounces@linuxdriverproject.org smtp.helo=hemlock.osuosl.org; x-aligned-from=fail; x-ptr=fail x-ptr-helo=hemlock.osuosl.org x-ptr-lookup=smtp2.osuosl.org; x-return-mx=pass smtp.domain=linuxdriverproject.org smtp.result=pass smtp_is_org_domain=yes header.domain=kernel.org header.result=pass header_is_org_domain=yes; x-tls=pass version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128; x-vs=clean score=-100 state=0 Authentication-Results: mx4.messagingengine.com; arc=none (no signatures found); dkim=none (no signatures found); dmarc=none (p=none,has-list-id=yes,d=none) header.from=kernel.org; iprev=pass policy.iprev=140.211.166.133 (smtp2.osuosl.org); spf=pass smtp.mailfrom=driverdev-devel-bounces@linuxdriverproject.org smtp.helo=hemlock.osuosl.org; x-aligned-from=fail; x-ptr=fail x-ptr-helo=hemlock.osuosl.org x-ptr-lookup=smtp2.osuosl.org; x-return-mx=pass smtp.domain=linuxdriverproject.org smtp.result=pass smtp_is_org_domain=yes header.domain=kernel.org header.result=pass header_is_org_domain=yes; x-tls=pass version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128; x-vs=clean score=-100 state=0 X-ME-VSCategory: clean X-Remote-Delivered-To: driverdev-devel@osuosl.org DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 7899821716 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=jic23@kernel.org Date: Sun, 25 Mar 2018 17:29:11 +0100 From: Jonathan Cameron To: John Syne Subject: Re: meter ABI: (was Re: [PATCH v2 1/3] staging:iio:meter: Replaces IIO_DEV_ATTR_CH_OFF by IIO_DEVICE_ATTR) Message-ID: <20180325172911.39c0e42f@archlinux> In-Reply-To: References: <3af0e5a795059a8418cf08ff29f05f8d5e00da9b.1520382753.git.rodrigosiqueiramelo@gmail.com> <20180307200730.08ed3c2f@archlinux> <20180309003733.aichruo53vqryafg@smtp.gmail.com> <20180310151045.4570e85d@archlinux> <79D3051B-FF2F-4DD3-AF75-F6A4BAD81838@gmail.com> <20180317203037.1093cc11@archlinux> <20180318122312.0d395367@archlinux> <20180324150205.709aa211@archlinux> X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 X-BeenThere: driverdev-devel@linuxdriverproject.org X-Mailman-Version: 2.1.24 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: devel@driverdev.osuosl.org, Lars-Peter Clausen , Michael Hennerich , Rodrigo Siqueira , linux-iio@vger.kernel.org, Greg Kroah-Hartman , linux-kernel@vger.kernel.org, Peter Meerwald-Stadler , Hartmut Knaack , daniel.baluta@nxp.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: driverdev-devel-bounces@linuxdriverproject.org Sender: "devel" X-getmail-retrieved-from-mailbox: INBOX X-Mailing-List: linux-kernel@vger.kernel.org List-ID: T24gU2F0LCAyNCBNYXIgMjAxOCAxNTo0NToyMSAtMDcwMApKb2huIFN5bmUgPGpvaG4zOTA5QGdt YWlsLmNvbT4gd3JvdGU6Cgo+ID4gT24gTWFyIDI0LCAyMDE4LCBhdCA4OjAyIEFNLCBKb25hdGhh biBDYW1lcm9uIDxqaWMyM0BrZXJuZWwub3JnPiB3cm90ZToKPiA+IAo+ID4gT24gTW9uLCAxOSBN YXIgMjAxOCAyMjo1NzoxNiAtMDcwMAo+ID4gSm9obiBTeW5lIDxqb2huMzkwOUBnbWFpbC5jb20+ IHdyb3RlOgo+ID4gICAKPiA+PiBIaSBKb25hdGhhbiwKPiA+PiAKPiA+PiBUaGFuayB5b3UgZm9y IGFsbCB5b3VyIGhhcmQgd29yay4gWW91ciBmZWVkYmFjayBpcyByZWFsbHkgaGVscGZ1bC4gSeKA mW0gc3VycHJpc2VkIHRoYXQgbm8gb25lIGZyb20gQW5hbG9nIERldmljZSBoYXMgb2ZmZXJlZCBh bnkgc3VnZ2VzdGlvbnMuCj4gPj4gICAKPiA+IAo+ID4gU2FkbHkgdGhvc2UgYWN0aXZlIGluIHRo ZSBtYWlubGluZSBsaW51eCBrZXJuZWwgZnJvbSBBREkgYXJlIGZvY3VzZWQgaW4KPiA+IG90aGVy IGFyZWFzIGN1cnJlbnRseSA6KCAgCj4gR29vZCBwb2ludC4gSSB3aWxsIHJlYWNoIG91dCB0byBB bmFsb2cgRGV2aWNlcyBhbmQgZ2V0IGEgbmFtZSBvZiBzb21lb25lIAo+IHdobyBpcyBrbm93bGVk Z2VhYmxlIGluIHRoaXMgYXJlYS4gUGVyaGFwcyBMYXJzLVBldGVycyBoYXMgYSBzdWdnZXN0aW9u LiAKWWVzLCBMYXJzIG9yIE1pY2hhZWwgSGVubmVyaWNoICgrQ0MpIGFyZSBteSBub3JtYWwgY29u dGFjdCBwb2ludHMuCkkgYmVsaWV2ZSB0aGlzIGlzIG91dHNpZGUgYm90aCBvZiB0aGVpciBhcmVh cywgYnV0IHRoZXkgbWF5IGJlIGFibGUgdG8KcHV0IHlvdSBpbiBjb250YWN0IHdpdGggdGhlIHJp Z2h0IHBlcnNvbi4gIElmIG5vdGhpbmcgZWxzZSBpdCB3b3VsZCBiZQpnb29kIHRvIG1ha2Ugc29t ZW9uZSBpbiBBREkgYXdhcmUgdGhhdCBwZW9wbGUgY2FyZSBhYm91dCBsaW51eCBzdXBwb3J0IGZv cgp0aGVzZSBwYXJ0cyEKCj4gPj4gQW55d2F5LCBwbGVhc2Ugc2VlIG15IGNvbW1lbnRzIGlubGlu ZSBiZWxvdwo+ID4+IAo+ID4+IFJlZ2FyZHMsCj4gPj4gSm9obgo+ID4+IAo+ID4+IAo+ID4+IAo+ ID4+IAo+ID4+ICAgCj4gPj4+IE9uIE1hciAxOCwgMjAxOCwgYXQgNToyMyBBTSwgSm9uYXRoYW4g Q2FtZXJvbiA8amljMjNAa2VybmVsLm9yZz4gd3JvdGU6Cj4gPj4+IAo+ID4+PiBPbiBTYXQsIDE3 IE1hciAyMDE4IDIzOjExOjQ1IC0wNzAwCj4gPj4+IEpvaG4gU3luZSA8am9objM5MDlAZ21haWwu Y29tPiB3cm90ZToKPiA+Pj4gICAKPiA+Pj4+IEhpIEpvbmF0aGFuLCAgICAKPiA+Pj4gSGkgSm9o biBhbmQgQWxsLAo+ID4+PiAKPiA+Pj4gSSdkIGxvdmUgdG8gZ2V0IHNvbWUgYWRkaXRpb25hbCBp bnB1dCBvbiB0aGlzIGZyb20gYW55b25lIGludGVyZXN0ZWQuCj4gPj4+IFRoZXJlIGFyZSBhIGxv dCBvZiB3ZWlyZCBhbmQgd29uZGVyZnVsIGRlcml2ZWQgcXVhbnRpdGllcyBpbiBhbiBlbmVyZ3kK PiA+Pj4gbWV0ZXIgYW5kIGl0IHNlZW1zIHdlIG5lZWQgdG8gbWFrZSBzb21lIGZ1bmRhbWVudGFs IGNoYW5nZXMgdG8gc3VwcG9ydAo+ID4+PiB0aGVtIC0gaW5jbHVkaW5nIHBvdGVudGlhbGx5IGEg dXNlcnNwYWNlIGJyZWFraW5nIGNoYW5nZSB0byB0aGUgZXZlbnQKPiA+Pj4gY29kZSBkZXNjcmlw dGlvbi4KPiA+Pj4gICAKPiA+Pj4+IAo+ID4+Pj4gSGVyZSBpcyB0aGUgY29tcGxldGUgbGlzdCBv ZiByZWdpc3RlcnMgZm9yIHRoZSBBREU3ODc4IHdoaWNoIEkgY29waWVkIGZyb20gdGhlIGRhdGEg c2hlZXQuIEkgYWRkZWQgYSBjb2x1bW4g4oCcSUlPIEF0dHJpYnV0ZeKAnSB3aGljaCBJIGhvcGUg Zm9sbG93cyB5b3VyIElJTyBBQkkuIFBsZWFzZSBtYWtlIGFueSBjaGFuZ2VzIHlvdSBmZWVsIGFy ZSBpbmNvcnJlY3QuIEJUVywgdGhlcmUgYXJlIHNldmVyYWwgcmVnaXN0ZXJzIHRoYXQgY2Fubm90 IGJlIGdlbmVyYWxpemVkIGFuZCBhcmUgdXNlZCBwdXJlbHkgZm9yIGNoaXAgY29uZmlndXJhdGlv bi4gSSB0aGluayB3ZSBzaG91bGQgYWRkIGEgbmV3IG5hbWluZyBjb252ZW50aW9uLCBuYW1lbHkg e3JlZ2lzdGVyfV97PGNoaXAtcmVnaXN0ZXItbmFtZT59LiBBbHNvLCBJIHNlZSBpbiB0aGUgc3lz X2J1c19paW8gZG9jICAKCk5vLCByZWdpc3RlcnMgY2FuIGFsd2F5cyBiZSBicm9rZW4gdXAgaW4g dG8gcmVhbCBtZWFuaW5nZnVsIHZhbHVlcyBpZgp0aGV5IGFyZSBleHBvc2VkIHRvIHVzZXJzcGFj ZSBhbmQgdXNlcnNwYWNlIGhhcyBhIHJlYXNvbiB0byB0d2Vhawp0aGVtLgoKV2UgbmV2ZXIgZXhw b3NlIHJhdyByZWdpc3RlcnMgdG8gdXNlcnNwYWNlIGV4Y2VwdCB0aHJvdWdoCmRlYnVnZnMgYW5k IHRoZSBjbHVlIGlzIGluIHRoZSBuYW1lIC0gcHVyZWx5IGZvciBkZWJ1Zy4KCgo+ID4gCj4gPiAK PiA+IAo+ID4gICAKPiA+Pj4+IGluX2FjY2VsX3hfcGVha19yYXcKPiA+Pj4+IAo+ID4+Pj4gc28g c2hvdWxkbuKAmXQgdGhlIHBoYXNlIGJlIHJlcHJlc2VudGVkIGFzIGZvbGxvd3M6Cj4gPj4+PiAK PiA+Pj4+IGluX2N1cnJlbnRfQV9zY2FsZSAgICAKPiA+Pj4gSSdtIHN0aWxsIGNvbmZ1c2VkLiAg V2hhdCBkb2VzIEEgcmVwcmVzZW50IGhlcmU/ICBJIGFzc3VtZWQgdGhhdCB3YXMgYSB3aWxkCj4g Pj4+IGNhcmQgZm9yIHRoZSBjaGFubmVsIG51bWJlciBiZWZvcmUgYnV0IGNsZWFybHkgbm90Lgo+ ID4+PiAKPiA+Pj4gQWgsIHlvdSBhcmUgbGFiZWxsaW5nIHRoZSAzIHNlcGFyYXRlIHBoYXNlcyBh cyBBLCBCIGFuZCBDLiBIbW0uCj4gPj4+IEkgZ3Vlc3MgdGhleSBzb3J0IG9mIGxvb2sgbGlrZSBh eGlzLCBhbmQgc29ydCBvZiBsaWtlIGluZGVwZW5kZW50IGNoYW5uZWxzLgo+ID4+PiBTbyBjb3Vs ZCBiZSBpbmRleGVkIG9yIGRvbmUgdmlhIG1vZGlmaWVycyBkZXBlbmRpbmcgb24gaG93IHlvdSBs b29rIGF0IGl0LiAgICAKPiA+PiBJbiBtZXRlcmluZyB0ZXJtaW5vbG9neSwgdGhlIHRocmVlIHBo YXNlcyBhcmUgY29tbW9ubHkgcmVmZXJyZWQgdG8gYXMgUkVELCBHUkVFTiwgQkxVRSBvciBQaGFz ZUEsIFBoYXNlQiwgUGhhc2VDIGFuZCBOZXV0cmFsLiBBbmFsb2cgRGV2aWNlcyB1c2VzIHRoZSBB QkNOIG5vbWVuY2xhdHVyZSBzbyBhbnlvbmUgdXNpbmcgdGhpcyBkcml2ZXIgd2lsbCBwcm9iYWJs eSBoYXZlIHJlZmVyZW5jZWQgdGhlIEFuYWxvZyBEZXZpY2VzIGRhdGFzaGVldCBzbyB0aGlzIHRl cm1pbm9sb2d5IHNob3VsZCBiZSBmYW1pbGlhci4gICAKPiA+IFdoaWNoIGlzIG1vcmUgY29tbW9u bHkgdXNlZCBpbiBnZW5lcmFsPyAgV2UgYXJlIGRlc2lnbmluZyB3aGF0IHdlIGhvcGUKPiA+IHdp bGwgYmUgYSBnZW5lcmFsIGludGVyZmFjZSBhbmQgbGFzdCB0aGluZyB3ZSB3YW50IGlzIHRvIGhh dmUgZXZlcnlvbmUKPiA+IG5vdCB1c2luZyBBREkgcGFydHMgY29uZnVzZWQhICBQZXJzb25hbGx5 IG5vdCBhc3NpZ25pbmcgJ2NvbG91cnMnIG1ha2VzCj4gPiBtb3JlIHNlbnNlIHRvIG1lLiAgCj4g SSBkaWQgYSBsaXR0bGUgcmVzZWFyY2ggYW5kIGhlcmUgaXMgdGhlIG5hbWluZyB1c2VkIGJ5IHZl bmRvcjoKPiAKPiBTVCBNaWNyb2VsZWN0cm9uaWNzOiBQMSwgUDIsIFAzLCBOCj4gaHR0cDovL3d3 dy5zdC5jb20vY29udGVudC9jY2MvcmVzb3VyY2UvdGVjaG5pY2FsL2RvY3VtZW50L2FwcGxpY2F0 aW9uX25vdGUvNWUvZjQvMjIvNGQvOTAvOTYvNGMvYzQvQ0QwMDE1MzI2NC5wZGYvZmlsZXMvQ0Qw MDE1MzI2NC5wZGYvamNyOmNvbnRlbnQvdHJhbnNsYXRpb25zL2VuLkNEMDAxNTMyNjQucGRmCj4g Cj4gVGVyaWRpYW46IEFCQ04KPiBodHRwczovL3d3dy5tb3VzZXIuY29tL2RzLzIvMjU2LzcxTTY1 MTMtNzFNNjUxM0gtMjI2MDMucGRmCj4gCj4gTWF4aW0gSW50ZWdyYXRlZDogQUJDTgo+IGh0dHBz Oi8vZGF0YXNoZWV0cy5tYXhpbWludGVncmF0ZWQuY29tL2VuL2RzLzc4TTY2MzEucGRmCj4gCj4g TWljcm9jaGlwOiBBQkNOCj4gaHR0cDovL3d3MS5taWNyb2NoaXAuY29tL2Rvd25sb2Fkcy9lbi9E ZXZpY2VEb2MvNTE2NDNiLnBkZgo+IAo+IE5YUDogTDEsIEwyLCBMMywgTgo+IGh0dHBzOi8vd3d3 Lm54cC5jb20vc3VwcG9ydC9kZXZlbG9wZXItcmVzb3VyY2VzL3JlZmVyZW5jZS1kZXNpZ25zL2tp bmV0aXMta20zeC0yNTYtbWN1LXRocmVlLXBoYXNlLW1ldGVyaW5nLXJlZmVyZW5jZS1kZXNpZ246 UkQtS00zeC0yNTYtM1BILU1FVEVSSU5HCj4gCj4gUmVuZXNhczogQUJDTgo+IGh0dHBzOi8vd3d3 LnJlbmVzYXMuY29tL2VuLXVzL3NvbHV0aW9ucy9ob21lL21ldGVyaW5nL3Bvd2VyLW1ldGVyLXRo cmVlLmh0bWwKPiAKPiBTbyB0aGUgbW9zdCBjb25zaXN0ZW50IHdvdWxkIGJlIEFCQ04KQ29vbC4g ICBNYWtlcyBzZW5zZSB0byBnbyB3aXRoIHRoYXQuICBUaGFua3MgZm9yIGNoZWNraW5nIHRoaXMg b3V0LgoKPiAKPiAKPiBBbGwgdmVuZG9yIHByb3ZpZGluZyB0aHJlZSBwaGFzZSBlbmVyZ3kgbWV0 ZXJpbmcgSUNzIHVzZSB0aGUgQUJDTiB0ZXJtaW5vbG9neS4gCj4gPiAKPiA+IChidHcgcGxlYXNl IHdyYXAgYW55IGxpbmVzIHRoYXQgZG9uJ3QgbmVlZCB0byBiZSBsb25nIHRvIGFyb3VuZCA4MCBj aGFyYWN0ZXJzKS4KPiA+ICAgCj4gPj4+IAo+ID4+PiBIbW0uIFdpdGggbmV1dHJhbCBpbiB0aGVy ZSBhcyB3ZWxsIEkgZ3Vlc3Mgd2UgbmVlZCB0byBtYWtlIHRoZW0KPiA+Pj4gbW9kaWZpZXJzIChi dXQgbWlnaHQgY2hhbmdlIG15IG1pbmQgbGF0ZXIgOykKPiA+Pj4gCj4gPj4+IFBhcnRpY3VsYXJs eSBhcyB3ZSBhcmUgdXNpbmcgdGhlIHRoZSBtb2RpZmllciBmb3IgUk1TIHVuZGVyIHRoZSBwcmV2 aW91cwo+ID4+PiBwbGFuLi4uIEl0IGFwcGVhcnMgd2Ugc2hvdWxkIHRyZWF0IHRoYXQgaW5zdGVh ZCBsaWtlIHdlIGRpZCBmb3IgcGVhawo+ID4+PiBhbmQgZG8gaXQgYXMgYW4gYWRkaXRpb25hbCBp bmZvIG1hc2sgZWxlbWVudC4gIFRoZSBwcm9ibGVtIHdpdGggZG9pbmcgdGhhdAo+ID4+PiBvbiBh IGNvbnRpbnVvdXMgbWVhc3VyZW1lbnQgaXMgdGhhdCB3ZSBjYW4ndCB0cmVhdCBpdCBhcyBhIGNo YW5uZWwgdG8KPiA+Pj4gYmUgb3V0cHV0IHRocm91Z2ggdGhlIGJ1ZmZlcmVkIGludGVyZmFjZS4g ICAgCj4gPj4gSeKAmXZlIGNoYW5nZWQgdGhlIGxheW91dCBvZiB0aGUgc3ByZWFkc2hlZXQgdG8g YnJlYWtvdXQgdGhlIERpcmVjdGlvbiwgVHlwZSwgSW5kZXgsIE1vZGlmaWVyIGFuZCBJbmZvIE1h c2sgdG8gbWFrZSBzdXJlIHRoZXJlIGlzIG5vIG1pc3MtdW5kZXJzdGFuZGluZyBhbmQgd2lsbCBo ZWxwIGlkZW50aWZ5IGFsbCB0aGUgaXRlbXMgd2UgbmVlZCB0byBhZGQuCj4gPj4gCj4gPj4gVGhl IEFERTc4NzggY2hhbm5lbHMgdGhhdCB3aWxsIHVzZSB0aGUgYnVmZmVyIGFyZSBJQVdWLCBWQVdW LCBJQldWLCBWQldWLCBJQ1dWLCBWQ1dWLCBJTldWLCBBVkEsIEJWQSwgQ1ZBLCBBV0FUVCwgQldB VFQsIENXQVRULCBBVkFSLCBCVkFSLCBhbmQgQ1ZBUi4gU28gSSBndWVzcyB3ZSBoYXZlIHRvIGFk ZCBhbiBpbmRleCAgCj4gPiBQcm9iYWJseSBhIGdvb2QgaWRlYSBhbnl3YXksIHdlIGFyZSBzb3J0 IG9mIHNsb3dseSBtb3ZpbmcgYXdheQo+ID4gZnJvbSBpbmRleCBsZXNzIGNoYW5uZWxzLiAgVGhl IEFCSSBhbHdheXMgYWxsb3dlZCBpbmRleCBhc3NpZ25tZW50Cj4gPiBhbmQgaXQgbWFrZXMgZm9y IGVhc2llciB1c2Vyc3BhY2UgY29kZS4KPiA+ICAgCj4gPj4gCj4gPj4gQWRkcmVzcyBSZWdpc3Rl ciAJSUlPIEF0dHJpYnV0ZQkJCQkJCQlEaXIJVHlwZQkJSW5kZXggCU1vZGlmaWVyCUluZm8gTWFz awlSL1cJQml0CQlCaXQgTGVuZ3RoCVR5cGUJRGVmYXVsdAlEZXNjcmlwdGlvbiAKPiA+PiAJCQkJ CQkJCQkJCQkJCQkJCQkJCQkJCQkJTGVuZ3RoIAlEdXJpbmcgQ29tbQkJCVZhbHVlCQo+ID4+IDB4 RTUwQwlJQVdWCWluX2N1cnJlbnQwX3BoYXNlQV9pbnN0YW50YW5lb3VzCQlpbgljdXJyZW50CQkJ MAlwaGFzZUEJaW5zdGFudGFuZW91cwlSCTI0CQkzMiBTRQkJUwkJTi9BCQlJbnN0YW50YW5lb3Vz IHZhbHVlIG9mIFBoYXNlIEEgY3VycmVudC4gIAo+ID4gCj4gPiBJJ20gdW5jb252aW5jZWQgYnkg Imluc3RhbnRhbmVvdXMiLiAgVGhhdCBpcyB0aGUgZGVmYXVsdCBhc3N1bXB0aW9uIHRoYXQgeW91 IGFyZQo+ID4gbWVhc3VyaW5nIGN1cnJlbnQgYXQgdGhpcyBwb2ludCBpbiB0aW1lLiAgSSdtIHN0 aWxsIGNvbmZ1c2VkIG9uIHdoYXQgdGhpcyBhY3R1YWxseQo+ID4gaXMuIElzIGl0IGVmZmVjdGl2 ZWx5IHRoZSBEQyBjdXJyZW50PyBJLmUuIHRoZSB3YXZlIGZvcm0gdmFsdWUgZm9yIGN1cnJlbnQ/ IAo+ID4gWW91IGFuc3dlciB0aGlzIGJlbG93LiAgVGhleSBhcmUgREMgbWVhc3VyZW1lbnRzLi4g IAo+IE5vLCB0aGV5IGFyZSB0aGUgb3V0cHV0IG9mIHRoZSBBREMgYXQgYSBwb2ludCBpbiB0aW1l LiBUaGUgQURDIHNhbXBsZXMgCj4gY29udGludW91cyBhdCA4LDAwMCBzYW1wbGVzIHBlciBzZWNv bmQsIHNvIHdoZW4geW91IHJlYWQgdGhpcyByZWdpc3Rlcgo+IHlvdSBhcmUgZ2V0dGluZyB0aGUg c2FtcGxlIG1lYXN1cmVkIGp1c3QgYmVmb3JlIHlvdXIgcmVhZC4gSSBkb27igJl0IGtub3cKPiB3 aHkgYW55b25lIHdvdWxkIHJlYWQgdGhpcyByZWdpc3Rlci4gVGhlIHNhbXBsZXMgYXJlIHN0cmVh bWVkIHZpYQo+IHRoZSBTUEkgaW50ZXJmYWNlLCB3aXRoIElBV1YsIFZBV1YsIElCV1YsIFZCV1Ys IElDV1YsIFZDV1YsIElOV1YsIAo+IEFWQSwgQlZBLCBDVkEsIEFXQVRULCBCV0FUVCwgQ1dBVFQs IEFWQVIsIEJWQVIsIGFuZCBDVkFSIHRyYW5zbWl0dGVkIAo+IGV2ZXJ5IDEyNXVTLiBQcm9iYWJs eSBiZXR0ZXIgbm90IHRvIGV4cG9zZSB0aGVzZSByZWdpc3RlcnMgdG8gdXNlciBzcGFjZS4KSSdt IGhhcHB5IG5vdCB0byBleHBvc2UgdGhlbSwgYnV0IGlmIHRoZXkgYXJlIHRoZSBpbnN0YW50YW5l b3VzIHZhbHVlcwp0aGV5IGFyZSB3aGF0IEkgbWVhbiBieSBEQyB2YWx1ZXMsIGxpdGVyYWxseSB0 aGUgbnVtYmVyIHlvdSB3b3VsZApzZWUgb24gYW4gb3NjaWxsb3Njb3BlIGlmIHlvdSB3ZXJlIHRv IHByb2JlIHRoZW0uCgo+IAo+IAo+ID4gCj4gPiBXaGljaCBhY3R1YWxseSByYWlzZXMgYSBwb2lu dCBJJ2QgZm9yZ290dGVuLiAgV2UgaGF2ZSBhbiBleHBsaWNpdCB0eXBlIAo+ID4gZm9yIGFsdHZv bHRhZ2UgKGRlZmluZWQgZm9yIEREUyBkZXZpY2VzIGFzIHRoZSB3YXZlZm9ybSBhbXBsaXR1ZGUg SUlSQykuCj4gPiBXZSBzaG91bGQgYmUgY29uc2lzdGVudCB3aXRoIHRoYXQgaWYgcG9zc2libGUu Cj4gPiAKPiA+IFNvIEkgdGhpbmsgdGhpcyBzaG91bGQgYmUuCj4gPiBpbl9jdXJyZW50MF9waGFz ZUFfcmF3ICAKPiBZZWFoLCB0aGF0IHNvdW5kcyBjb3JyZWN0LCB3aGljaCByZW1pbmRzIG1lIG9m IGFub3RoZXIgaXNzdWUgdGhhdCBkb2VzIG5vdCBtYWtlCj4gc2Vuc2UuIFRvIG1lLCBnYWluIGlz IHNvbWV0aGluZyB0aGF0IGlzIGhhcmR3YXJlIHJlbGF0ZWQgYW5kIGlzIHVzZWQgdG8gbWFnbmlm eSAKPiBhbiBpbnB1dCBzaWduYWwgb3IgaXMgdXNlZCB0byBjYWxpYnJhdGUgYSBtZWFzdXJlbWVu dC4gU2NhbGUgb24gdGhlIG90aGVyIGhhZCBpcyAKPiBzb21ldGhpbmcgdGhhdCBpcyB1c2VkIHRv IGNvbnZlcnQgYSByYXcgbWVhc3VyZW1lbnQgaW50byBzb21ldGhpbmcgdGhhdCBpcyBtb3JlIAo+ IG1lYW5pbmdmdWwsIHN1Y2ggYXMgMHg4MjAwMDAgPSAyMjBWLiBTbyBldmVyeXdoZXJlIHdlIGhh dmUgdXNlZCBzY2FsZSBhbmQgZ2FpbiAKPiBpbnRlcmNoYW5nZWFibGUgaXMgY29uZnVzaW5nLgoK QWdyZWVkIC0gdXAgdG8gYSBwb2ludC4gIElmIHlvdSBoYXZlIGEgaGFyZHdhcmUgZ2FpbiBjb250 cm9sIHdoaWNoIGZvciB3aGF0ZXZlcgpyZWFzb24gcmVzdWx0cyBpbiBhIGRpZmZlcmVudCBzY2Fs aW5nIG5lZWRpbmcgdG8gYmUgYXBwbGllZCB0byBnbyBmcm9tIHVzZXJzcGFjZQp2YWx1ZSB0byBy ZWFsIHdvcmxkIHZhbHVlIChzb21ldGltZXMgaGFwcGVucyB3aXRoIG11bHRpIHJhbmdlIGRldmlj ZXMpIHRoZW4gd2UKZXhwb3NlIGl0IG9ubHkgb25jZSAtIGFzIHNjYWxlLgoKV2UgaGF2ZSBoYXJk d2FyZWdhaW4gYW5kIGNhbGliZ2FpbiBmb3IgdHdlYWtpbmcgdGhlIGdhaW4gdG8gYWNjb3VudCBm b3IgY2FzZXMKd2hlcmUgaXQgaXNuJ3QgYXBwYXJlbnQgaW4gdGhlIG91dHB1dCB2YWx1ZSAoaGFy ZHdhcmUgZ2FpbiAtIG5vcm1hbGx5IHVzZWQKd2hlbiB3ZSBhcmUgbWVhc3VyaW5nIHNvbWV0aGlu ZyBhYm91dCB0aGUgc2lnbmFsIHRoYXQgaXNuJ3QgaXQncyBtYWduaXR1ZGUpLApvciBpcyBjb21w ZW5zYXRpbmcgZm9yIGluYWNjdXJhY2llcyBpbiB0aGUgY2lyY3VpdHJ5IG9yIHNlbnNvciAoY2Fs aWJnYWluKQo+IAo+ID4gZXRjCj4gPiBBIGNoYW5uZWwgY2FuIGJlIHVuaXF1ZWx5IGlkZW50aWZp ZWQgdXNpbmcgaW5kZXggYW5kIG1vZGlmaWVyIGFzIGFzIHBhaXIgKGlmIHdlIGFkZAo+ID4gdGhl IG5ldyBmaWVsZCBmb3IgY29tcHV0YXRpb24gYXBwbGllZCB0aGF0IHdpbGwgYWxzbyBhbGxvdyBz ZXBhcmF0ZSBpZGVudGlmaWNhdGlvbikuCj4gPiBTbyB0aGUgbGF0ZXIgY2hhbm5lbHMgY2FuIGJl Lgo+ID4gCj4gPiBpbl9jdXJyZW50MF9waGFzZUJfcmF3IGV0Ywo+ID4gCj4gPiBJbmRleGVzIGNh biBiZSBzaGFyZWQgYnkgZGlmZmVyZW50IHR5cGVzIGFzIHdlbGwuICBPZnRlbiBkb25lIHRvIGFz c29jaWF0ZQo+ID4gZGlmZmVyZW50IG1lYXN1cmVtZW50cyBvZiB0aGUgc2FtZSBzaWduYWwgKHRo b3VnaCB0aGUgQUJJIGRvZXNuJ3Qgc3BlY2lmeQo+ID4gdGhhdCkuCj4gPiAgIAo+ID4+IDB4RTUw RAlJQldWCWluX2N1cnJlbnQxX3BoYXNlQl9pbnN0YW50YW5lb3VzCQlpbgljdXJyZW50CQkJMQlw aGFzZUIJaW5zdGFudGFuZW91cwlSCTI0CQkzMiBTRQkJUwkJTi9BCQlJbnN0YW50YW5lb3VzIHZh bHVlIG9mIFBoYXNlIEIgY3VycmVudC4KPiA+PiAweEU1MEUJSUNXVglpbl9jdXJyZW50Ml9waGFz ZUNfaW5zdGFudGFuZW91cwkJaW4JY3VycmVudAkJCTIJcGhhc2VDCWluc3RhbnRhbmVvdXMJUgky NAkJMzIgU0UJCVMJCU4vQQkJSW5zdGFudGFuZW91cyB2YWx1ZSBvZiBQaGFzZSBDIGN1cnJlbnQu Cj4gPj4gMHhFNTBGCUlOV1YJaW5fY3VycmVudDNfcGhhc2VOX2luc3RhbnRhbmVvdXMJCWluCWN1 cnJlbnQJCQkzCW5ldXRyYWwJaW5zdGFudGFuZW91cwlSCTI0CQkzMiBTRQkJUwkJTi9BCQlJbnN0 YW50YW5lb3VzIHZhbHVlIG9mIG5ldXRyYWwgY3VycmVudCAoQURFNzg2OCBhbmQgQURFNzg3OCBv bmx5KS4gIAo+ID4gaW5fdm9sdGFnZTBfcGhhc2VBX3Jhdwo+ID4gICAKPiA+PiAweEU1MTAJVkFX Vglpbl92b2x0YWdlNF9waGFzZUFfaW5zdGFudGFuZW91cwkJaW4Jdm9sdGFnZQkJCTQJcGhhc2VB CWluc3RhbnRhbmVvdXMJUgkyNAkJMzIgU0UJCVMJCU4vQQkJSW5zdGFudGFuZW91cyB2YWx1ZSBv ZiBQaGFzZSBBIHZvbHRhZ2UuCj4gPj4gMHhFNTExCVZCV1YJaW5fdm9sdGFnZTVfcGhhc2VCX2lu c3RhbnRhbmVvdXMJCWluCXZvbHRhZ2UJCQk1CXBoYXNlQglpbnN0YW50YW5lb3VzCVIJMjQJCTMy IFNFCQlTCQlOL0EJCUluc3RhbnRhbmVvdXMgdmFsdWUgb2YgUGhhc2UgQiB2b2x0YWdlLgo+ID4+ IDB4RTUxMglWQ1dWCWluX3ZvbHRhZ2U2X3BoYXNlQ19pbnN0YW50YW5lb3VzCQlpbgl2b2x0YWdl CQkJNglwaGFzZUMJaW5zdGFudGFuZW91cwlSCTI0CQkzMiBTRQkJUwkJTi9BCQlJbnN0YW50YW5l b3VzIHZhbHVlIG9mIFBoYXNlIEMgdm9sdGFnZS4KPiA+PiAweEU1MTMJQVdBVFQJaW5fcG93ZXI3 X3BoYXNlQV9pbnN0YW50YW5lb3VzCQkJaW4JcG93ZXIJCQk3CXBoYXNlQQlpbnN0YW50YW5lb3Vz CVIJMjQJCTMyIFNFCQlTCQlOL0EJCUluc3RhbnRhbmVvdXMgdmFsdWUgb2YgUGhhc2UgQSB0b3Rh bCBhY3RpdmUgcG93ZXIuCj4gPj4gMHhFNTE0CUJXQVRUCWluX3Bvd2VyOF9waGFzZUJfaW5zdGFu dGFuZW91cwkJCWluCXBvd2VyCQkJOAlwaGFzZUIJaW5zdGFudGFuZW91cwlSCTI0CQkzMiBTRQkJ UwkJTi9BCQlJbnN0YW50YW5lb3VzIHZhbHVlIG9mIFBoYXNlIEIgdG90YWwgYWN0aXZlIHBvd2Vy Lgo+ID4+IDB4RTUxNQlDV0FUVAlpbl9wb3dlcjlfcGhhc2VDX2luc3RhbnRhbmVvdXMJCQlpbglw b3dlcgkJCTkJcGhhc2VDCWluc3RhbnRhbmVvdXMJUgkyNAkJMzIgU0UJCVMJCU4vQQkJSW5zdGFu dGFuZW91cyB2YWx1ZSBvZiBQaGFzZSBDIHRvdGFsIGFjdGl2ZSBwb3dlci4gIAo+ID4gaW5fcG93 ZXIwX3BoYXNlQ19yYXcKPiA+ICAgCj4gPj4gMHhFNTE2CUFWQVIJaW5fcG93ZXJyZWFjdGl2ZTEw X3BoYXNlQV9pbnN0YW50YW5lb3VzCWluCXBvd2VycmVhY3RpdmUJCTEwCXBoYXNlQQlpbnN0YW50 YW5lb3VzCVIJMjQJCTMyIFNFCQlTCQlOL0EJCUluc3RhbnRhbmVvdXMgdmFsdWUgb2YgUGhhc2Ug QSB0b3RhbCByZWFjdGl2ZSBwb3dlciAoQURFNzg1OCwgQURFNzg2OCwgYW5kIEFERTc4Nzggb25s eSkuICAKPiA+IGluX3Bvd2VycmVhY3RpdmUwX3BoYXNlQV9yYXcgZXRjICAKPiA+PiAweEU1MTcJ QlZBUglpbl9wb3dlcnJlYWN0aXZlMTFfcGhhc2VCX2luc3RhbnRhbmVvdXMJaW4JcG93ZXJyZWFj dGl2ZQkJMTEJcGhhc2VCCWluc3RhbnRhbmVvdXMJUgkyNAkJMzIgU0UJCVMJCU4vQQkJSW5zdGFu dGFuZW91cyB2YWx1ZSBvZiBQaGFzZSBCIHRvdGFsIHJlYWN0aXZlIHBvd2VyIChBREU3ODU4LCBB REU3ODY4LCBhbmQgQURFNzg3OCBvbmx5KS4KPiA+PiAweEU1MTgJQ1ZBUglpbl9wb3dlcnJlYWN0 aXZlMTJfcGhhc2VDX2luc3RhbnRhbmVvdXMJaW4JcG93ZXJyZWFjdGl2ZQkJMTIJcGhhc2VDCWlu c3RhbnRhbmVvdXMJUgkyNAkJMzIgU0UJCVMJCU4vQQkJSW5zdGFudGFuZW91cyB2YWx1ZSBvZiBQ aGFzZSBDIHRvdGFsIHJlYWN0aXZlIHBvd2VyIChBREU3ODU4LCBBREU3ODY4LCBhbmQgQURFNzg3 OCBvbmx5KS4KPiA+PiAweEU1MTkJQVZBCQlpbl9wb3dlcmFwcGFyZW50MTNfcGhhc2VBX2luc3Rh bnRhbmVvdXMJaW4JcG93ZXJhcHBhcmVudAkxMwlwaGFzZUEJaW5zdGFudGFuZW91cwlSCTI0CQkz MiBTRQkJUwkJTi9BCQlJbnN0YW50YW5lb3VzIHZhbHVlIG9mIFBoYXNlIEEgYXBwYXJlbnQgcG93 ZXIuCj4gPj4gMHhFNTFBCUJWQQkJaW5fcG93ZXJhcHBhcmVudDE0X3BoYXNlQl9pbnN0YW50YW5l b3VzCWluCXBvd2VyYXBwYXJlbnQJMTQJcGhhc2VCCWluc3RhbnRhbmVvdXMJUgkyNAkJMzIgU0UJ CVMJCU4vQQkJSW5zdGFudGFuZW91cyB2YWx1ZSBvZiBQaGFzZSBCIGFwcGFyZW50IHBvd2VyLgo+ ID4+IDB4RTUxQglDVkEJCWluX3Bvd2VyYXBwYXRlbnQxNV9waGFzZUNfaW5zdGFudGFuZW91cwlp bglwb3dlcmFwcGFyZW50CTE1CXBoYXNlQwlpbnN0YW50YW5lb3VzCVIJMjQJCTMyIFNFCQlTCQlO L0EJCUluc3RhbnRhbmVvdXMgdmFsdWUgb2YgUGhhc2UgQyBhcHBhcmVudCBwb3dlci4KPiA+PiAK PiA+PiBUaGUgQURFOTAwMCBjaGFubmVscyB0aGF0IHVzZSB0aGUgYnVmZmVyIGFyZSBJQSwgVkEs IElCLCBWQiwgSUMsIFZDIGFuZCBJTiAgCj4gPj4+IAo+ID4+PiBTbyBhZ2FpbiB3ZSBoYXZlIHJ1 biBvdXQgb2Ygc3BhY2UuIEl0J3MgaW5jcmVhc2luZ2x5IGxvb2tpbmcgbGlrZSB3ZSBuZWVkCj4g Pj4+IHJvb20gZm9yIGFub3RoZXIgZmllbGQgaW4gdGhlIGV2ZW50cyAtIHRvIGNsZWFubHkgcmVw cmVzZW50IGNvbXB1dGVkIHZhbHVlcy4KPiA+Pj4gCj4gPj4+IEhtbS4gV2hhdCBpcyB0aGUgY3Vy cmVudCB1c2FnZT8gLSBpdCdzIGJlZW4gYSB3aGlsZSBzbyBJIGhhZCB0byBnbwo+ID4+PiBsb29r IGluIHRoZSBoZWFkZXIuCj4gPj4+IAo+ID4+PiAwLTE1IENoYW5uZWwgKGxvdHMgb2YgY2hhbm5l bHMpCj4gPj4+IDMxLTE2IENoYW5uZWwgMiAgKDM2IG1vZGlmaWVycyAtIGxvdHMgb2YgY2hhbm5l bHMpCj4gPj4+IDQ3LTMyIENoYW5uZWwgVHlwZSAoMzEgdXNlZCBzbyBmYXIgLSB0aGlzIGxvb2tz IG1vc3QgbGlrZWx5IHRvIHJ1biBvdXQgb2YKPiA+Pj4gc3BhY2UgaW4gdGhlIGxvbmcgcnVuIHNv IGxlYXZlIHRoaXMgb25lIGFsb25lKS4KPiA+Pj4gNTQtNDggRXZlbnQgRGlyZWN0aW9uICg0IHVz ZWQpCj4gPj4+IDU1IERpZmZlcmVudGlhbCAgKDE6IGNoYW5uZWwgMiBhcyBkaWZmZXJlbnRpYWwg cGFpciAwOiBhcyBhIG1vZGlmaWVyKQo+ID4+PiA2My01NiBFdmVudCBUeXBlICg2IHVzZWQpCj4g Pj4+IAo+ID4+PiBTbyBJIHRoaW5rIHdlIGNhbiBwaW5jaCBiaXQgNTMgYXMgYW5vdGhlciBmbGFn IHRvIGluZGljYXRlIHdlIGhhdmUKPiA+Pj4gYSBjb21wdXRlZCB2YWx1ZSBvciBwb3NzaWJseSBi aXQgNjMgYXMgZXZlbnQgdHlwZXMgYXJlIGZldyBhbmQKPiA+Pj4gZmFyIGJldHdlZW4gYXMgd2Vs bC4KPiA+Pj4gCj4gPj4+IFByb2JhYmx5IHJlYXNvbmFibGUgdG8gYXNzdW1lIHdlIG5ldmVyIGhh dmUgMTYgYml0cyB3b3J0aAo+ID4+PiBvZiBjaGFubmVscyBhbmQgY29tcHV0ZWQgY2hhbm5lbHMg YXQgdGhlIHNhbWUgdGltZT8KPiA+Pj4gSGVuY2UgSSB0aGluayB3ZSBjYW4gc3RlYWwgYml0cyBv ZmYgdGhlIHRvcCBvZiBDaGFubmVsLgo+ID4+PiBIb3cgbWFueSBkbyB3ZSBuZWVkPyAgTm90IHN1 cmUgdW5mb3J0dW5hdGVseSBidXQgZmVlbHMgbGlrZQo+ID4+PiA4IHNob3VsZCBiZSBwbGVudHku ICAgIAo+ID4+IFdoZW4geW91IHNwZWFrIG9mIENoYW5uZWxzIGhlcmUsIGFyZSB5b3UgcmVmZXJy aW5nIHRvIG1lYXN1cmVtZW50cyB0aGF0IHdpbGwgdXNlIHRoZSBidWZmZXI/IEV2ZW4gd2hlbiBj b3VudGluZyBhbGwgdGhlIElJTyBhdHRyaWJ1dGVzLCB0aGUgQURFOTAwMCBoYXMgNDYyIHJlZ2lz dGVycywgYW5kIG5vdCBhbGwgb2YgdGhvc2Ugd291bGQgYmUgZGVmaW5lZCBhcyBhdHRyaWJ1dGVz LiBJIHRoaW5rIDggQml0cyBzaG91bGQgYmUgbW9yZSB0aGFuIGVub3VnaC4gIAo+ID4gTm90IHF1 aXRlLiAgVGhpcyBpcyBhbGwgYWJvdXQgYWxsb3dpbmcgdXMgdG8gZGlmZmVyZW50aWF0ZSBiZXR3 ZWVuCj4gPiB0aGUgYWN0dWFsIGNoYW5uZWxzIHdoZXJlIGEgY2hhbm5lbCBpcyBhIHNpbmdsZSBt ZWFzdXJlbWVudCB0aGF0IHdlCj4gPiBhcmUgaW50ZXJlc3RlZCBpbi4gCj4gPiBTbyB3ZSBjYXJl IGFib3V0IDI1NiBtZWFzdXJlbWVudHMgdGhhdCBhcmUgb3RoZXJ3aXNlIGluZGlzdGluZ3Vpc2hh YmxlCj4gPiB1c2luZyBjb21iaW5hdGlvbiBvZiBpbmRleCwgbW9kaWZpZXIgYW5kIG91ciBuZXcg cHJvcG9zZQo+ID4gY29tcHV0ZWR2YWx1ZSBiaXQuICAKPiBHb3QgaXQuCj4gPiAgIAo+ID4+PiAK PiA+Pj4gVGhlIG90aGVyIGVsZW1lbnQgb2YgdGhpcyBpcyB3ZSBhZGQgYSBuZXcgZmllbGQgdG8g aWlvX2NoYW5fc3BlYwo+ID4+PiB0byBjb250YWluICdkZXJpdmVkX3R5cGUnIG9yIHNvbWV0aGlu ZyBsaWtlIHRoYXQgd2hpY2ggaGFzCj4gPj4+IHJtcyBhbmQgc3VtIHNxdWFyZWQgZXRjLiBPdmVy IHRpbWUgd2UgY2FuIG1vdmUgc29tZSBvZiB0aG9zZQo+ID4+PiBmcm9tIHRoZSBtb2RpZmllcnMg YW5kIGZyZWUgdXAgYSBmZXcgZW50aXJlcyB0aGVyZS4KPiA+Pj4gU28gbW9kaWZpZXIgbWlnaHQg YmUgIlggYW5kIFkgYW5kIFoiIHdpdGggYSBkZXJpdmVkX3R5cGUgb2YgCj4gPj4+IHN1bV9zcXVh cmVkIHRvIGdpdmUgZXhpc3Rpbmcgc3VtX3NxdWFyZWRfeF95X3ogYnV0IG5vCj4gPj4+IHJ1c2gg b24gdGhhdC4KPiA+Pj4gCj4gPj4+IEFueWhvdyBzbyBub3cgd2UgaGF2ZSBhbiBleHRyYSBlbGVt ZW50IHRvIHBsYXkgdGhhdCB3aWxsIHJlc3VsdAo+ID4+PiBpbiBhIGRpZmZlcmVudCBjaGFubmVs Lgo+ID4+PiAKPiA+Pj4gV2hpbHN0IGhlcmUgd2Ugc2hvdWxkIHRoaW5rIGFib3V0IGFueSBvdGhl ciBtb2RzIG5lZWRlZCB0bwo+ID4+PiB0aGF0IGV2ZW50IHN0cnVjdHVyZS4gIEl0IGlzIGEgbGl0 dGxlIHVuZm9ydHVuYXRlIHRoYXQgdGhpcwo+ID4+PiB3aWxsIGJlIGEgYnJlYWtpbmcgY2hhbmdl IGZvciBhbnkgb2xkIHVzZXJzcGFjZSBjb2RlIHBsYXlpbmcKPiA+Pj4gd2l0aCBuZXcgZHJpdmVy cyBidXQgaXQgY2FuJ3QgYmUgaGVscGVkIGFzIHdlIGRpZG4ndCBoYXZlCj4gPj4+IHJlc2VydmVk IHZhbHVlcyBpbiB0aGUgb3JpZ2luYWwgZGVmaW5pdGlvbiAob29wcykuCj4gPj4+IAo+ID4+PiBB dCBzb21lcG9pbnQgd2UgbWF5IG5lZWQgdG8gYWRkIHRoZSAnc2hhcmVkIGJ5IGRlcml2ZWRfdmFs dWUnCj4gPj4+IGluZm8gbWFzayBidXQgSSB0aGluayB3ZSBjYW4gaWdub3JlIHRoYXQgZm9yIG5v dyAoc2VlbXMKPiA+Pj4gbW9kZXJhdGVseSB1bmxpa2VseSB0byBoYXZlIGFueXRoaW5nIGluIGl0 ISkgICAgCj4gPj4+PiAKPiA+Pj4+IEJ1dCBmb3Igbm93LCBJIGZvbGxvd2VkIHlvdXIgaW5zdHJ1 Y3Rpb25zIGZyb20geW91ciByZXBseS4KPiA+Pj4+IAo+ID4+Pj4gQWZ0ZXIgZmluYWxpemluZyB0 aGlzIG9uZSwgSSB3aWxsIHdvcmsgb24gdGhlIEFERTkwMDAsIHdoaWNoIGFzIHdheSBtb3JlIHJl Z2lzdGVycyA7LSkKPiA+Pj4+IAo+ID4+Pj4gT25jZSB3ZSBjYW4gYWdyZWUgb24gdGhlIHJlZ2lz dGVyIG5hbWluZywgSSB3aWxsIHVwZGF0ZSB0aGUgQURFNzg1NCBkcml2ZXIgZm9yIFJvZHJpZ28s IHdoaWNoIHdpbGwgZ28gYSBsb25nIHdheSB0byBnZXR0aW5nIGl0IG91dCBvZiBzdGFnaW5nLiAg ICAKPiA+Pj4gSSdsbCBlZGl0IHRvIGZpdCB3aXRoIG5ldyBzY2hlbWUgYW5kIGluc2VydCBpbmRl eGVzIHdoaWNoIEkgdGhpbmsgd291bGQgYmUKPiA+Pj4gcHJlZmVycmVkIHRob3VnaCBvcHRpb25h bCB1bmRlciB0aGUgQUJJIGFzIHdlIG9ubHkgaGF2ZSBvbmUgb2YgZWFjaCB0eXBlLyAgICAKPiA+ Pj4+IAo+ID4+Pj4gQWRkcmVzcwlSZWdpc3RlcglJSU8gQXR0cmlidXRlCVIvVwlCaXQgTGVuZ3Ro CUJpdCBMZW5ndGggRHVyaW5nIENvbW11bmljYXRpb25zCVR5cGUJRGVmYXVsdCBWYWx1ZQlEZXNj cmlwdGlvbgo+ID4+Pj4gMHg0MzgwCUFJR0FJTglpbl9jdXJyZW50MF9waGFzZUFfc2NhbGUJUi9X CTI0CTMyIFpQU0UJUwkweDAwMDAwMAlQaGFzZSBBIGN1cnJlbnQgZ2FpbiBhZGp1c3QuICAgIAo+ ID4+PiBBLCBCLCBDLCBOIGFyZW4ndCBvYnZpb3VzIHRvIHRoZSBsYXkgcmVhZGVyIHNvIEkgc3Vn Z2VzdCB3ZSBidXJuIGEgZmV3IGNoYXJhY3RlcnMgYW5kIHN0aWNrIHBoYXNlIGluIGZvciBBQkMg YW5kIGp1c3QgaGF2ZSBuZXV0cmFsIGZvcgo+ID4+PiB0aGUgbmV1dHJhbCBvbmUuIE5vdCBzdXJl IGFib3V0IGNhcGl0YWxpemF0aW9uIG9yIG5vdCB0aG91Z2guCj4gPj4+ICAgCj4gPj4+PiAweDQz ODEJQVZHQUlOCWluX3ZvbHRhZ2UwX3BoYXNlQV9zY2FsZQlSL1cJMjQJMzIgWlBTRQlTCTB4MDAw MDAwCVBoYXNlIEEgdm9sdGFnZSBnYWluIGFkanVzdC4KPiA+Pj4+IDB4NDM4MglCSUdBSU4JaW5f Y3VycmVudDBfcGhhc2VCX3NjYWxlCVIvVwkyNAkzMiBaUFNFCVMJMHgwMDAwMDAJUGhhc2UgQiBj dXJyZW50IGdhaW4gYWRqdXN0Lgo+ID4+Pj4gMHg0MzgzCUJWR0FJTglpbl92b2x0YWdlMF9waGFz ZUJfc2NhbGUJUi9XCTI0CTMyIFpQU0UJUwkweDAwMDAwMAlQaGFzZSBCIHZvbHRhZ2UgZ2FpbiBh ZGp1c3QuCj4gPj4+PiAweDQzODQJQ0lHQUlOCWluX2N1cnJlbnQwX3BoYXNlQ19zY2FsZQlSL1cJ MjQJMzIgWlBTRQlTCTB4MDAwMDAwCVBoYXNlIEMgY3VycmVudCBnYWluIGFkanVzdC4KPiA+Pj4+ IDB4NDM4NQlDVkdBSU4JaW5fdm9sdGFnZTBfcGhhc2VDX3NjYWxlCVIvVwkyNAkzMiBaUFNFCVMJ MHgwMDAwMDAJUGhhc2UgQyB2b2x0YWdlIGdhaW4gYWRqdXN0Lgo+ID4+Pj4gMHg0Mzg2CU5JR0FJ Tglpbl9jdXJyZW50MF9uZXV0cmFsX3NjYWxlCVIvVwkyNAkzMiBaUFNFCVMJMHgwMDAwMDAJTmV1 dHJhbCBjdXJyZW50IGdhaW4gYWRqdXN0IChBREU3ODY4IGFuZCBBREU3ODc4IG9ubHkpLgo+ID4+ Pj4gMHg0Mzg3CUFJUk1TT1MJaW5fY3VycmVudDBfcGhhc2VBX3Jtc19vZmZzZXQJUi9XCTI0CTMy IFpQU0UJUwkweDAwMDAwMAlQaGFzZSBBIGN1cnJlbnQgcm1zIG9mZnNldC4KPiA+Pj4+IDB4NDM4 OAlBVlJNU09TCWluX3ZvbHRhZ2UwX3BoYXNlQV9ybXNfb2Zmc2V0CVIvVwkyNAkzMiBaUFNFCVMJ MHgwMDAwMDAJUGhhc2UgQSB2b2x0YWdlIHJtcyBvZmZzZXQuCj4gPj4+PiAweDQzODkJQklSTVNP Uwlpbl9jdXJyZW50MF9waGFzZUJfcm1zX29mZnNldAlSL1cJMjQJMzIgWlBTRQlTCTB4MDAwMDAw CVBoYXNlIEIgY3VycmVudCBybXMgb2Zmc2V0Lgo+ID4+Pj4gMHg0MzhBCUJWUk1TT1MJaW5fdm9s dGFnZTBfcGhhc2VCX3Jtc19vZmZzZXQJUi9XCTI0CTMyIFpQU0UJUwkweDAwMDAwMAlQaGFzZSBC IHZvbHRhZ2Ugcm1zIG9mZnNldC4KPiA+Pj4+IDB4NDM4QglDSVJNU09TCWluX2N1cnJlbnQwX3Bo YXNlQ19ybXNfb2Zmc2V0CVIvVwkyNAkzMiBaUFNFCVMJMHgwMDAwMDAJUGhhc2UgQyBjdXJyZW50 IHJtcyBvZmZzZXQuCj4gPj4+PiAweDQzOEMJQ1ZSTVNPUwlpbl92b2x0YWdlMF9waGFzZUNfcm1z X29mZnNldAlSL1cJMjQJMzIgWlBTRQlTCTB4MDAwMDAwCVBoYXNlIEMgdm9sdGFnZSBybXMgb2Zm c2V0Lgo+ID4+Pj4gMHg0MzhECU5JUk1TT1MJaW5fY3VycmVudDBfbmV1dHJhbF9ybXNfb2Zmc2V0 CVIvVwkyNAkzMiBaUFNFCVMJMHgwMDAwMDAJTmV1dHJhbCBjdXJyZW50IHJtcyBvZmZzZXQgKEFE RTc4NjggYW5kIEFERTc4Nzggb25seSkuCj4gPj4+PiAweDQzOEUJQVZBR0FJTglpbl9wb3dlcmFw cGFyZW50MF9waGFzZUFfc2NhbGUJUi9XCTI0CTMyIFpQU0UJUwkweDAwMDAwMAlQaGFzZSBBIGFw cGFyZW50IHBvd2VyIGdhaW4gYWRqdXN0Lgo+ID4+Pj4gMHg0MzhGCUJWQUdBSU4JaW5fcG93ZXJh cHBhcmVudDBfcGhhc2VCX3NjYWxlCVIvVwkyNAkzMiBaUFNFCVMJMHgwMDAwMDAJUGhhc2UgQiBh cHBhcmVudCBwb3dlciBnYWluIGFkanVzdC4KPiA+Pj4+IDB4NDM5MAlDVkFHQUlOCWluX3Bvd2Vy YXBwYXJlbnQwX3BoYXNlQ19zY2FsZQlSL1cJMjQJMzIgWlBTRQlTCTB4MDAwMDAwCVBoYXNlIEMg YXBwYXJlbnQgcG93ZXIgZ2FpbiBhZGp1c3QuCj4gPj4+PiAweDQzOTEJQVdHQUlOCWluX3Bvd2Vy MF9waGFzZUFfc2NhbGUJUi9XCTI0CTMyIFpQU0UJUwkweDAwMDAwMAlQaGFzZSBBIHRvdGFsIGFj dGl2ZSBwb3dlciBnYWluIGFkanVzdC4KPiA+Pj4+IDB4NDM5MglBV0FUVE9TCWluX3Bvd2VyMF9w aGFzZUFfb2Zmc2V0CVIvVwkyNAkzMiBaUFNFCVMJMHgwMDAwMDAJUGhhc2UgQSB0b3RhbCBhY3Rp dmUgcG93ZXIgb2Zmc2V0IGFkanVzdC4KPiA+Pj4+IDB4NDM5MwlCV0dBSU4JaW5fcG93ZXIwX3Bo YXNlQl9zY2FsZQlSL1cJMjQJMzIgWlBTRQlTCTB4MDAwMDAwCVBoYXNlIEIgdG90YWwgYWN0aXZl IHBvd2VyIGdhaW4gYWRqdXN0Lgo+ID4+Pj4gMHg0Mzk0CUJXQVRUT1MJaW5fcG93ZXIwX3BoYXNl Ql9vZmZzZXQJUi9XCTI0CTMyIFpQU0UJUwkweDAwMDAwMAlQaGFzZSBCIHRvdGFsIGFjdGl2ZSBw b3dlciBvZmZzZXQgYWRqdXN0Lgo+ID4+Pj4gMHg0Mzk1CUNXR0FJTglpbl9wb3dlcjBfUGhhc2VD X3NjYWxlCVIvVwkyNAkzMiBaUFNFCVMJMHgwMDAwMDAJUGhhc2UgQyB0b3RhbCBhY3RpdmUgcG93 ZXIgZ2FpbiBhZGp1c3QuCj4gPj4+PiAweDQzOTYJQ1dBVFRPUwlpbl9wb3dlcjBfcGhhc2VDX29m ZnNldAlSL1cJMjQJMzIgWlBTRQlTCTB4MDAwMDAwCVBoYXNlIEMgdG90YWwgYWN0aXZlIHBvd2Vy IG9mZnNldCBhZGp1c3QuCj4gPj4+PiAweDQzOTcJQVZBUkdBSU4JaW5fcG93ZXJyZWFjdGl2ZTBf cGhhc2VBX3NjYWxlCVIvVwkyNAkzMiBaUFNFCVMJMHgwMDAwMDAJUGhhc2UgQSB0b3RhbCByZWFj dGl2ZSBwb3dlciBnYWluIGFkanVzdCAoQURFNzg1OCwgQURFNzg2OCwgYW5kIEFERTc4NzgpLgo+ ID4+Pj4gMHg0Mzk4CUFWQVJPUwlpbl9wb3dlcnJlYWN0aXZlMF9waGFzZUFfb2Zmc2V0CVIvVwky NAkzMiBaUFNFCVMJMHgwMDAwMDAJUGhhc2UgQSB0b3RhbCByZWFjdGl2ZSBwb3dlciBvZmZzZXQg YWRqdXN0IChBREU3ODU4LCBBREU3ODY4LCBhbmQgQURFNzg3OCkuCj4gPj4+PiAweDQzOTkJQlZB UkdBSU4JaW5fcG93ZXJyZWFjdGl2ZTBfcGhhc2VCX3NjYWxlCVIvVwkyNAkzMiBaUFNFCVMJMHgw MDAwMDAJUGhhc2UgQiB0b3RhbCByZWFjdGl2ZSBwb3dlciBnYWluIGFkanVzdCAoQURFNzg1OCwg QURFNzg2OCwgYW5kIEFERTc4NzgpLgo+ID4+Pj4gMHg0MzlBCUJWQVJPUwlpbl9wb3dlcnJlYWN0 aXZlMF9waGFzZUJfb2Zmc2V0CVIvVwkyNAkzMiBaUFNFCVMJMHgwMDAwMDAJUGhhc2UgQiB0b3Rh bCByZWFjdGl2ZSBwb3dlciBvZmZzZXQgYWRqdXN0IChBREU3ODU4LCBBREU3ODY4LCBhbmQgQURF Nzg3OCkuCj4gPj4+PiAweDQzOUIJQ1ZBUkdBSU4JaW5fcG93ZXJyZWFjdGl2ZTBfcGhhc2VDX3Nj YWxlCVIvVwkyNAkzMiBaUFNFCVMJMHgwMDAwMDAJUGhhc2UgQyB0b3RhbCByZWFjdGl2ZSBwb3dl ciBnYWluIGFkanVzdCAoQURFNzg1OCwgQURFNzg2OCwgYW5kIEFERTc4NzgpLgo+ID4+Pj4gMHg0 MzlDCUNWQVJPUwlpbl9wb3dlcnJlYWN0aXZlMF9waGFzZUNfb2Zmc2V0CVIvVwkyNAkzMiBaUFNF CVMJMHgwMDAwMDAJUGhhc2UgQyB0b3RhbCByZWFjdGl2ZSBwb3dlciBvZmZzZXQgYWRqdXN0IChB REU3ODU4LCBBREU3ODY4LCBhbmQgQURFNzg3OCkuCj4gPj4+PiAweDQzOUQJQUZXR0FJTglpbl9w b3dlcjBfcGhhc2VBX2Z1bmRhbWVudGFsX3NjYWxlCVIvVwkyNAkzMiBaUFNFCVMJMHgwMDAwMDAJ UGhhc2UgQSBmdW5kYW1lbnRhbCBhY3RpdmUgcG93ZXIgZ2FpbiBhZGp1c3QuIExvY2F0aW9uIHJl c2VydmVkIGZvciBBREU3ODU0LCBBREU3ODU4LCBhbmQgQURFNzg2OC4gICAgCj4gPj4+IEhtbS4g ZnVuZGFtZW50YWwgaXMgdGhlIG9kZGl0eSBoZXJlLiAgSSBoZXJlIGJlY2F1c2UgIGl0IGlzIHNv cnQgb2YgYSBkZXJpdmVkIHZhbHVlCj4gPj4+IGFuZCBzb3J0IG9mIGEgZmlsdGVyIGFwcGxpZWQu ICBDYW4gaXQgYmUgc2Vuc2libGUgY29tYmluZWQgd2l0aCBSTVM/IHByb2JhYmx5IG5vdCBidXQK PiA+Pj4gaXQgY2FuIGJlIGNvbWJpbmVkIHdpdGggcGVhayBmb3IgZXhhbXBsZSAod2hpY2ggSSdk IGFsc28gaWRlYWxseSBtb3ZlIGludG8KPiA+Pj4gdGhlIGRlcml2ZWQgcmVwcmVzZW50YXRpb24u KS4gICAgCj4gPj4gSW5jbHVkZXMgb25seSB0aGUgbWVhc3VyZW1lbnQgc3BlY3RydW0gYXQgNTBI eiBvciA2MEh6IGFuZCBkb2VzIG5vdCBpbmNsdWRlIGhhcm1vbmljLiAgIAo+ID4gSSB0aGluayBm b3IgdGhhdCB3ZSBuZWVkIHRvIGRlZmluZSBhIGRpZmZlcmVudCBpbmRleGVkIGNoYW5uZWwgYW5k IGRlZmluZQo+ID4gdGhlIGZpbHRlcnMgYXBwbGllZCB3aXRoIGFwcHJvcHJpYXRlIHZhbHVlcyB0 byBtYWtlIGl0IGEgYmFuZCBwYXNzIGF0IHRoZXNlCj4gPiBmcmVxdWVuY2llcy4gIFdlIG1heSBu ZWVkIHRvIGV4cGFuZCB0aGUgY3VycmVudCBmaWx0ZXIgZGVmaW5pdGlvbnMgdG8gZG8gdGhpcwo+ ID4gYnV0IHRoYXQgaXMgZmluZSBpZiBuZWVkZWQuCj4gPiAKPiA+ICAgCj4gPj4gICAKPiA+Pj4g ICAKPiA+Pj4+IDB4NDM5RQlBRldBVFRPUwlpbl9wb3dlcjBfcGhhc2VBX2Z1bmRhbWVudGFsX29m ZnNldAlSL1cJMjQJMzIgWlBTRQlTCTB4MDAwMDAwCVBoYXNlIEEgZnVuZGFtZW50YWwgYWN0aXZl IHBvd2VyIG9mZnNldCBhZGp1c3QuIExvY2F0aW9uIHJlc2VydmVkIGZvciBBREU3ODU0LCBBREU3 ODU4LCBhbmQgQURFNzg2OC4KPiA+Pj4+IDB4NDM5RglCRldHQUlOCWluX3Bvd2VyMF9waGFzZUJf ZnVuZGFtZW50YWxfc2NhbGUJUi9XCTI0CTMyIFpQU0UJUwkweDAwMDAwMAlQaGFzZSBCIGZ1bmRh bWVudGFsIGFjdGl2ZSBwb3dlciBnYWluIGFkanVzdCAoQURFNzg3OCBvbmx5KS4KPiA+Pj4+IDB4 NDNBMAlCRldBVFRPUwlpbl9wb3dlcjBfcGhhc2VCX2Z1bmRhbWVudGFsX29mZnNldAlSL1cJMjQJ MzIgWlBTRQlTCTB4MDAwMDAwCVBoYXNlIEIgZnVuZGFtZW50YWwgYWN0aXZlIHBvd2VyIG9mZnNl dCBhZGp1c3QgKEFERTc4Nzggb25seSkuCj4gPj4+PiAweDQzQTEJQ0ZXR0FJTglpbl9wb3dlcjBf cGhhc2VDX2Z1bmRhbWVudGFsX3NjYWxlCVIvVwkyNAkzMiBaUFNFCVMJMHgwMDAwMDAJUGhhc2Ug QyBmdW5kYW1lbnRhbCBhY3RpdmUgcG93ZXIgZ2FpbiBhZGp1c3QuCj4gPj4+PiAweDQzQTIJQ0ZX QVRUT1MJaW5fcG93ZXIwX3BoYXNlQ19mdW5kYW1lbnRhbF9vZmZzZXQJUi9XCTI0CTMyIFpQU0UJ UwkweDAwMDAwMAlQaGFzZSBDIGZ1bmRhbWVudGFsIGFjdGl2ZSBwb3dlciBvZmZzZXQgYWRqdXN0 IChBREU3ODc4IG9ubHkpLgo+ID4+Pj4gMHg0M0EzCUFGVkFSR0FJTglpbl9wb3dlcnJlYWN0aXZl MF9waGFzZUFfZnVuZGFtZW50YWxfc2NhbGUJUi9XCTI0CTMyIFpQU0UJUwkweDAwMDAwMAlQaGFz ZSBBIGZ1bmRhbWVudGFsIHJlYWN0aXZlIHBvd2VyIGdhaW4gYWRqdXN0IChBREU3ODc4IG9ubHkp Lgo+ID4+Pj4gMHg0M0E0CUFGVkFST1MJaW5fcG93ZXJyZWFjdGl2ZTBfcGhhc2VBX2Z1bmRhbWVu dGFsX29mZnNldAlSL1cJMjQJMzIgWlBTRQlTCTB4MDAwMDAwCVBoYXNlIEEgZnVuZGFtZW50YWwg cmVhY3RpdmUgcG93ZXIgb2Zmc2V0IGFkanVzdCAoQURFNzg3OCBvbmx5KS4KPiA+Pj4+IDB4NDNB NQlCRlZBUkdBSU4JaW5fcG93ZXJyZWFjdGl2ZTBfcGhhc2VCX2Z1bmRhbWVudGFsX3NjYWxlCVIv VwkyNAkzMiBaUFNFCVMJMHgwMDAwMDAJUGhhc2UgQiBmdW5kYW1lbnRhbCByZWFjdGl2ZSBwb3dl ciBnYWluIGFkanVzdCAoQURFNzg3OCBvbmx5KS4KPiA+Pj4+IDB4NDNBNglCRlZBUk9TCWluX3Bv d2VycmVhY3RpdmUwX3BoYXNlQl9mdW5kYW1lbnRhbF9vZmZzZXQJUi9XCTI0CTMyIFpQU0UJUwkw eDAwMDAwMAlQaGFzZSBCIGZ1bmRhbWVudGFsIHJlYWN0aXZlIHBvd2VyIG9mZnNldCBhZGp1c3Qg KEFERTc4Nzggb25seSkuCj4gPj4+PiAweDQzQTcJQ0ZWQVJHQUlOCWluX3Bvd2VycmVhY3RpdmUw X3BoYXNlQ19mdW5kYW1lbnRhbF9zY2FsZQlSL1cJMjQJMzIgWlBTRQlTCTB4MDAwMDAwCVBoYXNl IEMgZnVuZGFtZW50YWwgcmVhY3RpdmUgcG93ZXIgZ2FpbiBhZGp1c3QgKEFERTc4Nzggb25seSku Cj4gPj4+PiAweDQzQTgJQ0ZWQVJPUwlpbl9wb3dlcnJlYWN0aXZlMF9waGFzZUNfZnVuZGFtZW50 YWxfb2Zmc2V0CVIvVwkyNAkzMiBaUFNFCVMJMHgwMDAwMDAJUGhhc2UgQyBmdW5kYW1lbnRhbCBy ZWFjdGl2ZSBwb3dlciBvZmZzZXQgYWRqdXN0IChBREU3ODc4IG9ubHkpLgo+ID4+Pj4gMHg0M0E5 CVZBVEhSMQlyZWdpaXN0ZXJfVkFUSFIxCVIvVwkyNAkzMiBaUAlVCTB4MDAwMDAwCU1vc3Qgc2ln bmlmaWNhbnQgMjQgYml0cyBvZiBWQVRIUls0NzowXSB0aHJlc2hvbGQgdXNlZCBpbiBwaGFzZSBh cHBhcmVudCBwb3dlciBkYXRhcGF0aC4gICAgCj4gPj4+IERvIG5vdCBleHBvc2UgdGhlc2UgdG8g dXNlcnNwYWNlLiBXaHkgd291bGQgaXQgY2FyZT8gICAgCj4gPj4gQnJpbGxpYW50LCB5ZXMgdGhl c2Ugc2hvdWxkIGJlIG1vdmVkIHRoZSB0aGUgRGV2aWNlVHJlZSAoRFQpICAKPiA+IAo+ID4gQ29v bAo+ID4gICAKPiA+Pj4gICAKPiA+Pj4+IDB4NDNBQQlWQVRIUjAJcmVnaXN0ZXJfVkFUSFIwCVIv VwkyNAkzMiBaUAlVCTB4MDAwMDAwCUxlc3Mgc2lnbmlmaWNhbnQgMjQgYml0cyBvZiBWQVRIUls0 NzowXSB0aHJlc2hvbGQgdXNlZCBpbiBwaGFzZSBhcHBhcmVudCBwb3dlciBkYXRhcGF0aC4KPiA+ Pj4+IDB4NDNBQglXVEhSMQlyZWdpc3Rlcl9XVEhSMQlSL1cJMjQJMzIgWlAJVQkweDAwMDAwMAlN b3N0IHNpZ25pZmljYW50IDI0IGJpdHMgb2YgV1RIUls0NzowXSB0aHJlc2hvbGQgdXNlZCBpbiBw aGFzZSB0b3RhbC9mdW5kYW1lbnRhbCBhY3RpdmUgcG93ZXIgZGF0YXBhdGguCj4gPj4+PiAweDQz QUMJV1RIUjAJcmVnaXN0ZXJfV1RIUjAJUi9XCTI0CTMyIFpQCVUJMHgwMDAwMDAJTGVzcyBzaWdu aWZpY2FudCAyNCBiaXRzIG9mIFdUSFJbNDc6MF0gdGhyZXNob2xkIHVzZWQgaW4gcGhhc2UgdG90 YWwvZnVuZGFtZW50YWwgYWN0aXZlIHBvd2VyIGRhdGFwYXRoLgo+ID4+Pj4gMHg0M0FECVZBUlRI UjEJcmVnaXN0ZXJfVkFSVEhSMQlSL1cJMjQJMzIgWlAJVQkweDAwMDAwMAlNb3N0IHNpZ25pZmlj YW50IDI0IGJpdHMgb2YgVkFSVEhSWzQ3OjBdIHRocmVzaG9sZCB1c2VkIGluIHBoYXNlIHRvdGFs L2Z1bmRhbWVudGFsIHJlYWN0aXZlIHBvd2VyIGRhdGFwYXRoIChBREU3ODU4LCBBREU3ODY4LCBh bmQgQURFNzg3OCkuCj4gPj4+PiAweDQzQUUJVkFSVEhSMAlyZWdpc3Rlcl9WQVJUSFIwCVIvVwky NAkzMiBaUAlVCTB4MDAwMDAwCUxlc3Mgc2lnbmlmaWNhbnQgMjQgYml0cyBvZiBWQVJUSFJbNDc6 MF0gdGhyZXNob2xkIHVzZWQgaW4gcGhhc2UgdG90YWwvZnVuZGFtZW50YWwgcmVhY3RpdmUgcG93 ZXIgZGF0YXBhdGggKEFERTc4NTgsIEFERTc4NjgsIGFuZCBBREU3ODc4KS4KPiA+Pj4+IDB4NDNB RglSZXNlcnZlZAkJTi9BNAlOL0E0CU4vQTQJTi9BNAkweDAwMDAwMAlUaGlzIG1lbW9yeSBsb2Nh dGlvbiBzaG91bGQgYmUga2VwdCBhdCAweDAwMDAwMCBmb3IgcHJvcGVyIG9wZXJhdGlvbi4KPiA+ Pj4+IDB4NDNCMAlWQU5PTE9BRAlyZWdpc3Rlcl9WQU5PTE9BRAlSL1cJMjQJMzIgWlBTRQlTCTB4 MDAwMDAwMAlObyBsb2FkIHRocmVzaG9sZCBpbiB0aGUgYXBwYXJlbnQgcG93ZXIgZGF0YXBhdGgu ICAgIAo+ID4+PiBUaGlzIG9uZSBpcyBraW5kIG9mIGFuIGV2ZW50IHBhcmFtZXRlciwgYnV0IG9u ZSB0aGF0IGNvbnRyb2xzIGludGVybmFsIGNyZWVwIHByZXZlbnRpb24uCj4gPj4+IFRoaXMgd2ls bCBiZSBhIGRyaXZlciBzcGVjaWZpYyBhdHRyIEkgdGhpbmsgZm9yIG5vdy4gV2UgbWF5IGFkZCBp dCB0byBpbmZvX21hc2sKPiA+Pj4gbGF0ZXIgaWYgd2UgZ2V0IGxvdHMgb2YgbWV0ZXIgZHJpdmVy cy4gCj4gPj4+IFNvbWV0aGluZyBsaWtlCj4gPj4+IGluX3Bvd2VyMF9ub19sb2FkX3RocmVzaCB0 aG91Z2ggSSBoYXZlbid0IHJlYWxseSB0aG91Z2h0IGFib3V0IGl0IG9yIGxvb2tlZAo+ID4+PiBm b3Igc2ltaWxhciBwcmVjZWRlbmNlLiAgICAKPiA+PiBBZ2FpbiwgdGhpcyBpcyBzb21ldGhpbmcg dGhhdCB3b3VsZCBiZSBzZXQgYW5kIG5ldmVyIGNoYW5nZWQsIHNvIEkgdGhpbmsgdGhpcyBzaG91 bGQgYmUgbW92ZWQgdG8gRFQuICAKPiA+IAo+ID4gQ29vbC4KPiA+ICAgCj4gPj4+IAo+ID4+PiAg IAo+ID4+Pj4gMHg0M0IxCUFQTk9MT0FECXJlZ2lzdGVyX0FQTk9MT0FECVIvVwkyNAkzMiBaUFNF CVMJMHgwMDAwMDAwCU5vIGxvYWQgdGhyZXNob2xkIGluIHRoZSB0b3RhbC9mdW5kYW1lbnRhbCBh Y3RpdmUgcG93ZXIgZGF0YXBhdGguICAgIAo+ID4+PiBpbl9hY3RpdmVwb3dlcjBfbm9fbG9hZF90 aHJlc2ggICAgCj4gPj4gRFQgIAo+ID4+Pj4gMHg0M0IyCVZBUk5PTE9BRAlyZWdpc3Rlcl9WQVJO T0xPQUQJUi9XCTI0CTMyIFpQU0UJUwkweDAwMDAwMDAJTm8gbG9hZCB0aHJlc2hvbGQgaW4gdGhl IHRvdGFsL2Z1bmRhbWVudGFsIHJlYWN0aXZlIHBvd2VyIGRhdGFwYXRoLiBMb2NhdGlvbiByZXNl cnZlZCBmb3IgQURFNzg1NC4gICAgCj4gPj4+IGluX3JlYWN0aXZwb3dlcjBfbm9fbG9hZF90aHJl c2ggICAgCj4gPj4gRFQgIAo+ID4+PiAgIAo+ID4+Pj4gMHg0M0IzCVZMRVZFTAlyZWdpc3Rlcl9W TEVWRUwJUi9XCTI0CTMyIFpQU0UJUwkweDAwMDAwMAlSZWdpc3RlciB1c2VkIGluIHRoZSBhbGdv cml0aG0gdGhhdCBjb21wdXRlcyB0aGUgZnVuZGFtZW50YWwgYWN0aXZlIGFuZCByZWFjdGl2ZSBw b3dlcnMgKEFERTc4Nzggb25seSkuICAgIAo+ID4+PiBUaGlzIG9uZSBsb29rcyBsaWtlIGEgY2hh cmFjdGVyaXN0aWMgb2YgdGhlIGNpcmN1aXQgYXR0YWNoZWQuICBTbyBzaG91bGQgYmUgZGV2aWNl dHJlZQo+ID4+PiBvciBzaW1pbGFyIGFuZCBub3QgZXhwb3NlZCB0byB1c2Vyc3BhY2UuICAgIAo+ ID4+IERUICAKPiA+Pj4gICAKPiA+Pj4+IDB4NDNCNQlESUNPRUZGCXJlZ2lzdGVyX0RJQ09FRkYJ Ui9XCTI0CTMyIFpQU0UJUwkweDAwMDAwMDAJUmVnaXN0ZXIgdXNlZCBpbiB0aGUgZGlnaXRhbCBp bnRlZ3JhdG9yIGFsZ29yaXRobS4gSWYgdGhlIGludGVncmF0b3IgaXMgdHVybmVkIG9uLCBpdCBt dXN0IGJlIHNldCBhdCAweEZGODAwMC4gSW4gcHJhY3RpY2UsIGl0IGlzIHRyYW5zbWl0dGVkIGFz IDB4RkZGODAwMC4gICAgCj4gPj4+IG5vIHVzZXJzcGFjZSBpbnRlcmZhY2UuICAgIAo+ID4+IERU ICAKPiA+Pj4gICAKPiA+Pj4+IDB4NDNCNglIUEZESVMJcmVnaXN0ZXJfSFBGRElTCVIvVwkyNAkz MiBaUAlVCTB4MDAwMDAwCURpc2FibGVzL2VuYWJsZXMgdGhlIEhQRiBpbiB0aGUgY3VycmVudCBk YXRhcGF0aCAoc2VlIFRhYmxlIDM0KS4gICAgCj4gPj4+IFdlIGhhdmUgY29udHJvbHMgZm9yIGhp Z2ggcGFzcyBmaWx0ZXJzLCB5b3UnbGwgbmVlZCB0byBtYXAgb24gdG8gdGhlbS4KPiA+Pj4gRGlz YWJsZSBpcyB1c3VhbGx5IHNldHRpbmcgM0RCIHBvaW50IHRvIDAgSUlSQy4gICAgCj4gPj4gRFQg IAo+ID4+PiAgIAo+ID4+Pj4gMHg0M0I4CUlTVU1MVkwJcmVnaXN0ZXJfSVNVTUxWTAlSL1cJMjQJ MzIgWlBTRQlTCTB4MDAwMDAwCVRocmVzaG9sZCB1c2VkIGluIGNvbXBhcmlzb24gYmV0d2VlbiB0 aGUgc3VtIG9mIHBoYXNlIGN1cnJlbnRzIGFuZCB0aGUgbmV1dHJhbCBjdXJyZW50IChBREU3ODY4 IGFuZCBBREU3ODc4IG9ubHkpLiAgICAKPiA+Pj4gVGhpcyBpcyBhbiBldmVudCB0aHJlc2hvbGQg c28gbmVlZHMgdG8gbWFwIHRvIHRoZSBldmVudHMgaW5mcmFzdHJ1Y3R1cmUKPiA+Pj4gYXMgYmVz dCB3ZSBjYW4uICBJdCdzIGFjdHVhbGx5IGEgcGFpbiB0byBkZXNjcmliZSBzbyBtYXkgYmUgZGV2 aWNlIHNwZWNpZmljIEFCSS4gICAgCj4gPj4gRFQuIEnigJltIG5vdCBzdXJlIHdoeSB0aGlzIHdv dWxkIGJlIG1hcHBlZCB0byB0aGUgZXZlbnRzIGluZnJhc3RydWN0dXJlPyBUaGVyZSBpcyBubyBl dmVudCBnZW5lcmF0ZWQgYnkgdGhpcyByZWdpc3Rlci4gIAo+ID4gQ29udHJvbCBwYXJhbWV0ZXIg b2YgYW4gZXZlbnQgSSB0aGluaz8KPiA+IFNvIHRoZSBldmVudCBkZXNjcmlwdGlvbiBpcyBzZXBh cmF0ZSBmcm9tIHRoYXQgb2YgdGhlIGNoYW5uZWxzIGFuZCBoYXMgaXQncwo+ID4gb3duIGV4dGVu ZGVkIEFCSSB0byBkZXNjcmliZSB0aGlzIHNvcnQgb2YgdmFsdWUuICAKPiBEbyB5b3UgaGF2ZSBh biBleGFtcGxlIHdoZXJlIGEgY29udHJvbCBwYXJhbWV0ZXIgaXMgdXNlZCB3aXRoIGFuIGV2ZW50 PyAKPiBJIGhhdmUgbm90IHNlZW4gdGhpcyBhbnl3aGVyZS4KClN1cmUgaW4gdGhlIGFiaSBkb2Nz IHRoZXNlIGFyZSBlYXN5IHRvIGZpbmQgYXMgdGhleSBoYXZlCnRoZSB0eXBlIG9mIGV2ZW50IGlu IHRoZSBuYW1lLgoKVGFraW5nIGEgZmV3IHJlbGV2YW50IGVudHJpZXMuLi4KCi9zeXMvLi4uL2V2 ZW50cy9pbl9hY2NlbF90aHJlc2hfcmlzaW5nX2VuCi9zeXMvLi4uL2V2ZW50cy9pbl9hY2NlbF90 aHJlc2hfcmlzaW5nX3ZhbHVlCi9zeXMvLi4uL2V2ZW50cy9pbl9hY2NlbF94X3RocmVzaF9yaXNp bmdfaHlzdGVyZXNpcwovc3lzLy4uLi9ldmVudHMvaW5fYWNjZWxfeF90aHJlc2hfcmlzaW5nX3Bl cmlvZAovc3lzLy4uLi9ldmVudHMvaW5fYWNjZWxfdGhyZXNoX3Jpc2luZ19sb3dfcGFzc19maWx0 ZXJfM2RiCgpHcmVwIGZvciBpaW9fZXZlbnRfc3BlYyB0byBmaW5kIGhvdyB0aGV5IGFyZSBkZWZp bmVkLiAgSXQncyBwcmV0dHkKc2ltaWxhciB0byBhIGNoYW5uZWwgYW5kIHRoZXkgYXJlIGFzc29j aWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgY2hhbm5lbC4KCj4gPiAgIAo+ID4+PiAgIAo+ID4+Pj4g MHg0M0JGCUlTVU0JcmVnaXN0ZXJfSVNVTQlSCTI4CTMyIFpQCVMJTi9BNAlTdW0gb2YgSUFXViwg SUJXViwgYW5kIElDV1YgcmVnaXN0ZXJzIChBREU3ODY4IGFuZCBBREU3ODc4IG9ubHkpLiAgICAK PiA+Pj4gU28gdGhpcyB3b3VsZCBiZSB1c2luZyBhIG1vZGlmaWVyIGZvciBBYW5kQmFuZEMgcGhh c2VzIChzaW1pbGFyIHRvIHRoZSBYYW5kWWFuWiBvbmVzIGZvciBtZW1zIGRldmljZXMgYW5kCj4g Pj4+IGEgZGVyaXZlZCB2YWx1ZSBvZiBzdW0gSSB0aGluayBTbyB3b3VsZCBsb29rIHNvbWV0aGlu ZyBsaWtlLgo+ID4+PiBpbl9jdXJyZW50MF9waGFzZUEmcGhhc2VCJnBoYXNlQ19zdW0gYW5kIHll dCBhbm90aGVyIGNoYW5uZWwKPiA+Pj4gICAKPiA+Pj4+IDB4NDNDMAlBSVJNUwlpbl9jdXJyZW50 MF9waGFzZUFfcm1zCVIJMjQJMzIgWlAJUwlOL0E0CVBoYXNlIEEgY3VycmVudCBybXMgdmFsdWUu Cj4gPj4+PiAweDQzQzEJQVZSTVMJaW5fdm9sdGFnZTBfcGhhc2VBX3JtcwlSCTI0CTMyIFpQCVMJ Ti9BNAlQaGFzZSBBIHZvbHRhZ2Ugcm1zIHZhbHVlLgo+ID4+Pj4gMHg0M0MyCUJJUk1TCWluX2N1 cnJlbnQwX3BoYXNlQl9ybXMJUgkyNAkzMiBaUAlTCU4vQTQJUGhhc2UgQiBjdXJyZW50IHJtcyB2 YWx1ZS4KPiA+Pj4+IDB4NDNDMwlCVlJNUwlpbl92b2x0YWdlMF9waGFzZUJfcm1zCVIJMjQJMzIg WlAJUwlOL0E0CVBoYXNlIEIgdm9sdGFnZSBybXMgdmFsdWUuCj4gPj4+PiAweDQzQzQJQ0lSTVMJ aW5fY3VycmVudDBfcGhhc2VDX3JtcwlSCTI0CTMyIFpQCVMJTi9BNAlQaGFzZSBDIGN1cnJlbnQg cm1zIHZhbHVlLgo+ID4+Pj4gMHg0M0M1CUNWUk1TCWluX3ZvbHRhZ2UwX3BoYXNlQ19ybXMJUgky NAkzMiBaUAlTCU4vQTQJUGhhc2UgQyB2b2x0YWdlIHJtcyB2YWx1ZS4KPiA+Pj4+IDB4NDNDNglO SVJNUwlpbl9jdXJyZW50MF9uZXV0cmFsX3JtcwlSCTI0CTMyIFpQCVMJTi9BNAlOZXV0cmFsIGN1 cnJlbnQgcm1zIHZhbHVlIChBREU3ODY4IGFuZCBBREU3ODc4IG9ubHkpLgo+ID4+Pj4gMHhFMjI4 CVJ1bglyZWdpc3Rlcl9SdW4JUi9XCTE2CTE2CVUJMHgwMDAwCVJ1biByZWdpc3RlciBzdGFydHMg YW5kIHN0b3BzIHRoZSBEU1AuIFNlZSB0aGUgRGlnaXRhbCBTaWduYWwgUHJvY2Vzc29yIHNlY3Rp b24gZm9yIG1vcmUgZGV0YWlscy4gICAgCj4gPj4+IE5vdCBleHBvc2VkIHRvIHVzZXJzcGFjZS4g ICAgCj4gPj4gRFQgIAo+ID4+PiAgIAo+ID4+Pj4gMHhFNDAwCUFXQVRUSFIJaW5fZW5lcmd5MF9w aGFzZUFfcmF3CVIJMzIJMzIJUwkweDAwMDAwMDAwCVBoYXNlIEEgdG90YWwgYWN0aXZlIGVuZXJn eSBhY2N1bXVsYXRpb24uCj4gPj4+PiAweEU0MDEJQldBVFRIUglpbl9lbmVyZ3kwX3BoYXNlQl9y YXcJUgkzMgkzMglTCTB4MDAwMDAwMDAJUGhhc2UgQiB0b3RhbCBhY3RpdmUgZW5lcmd5IGFjY3Vt dWxhdGlvbi4KPiA+Pj4+IDB4RTQwMglDV0FUVEhSCWluX2VuZXJneTBfcGhhc2VDX3JhdwlSCTMy CTMyCVMJMHgwMDAwMDAwMAlQaGFzZSBDIHRvdGFsIGFjdGl2ZSBlbmVyZ3kgYWNjdW11bGF0aW9u Lgo+ID4+Pj4gMHhFNDAzCUFGV0FUVEhSCWluX2VuZXJneTBfcGhhc2VBX2Z1bmRhbWVudGFsX3Jh dwlSCTMyCTMyCVMJMHgwMDAwMDAwMAlQaGFzZSBBIGZ1bmRhbWVudGFsIGFjdGl2ZSBlbmVyZ3kg YWNjdW11bGF0aW9uIChBREU3ODc4IG9ubHkpLgo+ID4+Pj4gMHhFNDA0CUJGV0FUVEhSCWluX2Vu ZXJneTBfcGhhc2VCX2Z1bmRhbWVudGFsX3JhdwlSCTMyCTMyCVMJMHgwMDAwMDAwMAlQaGFzZSBC IGZ1bmRhbWVudGFsIGFjdGl2ZSBlbmVyZ3kgYWNjdW11bGF0aW9uIChBREU3ODc4IG9ubHkpLgo+ ID4+Pj4gMHhFNDA1CUNGV0FUVEhSCWluX2VuZXJneTBfcGhhc2VDX2Z1bmRhbWVudGFsX3JhdwlS CTMyCTMyCVMJMHgwMDAwMDAwMAlQaGFzZSBDIGZ1bmRhbWVudGFsIGFjdGl2ZSBlbmVyZ3kgYWNj dW11bGF0aW9uIChBREU3ODc4IG9ubHkpLgo+ID4+Pj4gMHhFNDA2CUFWQVJIUglpbl9lbmVyZ3ly ZWFjdGl2ZTBfcGhhc2VBX3JhdwlSCTMyCTMyCVMJMHgwMDAwMDAwMAlQaGFzZSBBIHRvdGFsIHJl YWN0aXZlIGVuZXJneSBhY2N1bXVsYXRpb24gKEFERTc4NTgsIEFERTc4NjgsIGFuZCBBREU3ODc4 IG9ubHkpLgo+ID4+Pj4gMHhFNDA3CUJWQVJIUglpbl9lbmVyZ3lyZWFjdGl2ZTBfcGhhc2VCX3Jh dwlSCTMyCTMyCVMJMHgwMDAwMDAwMAlQaGFzZSBCIHRvdGFsIHJlYWN0aXZlIGVuZXJneSBhY2N1 bXVsYXRpb24gKEFERTc4NTgsIEFERTc4NjgsIGFuZCBBREU3ODc4IG9ubHkpLgo+ID4+Pj4gMHhF NDA4CUNWQVJIUglpbl9lbmVyZ3lyZWFjdGl2ZTBfcGhhc2VDX3JhdwlSCTMyCTMyCVMJMHgwMDAw MDAwMAlQaGFzZSBDIHRvdGFsIHJlYWN0aXZlIGVuZXJneSBhY2N1bXVsYXRpb24gKEFERTc4NTgs IEFERTc4NjgsIGFuZCBBREU3ODc4IG9ubHkpLgo+ID4+Pj4gMHhFNDA5CUFGVkFSSFIJaW5fZW5l cmd5cmVhY3RpdmUwX3BoYXNlQV9mdW5kYW1lbnRhbF9yYXcJUgkzMgkzMglTCTB4MDAwMDAwMDAJ UGhhc2UgQSBmdW5kYW1lbnRhbCByZWFjdGl2ZSBlbmVyZ3kgYWNjdW11bGF0aW9uIChBREU3ODc4 IG9ubHkpLgo+ID4+Pj4gMHhFNDBBCUJGVkFSSFIJaW5fZW5lcmd5cmVhY3RpdmUwX3BoYXNlQl9m dW5kYW1lbnRhbF9yYXcJUgkzMgkzMglTCTB4MDAwMDAwMDAJUGhhc2UgQiBmdW5kYW1lbnRhbCBy ZWFjdGl2ZSBlbmVyZ3kgYWNjdW11bGF0aW9uIChBREU3ODc4IG9ubHkpLgo+ID4+Pj4gMHhFNDBC CUNGVkFSSFIJaW5fZW5lcmd5cmVhY3RpdmUwX3BoYXNlQ19mdW5kYW1lbnRhbF9yYXcJUgkzMgkz MglTCTB4MDAwMDAwMDAJUGhhc2UgQyBmdW5kYW1lbnRhbCByZWFjdGl2ZSBlbmVyZ3kgYWNjdW11 bGF0aW9uIChBREU3ODc4IG9ubHkpLgo+ID4+Pj4gMHhFNDBDCUFWQUhSCWluX2VuZXJneWFwcGFy ZW50MF9waGFzZUFfcmF3CVIJMzIJMzIJUwkweDAwMDAwMDAwCVBoYXNlIEEgYXBwYXJlbnQgZW5l cmd5IGFjY3VtdWxhdGlvbi4KPiA+Pj4+IDB4RTQwRAlCVkFIUglpbl9lbmVyZ3lhcHBhcmVudDBf cGhhc2VCX3JhdwlSCTMyCTMyCVMJMHgwMDAwMDAwMAlQaGFzZSBCIGFwcGFyZW50IGVuZXJneSBh Y2N1bXVsYXRpb24uCj4gPj4+PiAweEU0MEUJQ1ZBSFIJaW5fZW5lcmd5YXBwYXJlbnQwX3BoYXNl Q19yYXcJUgkzMgkzMglTCTB4MDAwMDAwMDAJUGhhc2UgQyBhcHBhcmVudCBlbmVyZ3kgYWNjdW11 bGF0aW9uLgo+ID4+Pj4gMHhFNTAwCUlQRUFLCWluX2N1cnJlbnQwX3BlYWsJUgkzMgkzMglVCU4v QQlDdXJyZW50IHBlYWsgcmVnaXN0ZXIuIFNlZSBGaWd1cmUgNTAgYW5kIFRhYmxlIDM1IGZvciBk ZXRhaWxzIGFib3V0IGl0cyBjb21wb3NpdGlvbi4gICAgCj4gPj4+IE9oIGdvb2R5LiBJIGhhdmUg bm8gaWRlYSBob3cgd2UgZXhwb3NlIHRoZSB3aGljaCBwaGFzZSBlbGVtZW50IG9mIHRoaXMKPiA+ Pj4gY2xlYW5seS4gIE9uZSBvcHRpb24gSSBzdXBwb3NlIGlzIHRvIGhhdmUgaW5fY3VycmVudDBf cGhhc2VBX3BlYWsgZXRjCj4gPj4+IGFuZCBoYXZlIGFsbCBidXQgdGhlIGN1cnJlbnQgcGVhayBy ZXR1cm4gYW4gZXJyb3Igd2hlbiByZWFkPyBJdCBpcyBhIGJpdAo+ID4+PiBuYXN0eSBidXQgb25s eSBzbyBtdWNoIHdlIGNhbiBkbyBhbmQga2VlcCB3aXRoIGEgY29uc2lzdGVudCBpbnRlcmZhY2Uu Cj4gPj4+ICAgCj4gPj4+PiAweEU1MDEJVlBFQUsJaW5fdm9sdGFnZV9wZWFrCVIJMzIJMzIJVQlO L0EJVm9sdGFnZSBwZWFrIHJlZ2lzdGVyLiBTZWUgRmlndXJlIDUwIGFuZCBUYWJsZSAzNiBmb3Ig ZGV0YWlscyBhYm91dCBpdHMgY29tcG9zaXRpb24uICAgIAo+ID4+PiBTYW1lIGFzIHBlYWsuCj4g Pj4+ICAgCj4gPj4+PiAweEU1MDIJU1RBVFVTMAlyZWdpc3Rlcl9TVEFUVVMwCVIvVwkzMgkzMglV CU4vQQlJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyIDAuIFNlZSBUYWJsZSAzNy4KPiA+Pj4+IDB4 RTUwMwlTVEFUVVMxCXJlZ2lzdGVyX1NUQVRVUzEJUi9XCTMyCTMyCVUJTi9BCUludGVycnVwdCBT dGF0dXMgUmVnaXN0ZXIgMS4gU2VlIFRhYmxlIDM4LiAgICAKPiA+Pj4gTm8gdXNlcnNwYWNlIGlu dGVyZmFjZSBleGNlcHQgdmlhIGV2ZW50cyBpbnRlcmZhY2Ugb3IgZXJyb3IgcmVwb3J0cy4gICAg Cj4gPj4gSXNu4oCZdCB0aGlzIHRpZWQgdG8gdGhlIGV2ZW50IGZyYW1ld29yaz8gTXkgdGhpbmtp bmcgaXMgdGhlIHVzZXIgaW50ZXJmYWNlIHNob3VsZCBiZSBub3RpZmllZCB3aGVuIGNlcnRhaW4g Y29uZGl0aW9ucyBvY2N1ci4gIAo+ID4gCj4gPiBQcm9iYWJseSBkZXBlbmRpbmcgb24gdGhlIGNv bmRpdGlvbi4gIElmIGl0IGxvb2tzIGxpa2UgYSB0aHJlc2hvbGQgb24gc29tZXRoaW5nCj4gPiBp dCBjYW4gZ28gdGhyb3VnaCBhcyBhbiBldmVudC4gIElmIGl0IGlzIGEgJ2ZhdWx0JyBkZXRlY3Rp b24gaW4gdGhlIG1lYXN1cmVtZW50Cj4gPiBoYXJkd2FyZSB3ZSBuZWVkIHRvIGxvb2sgYXQgYSBS QVMgdHlwZSBub3RpZmljYXRpb24uIFRoaXMgaXMgYWx3YXlzIGEgdHJpY2t5Cj4gPiB0b3BpYyBh bmQgdGhlIHVwc2hvdCBpcyB3ZSBub3JtYWxseSBqdXN0IGVuZCB1cCBkdW1waW5nIHRoZW0gaW4g dGhlIGtlcm5lbCBsb2cKPiA+IGFzIGFueXRoaW5nIGVsc2UgaXMgaGFyZCB0byBkbyAoZnJvbSBh IHBlcnN1YWRpbmcgb3RoZXIgcGVvcGxlIG9mIGl0J3MgaW1wb3J0YW5jZQo+ID4gcG9pbnQgb2Yg dmlldykuICAKPiBMZXTigJlzIHRha2Ugc29tZSBleGFtcGxlczoKPiBTVEFUVVMwOjAJQUVIRglC aXQgc2V0IHdoZW4gdGhlIFdhdHQgaG91ciByZWdpc3RlcnMgcmVhY2ggdGhyZXNob2xkLgo+IFRo aXMgbWVhbnMgdGhlIFdhdHQgaG91ciByZWdpc3RlcnMgbXVzdCBiZSByZWFkIG9yIHRoZSB3YXR0 IGhvdXIgcmVnaXN0ZXIgd2lsbCAKPiB3cmFwIGFuZCB5b3Ugd2lsbCBsb29zZSB0aGUgZW5lcmd5 IGFjY3VtdWxhdGVkLiBTbyBJ4oCZbSBub3Qgc3VyZSBob3cgSUlPIGhhbmRsZXMgCj4gZXZlbnRz IHdpdGggdXNlciBzcGFjZSwgYnV0IGNhbiBJIGFzc3VtZSBpdCBpcyB1c2luZyBhIHBvbGwgb3Ig c2VsZWN0IHRvIG1vbml0b3IgZm9yIAo+IGV2ZW50cz8KCkRvIHdlIGdldCBpbnRlcnJ1cHRzIHRv IGluZGljYXRlIGEgc3RhdGUgY2hhbmdlIGluIGhlcmU/ICBXZSBjYW4gcG9sbCBvdGhlcndpc2UK YnV0IGl0J3Mgbm90IGV4YWN0bHkgZWxlZ2FudCB0byBkbyBzby4gIEhhZCBhIHF1aWNrIGxvb2sg LSBhcyB0aGlzIGlzIHRoZQppbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyIHdlIGFyZSBmaW5lIDop CgpUaGlzIHdvdWxkIGJlIGNvbnRyb2xsZWQgYnkgc29tZXRoaW5nIGxpa2UuCmluX3Bvd2VyMF90 aHJlc2hfcmlzaW5nX3ZhbHVlCgpGcm9tIGEgdXNlcnNwYWNlIHBvaW50IG9mIHZpZXcsIHRoZXJl IGlzIGFuIGlvY3RsIHRoYXQgZ2V0cyB5b3UgYW4gYW5vbnltb3VzCmNoYXJkZXYuICBPbmNlIHlv dSBoYXZlIHRoYXQgeW91IGNhbiB1c2UgcG9sbCAvIHNlbGVjdCB0byBtb25pdG9yIGZvciBldmVu dHMKYW5kIGFjdCBvbiB0aGVtLgoKVGhlcmUgaXMgZXhhbXBsZSBjb2RlIGluIHRoZSBpaW9fZXZl bnRfbW9uaXRvciBwcm9ncmFtIGluIHRvb3MvaWlvIGluIHRoZQprZXJuZWwgdHJlZS4KCgo+IAo+ IFNUQVRVUzA6NglSRVZBUEEJQUNDTU9ERSBoYXMgY2hhbmdlZCBzaWduLiBQb3dlciBpcyBleHBv cnRlZCByYXRoZXIKPiB0aGFuIGltcG9ydGVkLiBVc2VyIHNwYWNlIGFwcGxpY2F0aW9uIHdvdWxk IHVzZSB0aGlzIHRvIGluZGljYXRlIHRoZSBkaXJlY3Rpb24KPiBvZiBwb3dlciBmbG93LgpUaGlz IGlzIHdoZXJlIHdlIHN0YXJ0IHRvIHJ1biBpbnRvIGEgcHJvYmxlbSAtIG1vc3RseSBJSU8gb25s eSBhbGxvd3MgZm9yCmEgc2luZ2xlIHRocmVzaG9sZCBmb3IgcmlzaW5nIGFuZCBmYWxsaW5nIG9u IGEgZ2l2ZW4gY2hhbm5lbC4gIE5vIHdheSB0bwp0ZWxsIHdoaWNoIG9uZSB0cmlnZ2VyZWQgaW4g dGhlIEFCSSAtIGV2ZW4gY29kZSBzYXlzIHdoYXQgYW5kIG9uIHdoYXQgY2hhbm5lbAppdCBkb2Vz bid0IGRpc3Rpbmd1aXNoIG11bHRpcGxlIGxldmVscy4KCldlIGNhbiBwbGF5IGdhbWVzIHdpdGgg ZGVmaW5pbmcgYWRkaXRpb25hbCBjaGFubmVscyBidXQgaXQgaXNuJ3QgdGhhdCBlbGVnYW50LgpO b3cgYXNzdW1pbmcgd2Ugd2FudCB0byBkbyBib3RoIGRpcmVjdGlvbnMgb2YgY2hhbmdlLi4KCmlu X3Bvd2VyMF90aHJlc2hfZWl0aGVyX3ZhbHVlID0gMAoodG8gaW5kaWNhdGUgYSB0cmFuc2l0aW9u IGFjcm9zcyAwIHBvd2VyIC0gSSBhc3N1bWUgdGhlIG90aGVyIGRpcmVjdGlvbiBpcwpuZWdhdGl2 ZT8pCmFuZCBhc3NvY2lhdGVkIGV2ZW50IGNvZGUuCgo+IAo+IFNUQVRVUzE6MAlOTE9BRAlBdCBs ZWFzdCBvbmUgcGhhc2UgaGFzIGVudGVyZWQgbm8gbG9hZCBjb25kaXRpb24uIFVzZXIgCj4gc3Bh Y2UgYXBwIHdvdWxkIHByb2JhYmx5IGFsZXJ0IHRoZSB1c2VyIG9mIGEgZmF1bHR5IGNvbmRpdGlv bi4KTm90IHN1cmUgd2hhdCB0aGlzIG1hcHMgdG8gLSBidXQgd291bGQgYmUgYmFzZWQgb24gaG93 IGl0IHdhcyBkZXRlY3RlZC4KSXMgdGhpcyBlZmZlY3RpdmVseSAwIGN1cnJlbnQ/Cgo+IAo+IFNU QVRVUzE6MwlaWFRPVkEJSW5kaWNhdGVzIFBoYXNlIEEgdm9sdGFnZSB6ZXJvIGNyb3NzaW5nIGlz IG1pc3NpbmcuIFRoaXMgCj4gaXMgYW5vdGhlciBmYXVsdCBjb25kaXRpb24uCgpTaW1pbGFyIHRv IHRoZSByYXRlIG9mIGNoYW5nZSBkZXRlY3Rpb24gaW4gc29tZSB3YXlzLCBidXQgb25seSBleHBs aWNpdGx5IGxvb2tzCmF0IHRoZSAwIHBvaW50LiAgV2Ugd291bGQgbmVlZCBzb21ldGhpbmcgbmV3 IHRvIHJlcHJlc2VudCB0aGlzIEkgdGhpbmsuLi4KCj4gCj4gU1RBVFVTMToxNglTQUcJVGhpcyBp bmRpY2F0ZXMgYSBzYWcgb2NjdXJyZWQgb24gb25lIG9mIHRoZSBwaGFzZXMuIFVzZXIgCj4gc3Bh Y2UgYXBwbWlnaHQgc2lnbmFsIHRoZSB1c2VyIGFuZCByZWNvcmQgdGhpcyBjb25kaXRpb24gdG8g YSBsb2cgZmlsZS4KVGhpcyBpcyBlZmZlY3RpdmVseSBhIG1lYXN1cmVtZW50IG9mIG91ciBBQyB2 b2x0YWdlIGRyb3BwaW5nPyAgU2ltcGxlIHRocmVzaG9sZApldmVudCBvbiB0aGUgcGhhc2Ugdm9s dGFnZSBJIHRoaW5rLgo+IAo+IFNUQVRVUzE6MTcJT1YJCVRoaXMgaW5kaWNhdGVzIHRoYXQgYW4g b3ZlciB2b2x0YWdlIGV2ZW50IG9jY3VycmVkIGFuZCBhIAo+IHVzZXIgc3BhY2UgYXBwIHdvdWxk IHNpZ25hbCB0aGUgdXNlciBhbmQgcmVjb3JkIHRoaXMgdG8gYSBsb2cgZmlsZS4KVm9sdGFnZSB0 aHJlc2hvbGQuCgo+IAo+IEFsbCBvZiB0aGVzZSBjb25kaXRpb25zIGNhbiBiZSBtYXNrZWQgdmlh IHRoZSBNQVNLMCBhbmQgTUFTSzEgcmVnaXN0ZXJzLgo+IAo+IE5vdCBzdXJlIGhvdyBJSU8gd291 bGQgaGFuZGxlIHRoaXM/Ck1hc2tpbmcgaXMgaGFuZGxlZCB2aWEgdGhlIHJlbGV2YW50ICpfZW4g YXR0cmlidXRlcyBmb3IgdGhlIGV2ZW50cy4KCj4gCj4gPiAKPiA+ICAgCj4gPj4+ICAgCj4gPj4+ PiAweEU1MDQJQUlNQVYJaW5fY3VycmVudEFfbWF2CVIJMjAJMzIgWlAJVQlOL0EJUGhhc2UgQSBj dXJyZW50IG1lYW4gYWJzb2x1dGUgdmFsdWUgY29tcHV0ZWQgZHVyaW5nIFBTTTAgYW5kIFBTTTEg bW9kZXMgKEFERTc4NjggYW5kIEFERTc4Nzggb25seSkuICAgIAo+ID4+PiBQcm9iYWJseSBhIGxv bmdlciBuYW1lIGFzIG1hdiBpcyBjcnlwdGljLgo+ID4+PiBpbl9jdXJyZW50MF9waGFzZUFfbWVh bmFic19yYXcgLSBpdCBjb3VsZCBoYXZlIGEgc2NhbGUgYW5kIGFsbCBzb3J0cyBvZiBmdW4uCj4g Pj4+IFNvIEkgdGhpbmsgdGhpcyBuZWVkcyB0byBiZSB1c2luZyB0aGUgbmV3IGRlcml2ZWQgaW5m cmFzdHJ1Y3R1cmUgcHJvcG9zZWQgaGVyZQo+ID4+PiByYXRoZXIgdGhhbiBiZWluZyBhbiBpbmZv X21hc2sgZWxlbWVudC4gICAgCj4gPj4gVGhlIHNhbWUgd2F5IGEga25vd2xlZGdlYWJsZSBwZXJz b24gdW5kZXJzdGFuZHMgd2hhdCBSTVMgbWVhbnMsIHNvIHRoZXkgc2hvdWxkIGFsc28gdW5kZXJz dGFuZCB3aGF0IE1BViBtZWFucy4gICAKPiA+IGhlaGUuIEkga25vdyBSTVMgYW5kIG5vdCBNQVYg c28gSSBzdXNwZWN0IGl0IGEgYml0IGRlcGVuZGVudCBvbiB3aGVyZSBleGFjdGx5IHlvdSBjYW1l IGFjcm9zcwo+ID4gdGhlIHRlcm1zIDspICAKPiBNQVYgaXMganVzdCBhbm90aGVyIHdheSB0byBj YWxjdWxhdGUgUk1TLCBidXQgaXMgbm90IGFzIGFjY3VyYXRlLiBJdCBpcyBqdXN0IGEgc3RhdGlz dGljYWwgdGVybSwgCj4gTWVhbiBBYnNvbHV0ZSBWYWx1ZSAoTUFWKS4KU3VyZS4KCj4gPiAgIAo+ ID4+PiAgIAo+ID4+Pj4gMHhFNTA1CUJJTUFWCWluX2N1cnJlbnRCX21hdglSCTIwCTMyIFpQCVUJ Ti9BCVBoYXNlIEIgY3VycmVudCBtZWFuIGFic29sdXRlIHZhbHVlIGNvbXB1dGVkIGR1cmluZyBQ U00wIGFuZCBQU00xIG1vZGVzIChBREU3ODY4IGFuZCBBREU3ODc4IG9ubHkpLgo+ID4+Pj4gMHhF NTA2CUNJTUFWCWluX2N1cnJlbnRDX21hdglSCTIwCTMyIFpQCVUJTi9BCVBoYXNlIEMgY3VycmVu dCBtZWFuIGFic29sdXRlIHZhbHVlIGNvbXB1dGVkIGR1cmluZyBQU00wIGFuZCBQU00xIG1vZGVz IChBREU3ODY4IGFuZCBBREU3ODc4IG9ubHkpLgo+ID4+Pj4gMHhFNTA3CU9JTFZMCXJlZ2lzdGVy X09JTFZMCVIvVwkyNAkzMiBaUAlVCTB4RkZGRkZGCU92ZXJjdXJyZW50IHRocmVzaG9sZC4KPiA+ Pj4+IDB4RTUwOAlPVkxWTAlyZWdpc3Rlcl9PVkxWTAlSL1cJMjQJMzIgWlAJVQkweEZGRkZGRglP dmVydm9sdGFnZSB0aHJlc2hvbGQuICAgIAo+ID4+PiBUaGVzZSBwcmVzdW1hYmx5IHJlc3VsdCBp biBpbnRlcnJ1cHRzPyAoSSdtIHJ1bm5pbmcgb3V0IG9mIHRpbWUgc28gbm90IGNoZWNraW5nKQo+ ID4+PiBJbiB3aGljaCBjYXNlIHN0YW5kYXJkIGV2ZW50IGludGVyZmFjZSBzaG91bGQgd29yay4K PiA+Pj4gICAKPiA+Pj4+IDB4RTUwOQlTQUdMVkwJcmVnaXN0ZXJfU0FHTFZMCVIvVwkyNAkzMiBa UAlVCTB4MDAwMDAwCVZvbHRhZ2UgU0FHIGxldmVsIHRocmVzaG9sZC4gICAgCj4gPj4+IFRoYXQn cyBhbm90aGVyIGV2ZW50IEkgdGhpbmvigKYgICAgIAo+ID4+IEFnYWluLCB0aGlzIGlzIG9ubHkg c2V0dGluZyB0aGUgdGhyZXNob2xkLCBub3QgZ2VuZXJhdGluZyBhbnkgZXZlbnQuICAKPiA+IAo+ ID4gV2hhdCBkb2VzIHRoZSB0aHJlc2hvbGQgcmVzdWx0IGl0PyAgUHJlc3VtYWJseSBhbiBldmVu dCBzbyB0aGlzIGlzIGV4cG9zZWQgYXMgYQo+ID4gY29udHJvbCBwYXJhbWV0ZXIgb2YgdGhlIGV2 ZW50LiAgVGhlcmUgaXMgYSB3aG9sZSBzZXQgb2YgQUJJIGZvciB0aGF04oCmICAKPiBXaGVyZSBj YW4gSSByZWFkIGFib3V0IHRoaXMuIEFyZSB0aGVyZSBhbnkgZ29vZCBpbXBsZW1lbnRhdGlvbnMg dG8gaGVscCBtZSB1bmRlcnN0YW5kPwpJbiBhIHNpbXBsZSBjYXNlIHNlZSBzb21ldGhpbmcgbGlr ZSBhZGMvbWF4MTM2My5jCgpUaGVyZSBhcmUgbW9yZSBjb21wbGV4IGNhc2VzIC0ganVzdCBncmVw IGlpb19ldmVudF9zcGVjLgoKPiA+IAo+ID4gICAKPiA+Pj4gICAKPiA+Pj4+IDB4RTUwQQlNQVNL MAlyZWdpc3Rlcl9NQVNLMAlSL1cJMzIJMzIJVQkweDAwMDAwMDAwCUludGVycnVwdCBFbmFibGUg UmVnaXN0ZXIgMC4gU2VlIFRhYmxlIDM5Lgo+ID4+Pj4gMHhFNTBCCU1BU0sxCXJlZ2lzdGVyX01B U0sxCVIvVwkzMgkzMglVCTB4MDAwMDAwMDAJSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAxLiBT ZWUgVGFibGUgNDAuICAgIAo+ID4+PiAgIAo+ID4+Pj4gMHhFNTBDCUlBV1YJaW5fY3VycmVudEFf aW5zdGFudGFuZW91cwlSCTI0CTMyIFNFCVMJTi9BCUluc3RhbnRhbmVvdXMgdmFsdWUgb2YgUGhh c2UgQSBjdXJyZW50Lgo+ID4+Pj4gMHhFNTBECUlCV1YJaW5fY3VycmVudEJfaW5zdGFudGFuZW91 cwlSCTI0CTMyIFNFCVMJTi9BCUluc3RhbnRhbmVvdXMgdmFsdWUgb2YgUGhhc2UgQiBjdXJyZW50 Lgo+ID4+Pj4gMHhFNTBFCUlDV1YJaW5fY3VycmVudENfaW5zdGFudGFuZW91cwlSCTI0CTMyIFNF CVMJTi9BCUluc3RhbnRhbmVvdXMgdmFsdWUgb2YgUGhhc2UgQyBjdXJyZW50Lgo+ID4+Pj4gMHhF NTBGCUlOV1YJaW5fY3VycmVudE5faW5zdGFudGFuZW91cwlSCTI0CTMyIFNFCVMJTi9BCUluc3Rh bnRhbmVvdXMgdmFsdWUgb2YgbmV1dHJhbCBjdXJyZW50IChBREU3ODY4IGFuZCBBREU3ODc4IG9u bHkpLgo+ID4+Pj4gMHhFNTEwCVZBV1YJaW5fdm9sdGFnZUFfaW5zdGFudGFuZW91cwlSCTI0CTMy IFNFCVMJTi9BCUluc3RhbnRhbmVvdXMgdmFsdWUgb2YgUGhhc2UgQSB2b2x0YWdlLgo+ID4+Pj4g MHhFNTExCVZCV1YJaW5fdm9sdGFnZUJfaW5zdGFudGFuZW91cwlSCTI0CTMyIFNFCVMJTi9BCUlu c3RhbnRhbmVvdXMgdmFsdWUgb2YgUGhhc2UgQiB2b2x0YWdlLgo+ID4+Pj4gMHhFNTEyCVZDV1YJ aW5fdm9sdGFnZUNfaW5zdGFudGFuZW91cwlSCTI0CTMyIFNFCVMJTi9BCUluc3RhbnRhbmVvdXMg dmFsdWUgb2YgUGhhc2UgQyB2b2x0YWdlLiAgICAKPiA+Pj4gT0ssIHRoaXMgaXMgZ2V0dGluZyBz aWxseS4gIEkgcHJlc3VtZSB0aGlzIG1lYW5zIHRoZSB2YWx1ZXMgYWJvdmUgYXJlIGZpbHRlcmVk IGFuZCB0aGVzZQo+ID4+PiBhcmVuJ3Q/ICBJZiBzbyB5b3UgbmVlZCB0byBoYXZlIGNoYW5uZWxz IGZvciBib3RoIGFuZCBkaWZmZXJlbnQgZmlsdGVyIHZhbHVlcy4gICAgCj4gPj4gVGhlc2UgYXJl IHRoZSBhY3R1YWwgc2FtcGxlcyBmcm9tIHRoZSBBREMgYW5kIG5vdCBhIGNhbGN1bGF0ZWQgbWVh c3VyZW1lbnQgb3ZlciAxMC8xMiBjeWNsZXMuIFRoZXNlIGFyZSB0aGUgc2FtcGxlcyB0aGF0IGFy ZSBwbGFjZWQgaW4gdGhlIGJ1ZmZlci4gIAo+ID4gT0ssIHNvIERDIHZhbHVlcyB3aGljaCBhbnN3 ZXJzIG15IHF1ZXN0aW9uIGFib3ZlLgo+ID4gU28gdGhpcyBpcyB0aGUgJ25vcm1hbCcgbWVhc3Vy ZW1lbnQuICBGb3IgdGhlIG11bHRpIGN5Y2xlIG9uZXMgd2UgbmVlZCB0bwo+ID4gcmVwcmVzZW50 IHRoZW0gYXMgYWRkaXRpb25hbCBtZWFzdXJlbWVudHMgdXNpbmcgdGhlIGluZGV4IGFuZCBkZXNj cmliZSB0aGUKPiA+IGZpbHRlcmluZyBhcHBsaWVkIHRvIHRoZW0gKG9yIHVzZSBhbHR2b2x0YWdl IGV0YyB0byBzYXkgd2UgYXJlIGxvb2tpbmcKPiA+IGF0IG1lYXN1cmVtZW50cyByZWxhdGVkIHRv IHRoZSBmYWN0IHRoZXkgYXJlIGFsdGVybmF0aW5nIHJhdGhlciB0aGFuIERDLiAgCj4gSSBhbnN3 ZXJlZCB0aGlzIGFib3ZlLiBJIHRoaW5rIHdlIHNob3VsZCByZW1vdmUgdGhlc2UgcmVnaXN0ZXJz IGFzIEkgY2Fubm90IHNlZSBob3cgYW55b25lIHdvdWxkIHVzZSAKPiB0aGVtCkNvb2wuIEV2ZW4g ZWFzaWVyLiAgIFRob3VnaCBpZiB3ZSBoYXZlIGEgZGV2aWNlIHRoYXQgd2lsbCBhbGxvdyB1cyB0 byBwdXNoIHRoZXNlCnRocm91Z2ggdGhlIGJ1ZmZlcmVkIGludGVyZmFjZSAocmF0aGVyIHRoYW4g dGhlIFNQSSBtYXN0ZXIgc3R1ZmYgb24gaGVyZSkKdGhlbiB3ZSB3b3VsZCBoYXZlIHRoZSBjaGFu bmVscywgYnV0IG5vdCBleHBvcnQgdGhlIF9SQVcgYXR0cmlidXRlIC0gdGh1cwptYWtpbmcgdGhl bSByZWFkYWJsZSBvbmx5IGFzIGEgc3RyZWFtIG9mIGRhdGEuCgo+ID4gICAKPiA+Pj4gICAKPiA+ Pj4+IDB4RTUxMwlBV0FUVAlpbl9wb3dlckFfaW5zdGFudGFuZW91cwlSCTI0CTMyIFNFCVMJTi9B CUluc3RhbnRhbmVvdXMgdmFsdWUgb2YgUGhhc2UgQSB0b3RhbCBhY3RpdmUgcG93ZXIuCj4gPj4+ PiAweEU1MTQJQldBVFQJaW5fcG93ZXJCX2luc3RhbnRhbmVvdXMJUgkyNAkzMiBTRQlTCU4vQQlJ bnN0YW50YW5lb3VzIHZhbHVlIG9mIFBoYXNlIEIgdG90YWwgYWN0aXZlIHBvd2VyLgo+ID4+Pj4g MHhFNTE1CUNXQVRUCWluX3Bvd2VyQ19pbnN0YW50YW5lb3VzCVIJMjQJMzIgU0UJUwlOL0EJSW5z dGFudGFuZW91cyB2YWx1ZSBvZiBQaGFzZSBDIHRvdGFsIGFjdGl2ZSBwb3dlci4KPiA+Pj4+IDB4 RTUxNglBVkFSCWluX3Bvd2VycmVhY3RpdmVBX2luc3RhbnRhbmVvdXMJUgkyNAkzMiBTRQlTCU4v QQlJbnN0YW50YW5lb3VzIHZhbHVlIG9mIFBoYXNlIEEgdG90YWwgcmVhY3RpdmUgcG93ZXIgKEFE RTc4NTgsIEFERTc4NjgsIGFuZCBBREU3ODc4IG9ubHkpLgo+ID4+Pj4gMHhFNTE3CUJWQVIJaW5f cG93ZXJyZWFjdGl2ZUJfaW5zdGFudGFuZW91cwlSCTI0CTMyIFNFCVMJTi9BCUluc3RhbnRhbmVv dXMgdmFsdWUgb2YgUGhhc2UgQiB0b3RhbCByZWFjdGl2ZSBwb3dlciAoQURFNzg1OCwgQURFNzg2 OCwgYW5kIEFERTc4Nzggb25seSkuCj4gPj4+PiAweEU1MTgJQ1ZBUglpbl9wb3dlcnJlYWN0aXZl Q19pbnN0YW50YW5lb3VzCVIJMjQJMzIgU0UJUwlOL0EJSW5zdGFudGFuZW91cyB2YWx1ZSBvZiBQ aGFzZSBDIHRvdGFsIHJlYWN0aXZlIHBvd2VyIChBREU3ODU4LCBBREU3ODY4LCBhbmQgQURFNzg3 OCBvbmx5KS4KPiA+Pj4+IDB4RTUxOQlBVkEJaW5fcG93ZXJhcHBhcmVudEFfaW5zdGFudGFuZW91 cwlSCTI0CTMyIFNFCVMJTi9BCUluc3RhbnRhbmVvdXMgdmFsdWUgb2YgUGhhc2UgQSBhcHBhcmVu dCBwb3dlci4KPiA+Pj4+IDB4RTUxQQlCVkEJaW5fcG93ZXJhcHBhcmVudEJfaW5zdGFudGFuZW91 cwlSCTI0CTMyIFNFCVMJTi9BCUluc3RhbnRhbmVvdXMgdmFsdWUgb2YgUGhhc2UgQiBhcHBhcmVu dCBwb3dlci4KPiA+Pj4+IDB4RTUxQglDVkEJaW5fcG93ZXJhcHBhdGVudENfaW5zdGFudGFuZW91 cwlSCTI0CTMyIFNFCVMJTi9BCUluc3RhbnRhbmVvdXMgdmFsdWUgb2YgUGhhc2UgQyBhcHBhcmVu dCBwb3dlci4gICAgCj4gPj4+IFNhbWUgZm9yIGFsbCBvZiB0aGVzZS4KPiA+Pj4gICAKPiA+Pj4+ IDB4RTUxRglDSEVDS1NVTQlyZWdpc3Rlcl9DSEVDS1NVTQlSCTMyCTMyCVUJMHgzMzY2Njc4NwlD aGVja3N1bSB2ZXJpZmljYXRpb24uIFNlZSB0aGUgQ2hlY2tzdW0gUmVnaXN0ZXIgc2VjdGlvbiBm b3IgZGV0YWlscy4gICAgCj4gPj4+IE5vdCBleHBvc2VkIHRvIHVzZXJzcGFjZS4gICAgCj4gPj4g WWVhaCwgdGhpcyBpcyBvbmx5IHVzZWQgdG8gY2hlY2sgdGhlIGNvbW11bmljYXRpb24gZm9yIGVy cm9ycy4gIAo+ID4+PiAgIAo+ID4+Pj4gMHhFNTIwCVZOT00JaW5fdm9sdGFnZV9ybXNfbm9taW5h bAlSL1cJMjQJMzIgWlAJUwkweDAwMDAwMAlOb21pbmFsIHBoYXNlIHZvbHRhZ2Ugcm1zIHVzZWQg aW4gdGhlIGFsdGVybmF0aXZlIGNvbXB1dGF0aW9uIG9mIHRoZSBhcHBhcmVudCBwb3dlci4gV2hl biB0aGUgVk5PTXhFTiBiaXQgaXMgc2V0LCB0aGUgYXBwbGllZCB2b2x0YWdlIGlucHV0IGluIHRo ZSBjb3JyZXNwb25kaW5nIHBoYXNlIGlzIGlnbm9yZWQgYW5kIGFsbCBjb3JyZXNwb25kaW5nIHJt cyB2b2x0YWdlIGluc3RhbmNlcyBhcmUgcmVwbGFjZWQgYnkgdGhlIHZhbHVlIGluIHRoZSBWTk9N IHJlZ2lzdGVyLiAgICAKPiA+Pj4gV2h5IHdvdWxkIHRoaXMgYmUgZG9uZT8gIFNvdW5kcyBsaWtl IHNvbWV0aGluZyB0aGF0IGlzIGEgY2lyY3VpdCBkZXNpZ24gdGltZQo+ID4+PiBkZWNpc2lvbiBz byBhIGpvYiBmb3IgRFQgdG8gbWUuICAgIAo+ID4+IFllYWgsIEkgYWdyZWUuICAKPiA+Pj4gICAK PiA+Pj4+IDB4RTYwMAlQSFNUQVRVUwlpbl9jdXJyZW50X3BoYXNlX3BlYWsJUgkxNgkxNglVCU4v QQlQaGFzZSBwZWFrIHJlZ2lzdGVyLiBTZWUgVGFibGUgNDEuCj4gPj4+PiAweEU2MDEJQU5HTEUw CXJlZ2lzdGVyX0FOR0xFMAlSCTE2CTE2CVUJTi9BCVRpbWUgRGVsYXkgMC4gU2VlIHRoZSBUaW1l IEludGVydmFsIEJldHdlZW4gUGhhc2VzIHNlY3Rpb24gZm9yIGRldGFpbHMuCj4gPj4+PiAweEU2 MDIJQU5HTEUxCXJlZ2lzdGVyX0FOR0xFMQlSCTE2CTE2CVUJTi9BCVRpbWUgRGVsYXkgMS4gU2Vl IHRoZSBUaW1lIEludGVydmFsIEJldHdlZW4gUGhhc2VzIHNlY3Rpb24gZm9yIGRldGFpbHMuCj4g Pj4+PiAweEU2MDMJQU5HTEUyCXJlZ2lzdGVyX0FOR0xFMglSCTE2CTE2CVUJTi9BCVRpbWUgRGVs YXkgMi4gU2VlIHRoZSBUaW1lIEludGVydmFsIEJldHdlZW4gUGhhc2VzIHNlY3Rpb24gZm9yIGRl dGFpbHMuICAgIAo+ID4+PiBIbW0uIE1vcmUgZnVuLiAgVGhlc2UgYXJlIGRlcml2ZWQgdmFsdWVz IGJldHdlZW4gdG8gcGhhc2UgbWVhc3VyZW1lbnRzLiAKPiA+Pj4gVGhlIHBoYXNlIGFzIGEgbW9k aWZpZXIgZmFsbHMgZG93biBhIGJpdCBoZXJlIC0gaWYgd2UgaGFkIGp1c3QgdHJlYXRlZAo+ID4+ PiB0aGVtIGFzIGNoYW5uZWxzIHdlIGNvdWxkIGhhdmUgZG9uZSB0aGlzIGEgZGlmZmVyZW50aWFs IGFuZ2xlIGNoYW5uZWwuCj4gPj4+IFJpZ2h0IG5vdyBJJ20gbm90IHN1cmUgaG93IHdlIGRvIHRo aXMsIGNvdWxkIGRvIGl0IGFzIGEgZGVyaXZlZCB2YWx1ZXMgc28gc29tZXRoaW5nIGxpa2UKPiA+ Pj4gaW5fYW5nbGUwX3BoYXNlQSZwaGFzZUJfZGlmZl9yYXcgZXRjIGJ1dCB0aGF0IGZlZWxzIG9k ZC4KPiA+Pj4gVGhpcyBvbmUgbmVlZHMgbW9yZSB0aG91Z2h0Lgo+ID4+PiAgIAo+ID4+Pj4gMHhF NjA0IHRvIDB4RTYwNglSZXNlcnZlZAkJCQkJCQlUaGVzZSBhZGRyZXNzZXMgc2hvdWxkIG5vdCBi ZSB3cml0dGVuIGZvciBwcm9wZXIgb3BlcmF0aW9uLgo+ID4+Pj4gMHhFNjA3CVBFUklPRAlyZWdp c3Rlcl9QRVJJT0QJUgkxNgkxNglVCU4vQQlOZXR3b3JrIGxpbmUgcGVyaW9kLiAgICAKPiA+Pj4g U3VwZXJmaWNpYWxseSB0aGlzIHNvdW5kcyBsaWtlIGEgY2hhbm5lbCBmcmVlIGVsZW1lbnQgc28g c2hhcmVkX2J5X2FsbC4KPiA+Pj4gICAKPiA+Pj4+IDB4RTYwOAlQSE5PTE9BRAlyZWdpc3Rlcl9Q SE5PTE9BRAlSCTE2CTE2CVUJTi9BCVBoYXNlIG5vIGxvYWQgcmVnaXN0ZXIuIFNlZSBUYWJsZSA0 Mi4gICAgCj4gPj4+IEhtbS4gU28gdGhpcyBpcyBraW5kIG9mIGEgc2V0IG9mIGV2ZW50cyB3aXRo IGJ1dCB3aXRob3V0IEkgdGhpbmsgYW4gaW50ZXJydXB0Lgo+ID4+PiBPZGQuCj4gPj4+ICAgCj4g Pj4+PiAweEU2MEMJTElORUNZQwlyZWdpc3Rlcl9MSU5FQ1lDCVIvVwkxNgkxNglVCTB4RkZGRglM aW5lIGN5Y2xlIGFjY3VtdWxhdGlvbiBtb2RlIGNvdW50LiAgICAKPiA+Pj4gaW5fY291bnQwX3Jh dyBwcm9iYWJseSB0aG91Z2ggaXQncyBhIGJpdCBvZiBhIHN0cmV0Y2guCj4gPj4+ICAgCj4gPj4+ PiAweEU2MEQJWlhUT1VUCXJlZ2lzdGVyX1pYVE9VVAlSL1cJMTYJMTYJVQkweEZGRkYJWmVyby1j cm9zc2luZyB0aW1lb3V0IGNvdW50LiAgICAKPiA+Pj4gVGhpcyBpcyBnb2luZyB0byBiZSBhbm90 aGVyIHRvcCBsZXZlbCBvbmUgSSB0aGluayBhbmQgZGV2aWNlIHNwZWNpZmljIGZvciBub3cuCj4g Pj4+ICAgCj4gPj4+PiAweEU2MEUJQ09NUE1PREUJcmVnaXN0ZXJfQ09NUE1PREUJUi9XCTE2CTE2 CVUJMHgwMUZGCUNvbXB1dGF0aW9uLW1vZGUgcmVnaXN0ZXIuIFNlZSBUYWJsZSA0My4gICAgCj4g Pj4+IElmIHRoZXJlIGlzIHN0dWZmIHRvIGNvbnRyb2wgaW4gaGVyZSBpdCBuZWVkIGJyZWFraW5n IG91dC4KPiA+Pj4gICAKPiA+Pj4+IDB4RTYwRglHYWluCXJlZ2lzdGVyX0dhaW4JUi9XCTE2CTE2 CVUJMHgwMDAwCVBHQSBnYWlucyBhdCBBREMgaW5wdXRzLiBTZWUgVGFibGUgNDQuICAgIAo+ID4+ PiBPaCBnb29keSBhbm90aGVyIHNjYWxlIHZhbHVlLiBOZWVkcyBicmVha2luZyB1cCBpbnRvIHNl cGFyYXRlIGNvbnRyb2xzLgo+ID4+PiBEbyB0aGVzZSBkaXJlY3RseSBlZmZlY3QgdGhlIG1lYXN1 cmVkIG91dHB1dCB2b2x0YWdlIGV0Yz8gSWYgdGhleSBkbyB0aGVuCj4gPj4+IEknbSBub3Qgc3Vy ZSBob3cgdG8gc2VwYXJhdGUgdGhlIHR3byBnYWlucywgdGhlcmUgb3VnaHQgdG8gYmUgYSAncmln aHQnCj4gPj4+IGFuc3dlci4gIElmIHRoaXMgaXMgYWJvdXQgbWF0Y2hpbmcgdG8gdGhlIGNpcmN1 aXQgcHJlc2VudCB0aGVuIHRoZXkKPiA+Pj4gc2hvdWxkIHByb2JhYmx5IGJlIGNvbWluZyBmcm9t IERUIG9yIHNpbWlsbGFyLgo+ID4+PiAKPiA+Pj4gICAKPiA+Pj4+IDB4RTYxMAlDRk1PREUJcmVn aXN0ZXJfQ0ZNT0RFCVIvVwkxNgkxNglVCTB4MEU4OAlDRnggY29uZmlndXJhdGlvbiByZWdpc3Rl ci4gU2VlIFRhYmxlIDQ1Lgo+ID4+Pj4gMHhFNjExCUNGMURFTglyZWdpc3Rlcl9DRjFERU4JUi9X CTE2CTE2CVUJMHgwMDAwCUNGMSBkZW5vbWluYXRvci4KPiA+Pj4+IDB4RTYxMglDRjJERU4JcmVn aXN0ZXJfQ0YyREVOCVIvVwkxNgkxNglVCTB4MDAwMAlDRjIgZGVub21pbmF0b3IuCj4gPj4+PiAw eEU2MTMJQ0YzREVOCXJlZ2lzdGVyX0NGM0RFTglSL1cJMTYJMTYJVQkweDAwMDAJQ0YzIGRlbm9t aW5hdG9yLiAgICAKPiA+Pj4gQXJlIHRoZXNlIHRoaW5ncyB0aGF0IHNob3VsZCBiZSBpbiBEVD8g IExvb2sgdmVyeSBxdWlja2x5IGxpa2UgdGhleSBhcmUgdG9kbyB3aXRoIG90aGVyIGNpcmN1aXRz IG5lYXJieS4gICAgCj4gPj4gQWdyZWVkICAKPiA+Pj4gICAKPiA+Pj4+IDB4RTYxNAlBUEhDQUwJ cmVnaXN0ZXJfQVBIQ0FMCVIvVwkxMAkxNiBaUAlTCTB4MDAwMAlQaGFzZSBjYWxpYnJhdGlvbiBv ZiBQaGFzZSBBLiBTZWUgVGFibGUgNDYuCj4gPj4+PiAweEU2MTUJQlBIQ0FMCXJlZ2lzdGVyX0JQ SENBTAlSL1cJMTAJMTYgWlAJUwkweDAwMDAJUGhhc2UgY2FsaWJyYXRpb24gb2YgUGhhc2UgQi4g U2VlIFRhYmxlIDQ2Lgo+ID4+Pj4gMHhFNjE2CUNQSENBTAlyZWdpc3Rlcl9fQ1BIQ0FMCVIvVwkx MAkxNiBaUAlTCTB4MDAwMAlQaGFzZSBjYWxpYnJhdGlvbiBvZiBQaGFzZSBDLiBTZWUgVGFibGUg NDYuICAgIAo+ID4+PiBJJ20gbm90IGFjdHVhbGx5IHN1cmUgaG93IHlvdSB3b3VsZCBzZXQgdGhl c2UuICBQZXIgY2lyY3VpdCBkZXNpZ24/ICAgIAo+ID4+IFRoZXJlIHNob3VsZCBiZSBzb21lIGJh c2UgY2FsaWJyYXRpb24gc3RvcmVkIGluIERUIGFuZCBmaW5lIHR1bmVkIGNhbGlicmF0aW9uIHN0 b3JlZCBpbiBhbiBJTkkgZmlsZSBvciBjdXN0b20gZWVwcm9tIG9mIG52cmFtLiAgIAo+ID4gSG1t LiBUaGVuIHdlIG5lZWQgdG8gZXhwb3NlIHRoZW0gdG8gdXNlcnNwYWNlIHRvIGFsbG93IHRoYXQg SU5JIHRvIGJlIGFwcGxpZWQuCj4gPiAKPiA+IExldHMgZGVhbCB3aXRoIHRoZSByZXN0IGZpcnN0 IGFuZCBjb21lIGJhY2sgdG8gdGhlc2UuIE1heSB3ZWxsIG5lZWQKPiA+IHNvbWUgZGV2aWNlIHNw ZWNpZmljIEFCSSB3aGljaCBpcyBhbHdheXMgYW5ub3lpbmcuLiAgCj4gQWdyZWVkCj4gPiAgIAo+ ID4+PiAgIAo+ID4+Pj4gMHhFNjE3CVBIU0lHTglyZWdpc3Rlcl9QSFNJR04JUgkxNgkxNglVCU4v QQlQb3dlciBzaWduIHJlZ2lzdGVyLiBTZWUgVGFibGUgNDcuCj4gPj4+PiAweEU2MTgJQ09ORklH CXJlZ2lzdGVyX0NPTkZJRwlSL1cJMTYJMTYJVQkweDAwMDAJQURFNzg3OCBjb25maWd1cmF0aW9u IHJlZ2lzdGVyLiBTZWUgVGFibGUgNDguCj4gPj4+PiAweEU3MDAJTU1PREUJcmVnaXN0ZXJfX01N T0RFCVIvVwk4CTgJVQkweDFDCU1lYXN1cmVtZW50IG1vZGUgcmVnaXN0ZXIuIFNlZSBUYWJsZSA0 OS4KPiA+Pj4+IDB4RTcwMQlBQ0NNT0RFCXJlZ2lzdGVyX19BQ0NNT0RFCVIvVwk4CTgJVQkweDAw CUFjY3VtdWxhdGlvbiBtb2RlIHJlZ2lzdGVyLiBTZWUgVGFibGUgNTAuCj4gPj4+PiAweEU3MDIJ TENZQ01PREUJcmVnaXN0ZXJfTENZQ01PREUJUi9XCTgJOAlVCTB4NzgJTGluZSBhY2N1bXVsYXRp b24gbW9kZSBiZWhhdmlvci4gU2VlIFRhYmxlIDUyLiAgICAKPiA+PiBBbGwgdG8gRFQgIAo+ID4+ Pj4gMHhFNzAzCVBFQUtDWUMJcmVnaXN0ZXJfUEVBS0NZQwlSL1cJOAk4CVUJMHgwMAlQZWFrIGRl dGVjdGlvbiBoYWxmIGxpbmUgY3ljbGVzLgo+ID4+Pj4gMHhFNzA0CVNBR0NZQwlyZWdpc3Rlcl9T QUdDWUMJUi9XCTgJOAlVCTB4MDAJU0FHIGRldGVjdGlvbiBoYWxmIGxpbmUgY3ljbGVzLiAgICAK PiA+Pj4gU29tZSBvZiB0aGVzZSBhcmUgZXZlbnQgY29udHJvbHMuIE1hcCB0aGVtIGFzIHN1Y2gu ICAgIAo+ID4+IEFncmVlZCAgCj4gPj4+ICAgCj4gPj4+PiAweEU3MDUJQ0ZDWUMJcmVnaXN0ZXJf Q0ZDWUMJUi9XCTgJOAlVCTB4MDEJTnVtYmVyIG9mIENGIHB1bHNlcyBiZXR3ZWVuIHR3byBjb25z ZWN1dGl2ZSBlbmVyZ3kgbGF0Y2hlcy4gU2VlIHRoZSBTeW5jaHJvbml6aW5nIEVuZXJneSBSZWdp c3RlcnMgd2l0aCBDRnggT3V0cHV0cyBzZWN0aW9uLgo+ID4+Pj4gMHhFNzA2CUhTRENfQ0ZHCXJl Z2lzdGVyX0hTRENfQ0ZHCVIvVwk4CTgJVQkweDAwCUhTREMgY29uZmlndXJhdGlvbiByZWdpc3Rl ci4gU2VlIFRhYmxlIDUzLiAgICAKPiA+PiBEVCAgCj4gPj4+PiAweEU3MDcJVmVyc2lvbglyZWdp c3Rlcl9WZXJzaW9uCVIJOAk4CVUJCVZlcnNpb24gb2YgZGllLiAgICAKPiA+PiBNaWdodCB3YW50 IHRvIGV4cG9zZSB0aGlzIHRvIFVzZXIgU3BhY2UgYXMgdGhlcmUgY291bGQgYmUgZGlmZmVyZW5j ZXMgYmV0d2VlbiBkaWUgdmVyc2lvbgo+ID4+IGluX3ZlcnNpb24wX3JhdyAgCj4gPj4+PiAweEVC RkYJUmVzZXJ2ZWQJCQk4CTgJCQlUaGlzIGFkZHJlc3MgY2FuIGJlIHVzZWQgaW4gbWFuaXB1bGF0 aW5nIHRoZSBTUy9IU0EgcGluIHdoZW4gU1BJIGlzIGNob3NlbiBhcyB0aGUgYWN0aXZlIHBvcnQu IFNlZSB0aGUgU2VyaWFsIEludGVyZmFjZXMgc2VjdGlvbiBmb3IgZGV0YWlscy4KPiA+Pj4+IDB4 RUMwMAlMUE9JTFZMCXJlZ2lzdGVyX0xQT0lMVkwJUi9XCTgJOAlVCTB4MDcJIk92ZXJjdXJyZW50 IHRocmVzaG9sZCB1c2VkIGR1cmluZyBQU00yIG1vZGUgKEFERTc4NjggYW5kIEFERTc4NzgKPiA+ Pj4+IG9ubHkpLiBTZWUgVGFibGUgNTQgaW4gd2hpY2ggdGhlIHJlZ2lzdGVyIGlzIGRldGFpbGVk LiIKPiA+Pj4+IDB4RUMwMQlDT05GSUcyCXJlZ2lzdGVyX0NPTkZJRzIJUi9XCTgJOAlVCTB4MDAJ Q29uZmlndXJhdGlvbiByZWdpc3RlciB1c2VkIGR1cmluZyBQU00xIG1vZGUuIFNlZSBUYWJsZSA1 NS4gICAgCj4gPj4gQWxsIHRvIERUICAKPiA+Pj4gCj4gPj4+IEFzIHlvdSBjYW4gZ3Vlc3MgSSB3 YXMgcnVubmluZyBvdXQgb2Ygc3RhbWluYSB0b3dhcmRzIHRoZSBlbmQgb2YgdGhhdC4KPiA+Pj4g Cj4gPj4+IEknbSBub3QgdG90YWxseSBzdXJlIG9mIHRoZSBhbnN3ZXIgSSBwcm92aWRlZC4gSXQg bWF5IHRha2Ugc29tZSBtb3JlIHRob3VnaHQuCj4gPj4+IElkZWFsbHkgc29tZSBvdGhlcnMgd2ls bCBnaXZlIGlucHV0IG9uIHRoaXMgcXVlc3Rpb24uICAgIAo+ID4+IAo+ID4+IFRoYW5rIHlvdSBh Z2FpbiBmb3IgYWxsIHlvdXIgZmVlZGJhY2suIEnigJlsbCBnZW5lcmF0ZSBhIG5ldyBsaXN0IGFu ZCBzZW5kIGl0IG5leHQuICAKPiA+IENvb2wuCj4gPiAKPiA+IEpvbmF0aGFuCj4gPiAgIAo+ID4+ IAo+ID4+IFJlZ2FyZHMsCj4gPj4gSm9obiAgCj4gPj4+IAo+ID4+PiBKb25hdGhhbiAgICAKPiA+ Pj4+IAo+ID4+Pj4gUmVnYXJkcywKPiA+Pj4+IEpvaG4KPiA+Pj4+IAo+ID4+Pj4gCj4gPj4+PiAK PiA+Pj4+IAo+ID4+Pj4gICAKPiA+Pj4+PiBPbiBNYXIgMTcsIDIwMTgsIGF0IDE6MzAgUE0sIEpv bmF0aGFuIENhbWVyb24gPGppYzIzQGtlcm5lbC5vcmc+IHdyb3RlOgo+ID4+Pj4+IAo+ID4+Pj4+ IE9uIFdlZCwgMTQgTWFyIDIwMTggMjM6MTI6MDIgLTA3MDAKPiA+Pj4+PiBKb2huIFN5bmUgPGpv aG4zOTA5QGdtYWlsLmNvbT4gd3JvdGU6Cj4gPj4+Pj4gICAKPiA+Pj4+Pj4gSGkgSm9uYXRoYW4s Cj4gPj4+Pj4+IAo+ID4+Pj4+PiBJIGhhdmUgYmVlbiBsb29raW5nIGF0IHRoZSBJSU8gQUJJIGRv Y3MgYW5kIGlmIEkgdW5kZXJzdGFuZAo+ID4+Pj4+PiBjb3JyZWN0bHksIHRoZSBpZGVhIGlzIHRv IHVzZSBjb25zaXN0ZW50IG5hbWluZyBjb252ZW50aW9ucz8gU28gZm9yCj4gPj4+Pj4+IGV4YW1w bGUsIGxvb2tpbmcgYXQgdGhlIEFERTc4NTQgZGF0YXNoZWV0LCB0aGUgbmFtaW5nIG1hdGNoaW5n IHRoZQo+ID4+Pj4+PiBBREU3ODU0IHJlZ2lzdGVycyB3b3VsZCBiZSBhcyBmb2xsb3dzOiAgICAg IAo+ID4+Pj4+IAo+ID4+Pj4+IFdlbGNvbWUgdG8gb25lIG9mIHRoZSBiaWcgcmVhc29ucyBubyBv bmUgdGlkaWVkIHRoZXNlIGRyaXZlcnMKPiA+Pj4+PiB1cCBvcmlnaW5hbGx5LiAgU3RpbGwgd2Ug aGF2ZSBtb3ZlZCBvbiBzb21ld2hhdCBzaW5jZSB0aGVuCj4gPj4+Pj4gc28gc2ltaWxhciBjaXJj dW1zdGFuY2VzIGhhdmUgY29tZSB1cCBpbiBvdGhlciB0eXBlcyBvZiBzZW5zb3IuCj4gPj4+Pj4g ICAKPiA+Pj4+Pj4gCj4gPj4+Pj4+IHtkaXJlY3Rpb259X3t0eXBlfV97aW5kZXh9X3ttb2RpZmll cn1fe2luZm9fbWFza30KPiA+Pj4+Pj4gCj4gPj4+Pj4+IEFJR0FJTgktCUluX2N1cnJlbnRfYV9n YWluICAgICAgCj4gPj4+Pj4gT3RoZXIgdGhhbiB0aGUgZmFjdCB0aGF0IGdhaW4gaXNuJ3QgYW4g QUJJIGVsZW1lbnQgYW5kIHRoYXQgaW5kZXgKPiA+Pj4+PiBkb2Vzbid0IGhhdmUKPiA+Pj4+PiBf IGJlZm9yZSBpdCB0aGF0IGlzIHJpZ2h0Lgo+ID4+Pj4+IGluX3ZvbHRhZ2VBX3NjYWxlCj4gPj4+ Pj4gCj4gPj4+Pj4gVGhhdCB3YXMgYSB3ZWlyZCBxdWlyayBhIGxvbmcgdGltZSBiYWNrIHdoaWNo IHdlIHNob3VsZCBwcm9iYWJseQo+ID4+Pj4+IG5vdCBoYXZlIGRvbmUgKGNvcGllZCBpdCBmcm9t IGh3bW9uKQo+ID4+Pj4+ICAgCj4gPj4+Pj4+IEFWR0FJTgktCWluX3ZvbHRhZ2VfYV9nYWluCj4g Pj4+Pj4+IEJJR0FJTgktCWluX2N1cnJlbnRfYl9nYWluCj4gPj4+Pj4+IEJWR0FJTgktCWluX3Zv bHRhZ2VfYl9nYWluCj4gPj4+Pj4+IOKAlAo+ID4+Pj4+PiBIb3cgZG8gd2UgcmVwcmVzZW50IHRo ZSBybXMgYW5kIG9mZnNldAo+ID4+Pj4+PiBBSVJNU09TCS0JaW5fY3VycmVudF9hX3Jtc29mZnNl dAo+ID4+Pj4+PiBBVlJNU09TCS0JaW5fdm9sdGFnZV9hX3Jtc29mZnNldCAgICAgIAo+ID4+Pj4+ IAo+ID4+Pj4+IFJpZ2h0IG5vdyB3ZSBjYW4ndCB1bmZvcnR1bmF0ZWx5IHRob3VnaCB0aGlzIG9u ZSBpcyBlYXNpZXIgdG8gZml4Lgo+ID4+Pj4+IFdlIGFscmVhZHkgaGF2ZSBtb2RpZmllcnMgZm9y IG11bHRpIGF4aXMgZGV2aWNlcyBkb2luZyBzdW1fc3F1YXJlZAo+ID4+Pj4+IHNvIGFkZCBvbmUg b2YgdGhvc2UgZm9yIHJvb3RfbWVhbl9zcXVhcmUgLSB0aGlzIG9uZSBpcyB3ZWxsIGtub3duCj4g Pj4+Pj4gZW5vdWdoIHRoYXQgcm1zIGlzIGZpbmUgaW4gdGhlIHN0cmluZy4KPiA+Pj4+PiAKPiA+ Pj4+PiBJdCdzIGEgZWZmZWN0aXZlbHkgYSBkaWZmZXJlbnQgY2hhbm5lbCBiZSBpdCBvbmUgZGVy aXZlZCBmcm9tIGEgc2ltcGxlCj4gPj4+Pj4gb25lLiAgVGhpcyBpcyBnb2luZyB0byBnZXQgdHJp Y2t5IGhvd2V2ZXIgYXMgd2Ugd291bGQgbm9ybWFsbHkgdXNlCj4gPj4+Pj4gbW9kaWZpZXIgdG8g c3BlY2lhbGlzZSBhIGNoYW5uZWwgdHlwZSAtIHRob3VnaHRzIG9uIHRoaXMgYmVsb3cuCj4gPj4+ Pj4gICAKPiA+Pj4+Pj4g4oCUCj4gPj4+Pj4+IEhlcmUgSSBkb27igJl0IHVuZGVyc3RhbmQgaG93 IHRvIHJlcHJlc2VudCBib3RoIHRoZSBwaGFzZSBhbmQgdGhlIGFjdGl2ZS9yZWFjdGl2ZS9hcHBh cmVudCBwb3dlciBjb21wb25lbnRzLiBEbyB3ZSBjb21iaW5lIHRoZSBwaGFzZSBhbmQgcXVhZHJh dHVyZSBwYXJ0IGxpa2UgdGhpcwo+ID4+Pj4+PiBBVkFHQUlOCQktCWluX3Bvd2VyX2FfZ2FpbgkJ CQkvKiBhcHBhcmVudCBwb3dlciAqLwo+ID4+Pj4+PiDigJQKPiA+Pj4+Pj4gQVdHQUlOCQktCWlu X3Bvd2VyX2FpX2dhaW4JCQkJLyogYWN0aXZlIHBvd2VyICovICAgICAgCj4gPj4+Pj4gQW5kIHRo YXQgaXMgdGhlIHByb2JsZW0uICBIb3cgZG8gd2UgcmVwcmVzZW50IHRoZSB2YXJpb3VzIHBvd2Vy IHR5cGVzLgo+ID4+Pj4+IEhtbS4gV2UgY291bGQgZG8gaXQgd2l0aCBtb2RpZmllcnMgYnV0IGFi b3ZlIHdlIHNob3cgdGhhdCB3ZSBoYXZlIGFscmVhZHkgdXNlZCB0aGVtLgo+ID4+Pj4+IAo+ID4+ Pj4+IEl0IHdvdWxkIGJlIGVhc3kgZW5vdWdoIHRvIGFkZCB5ZXQgYW5vdGhlciBmaWVsZCB0byB0 aGUgY2hhbm5lbCBzcGVjIHRvIHNwZWNpZnkKPiA+Pj4+PiB0aGlzIGJ1dCB0aGVyZSBpcyBhIHBy b2JsZW0gLSBFdmVudHMuICBUaGUgZXZlbnQgZm9ybWF0IGlzIGFscmVhZHkgcHJldHR5IGZ1bGwK PiA+Pj4+PiBzbyB3aGVyZSBkbyB3ZSBwdXQgdGhpcyBleHRyYSBlbGVtZW50IGlmIHdlIG5lZWQg dG8gZGVmaW5lIGEgY2hhbm5lbCBzZXBhcmF0ZWQKPiA+Pj4+PiBvbmx5IGJ5IGl0Lgo+ID4+Pj4+ IAo+ID4+Pj4+IE9uZSB0aG91Z2h0IGlzIHdlIGNvdWxkIGluc3RlYWQgZGVmaW5lIHRoZXNlIGFz IGRpZmZlcmVudCB0b3AgbGV2ZWwKPiA+Pj4+PiBJSU9fQ0hBTl9UWVBFUyBpbiBhIHNpbWlsYXIg ZmFzaGlvbiB0byB3ZSBkbyBmb3IgcmVsYXRpdmUgaHVtaWRpdHkgdnMKPiA+Pj4+PiB0aGUgcHJv cG9zZWQgYWJzb2x1dGUgaHVtaWRpdHkuCj4gPj4+Pj4gCj4gPj4+Pj4gaW5fcG93ZXJyZWFjdGl2 ZUFfc2NhbGUKPiA+Pj4+PiBpbl9wb3dlcmFjdGl2Y2VBX3NjYWxlCj4gPj4+Pj4gKG9yIGluX3Bv d2VycmVhbEFfc2NhbGUgdG8gbWF0Y2ggd2l0aCB3aGF0IEkgZ290IHRhdWdodCB5ZWFycyBhZ28/ KQo+ID4+Pj4+IAo+ID4+Pj4+IEkgcHJlc3VtZSB3ZSBrZWVwIGluX3Bvd2VyQV9zY2FsZSBldGMg Zm9yIHRoZSBhcHBhcmVudCBwb3dlciBhbmQKPiA+Pj4+PiBtb2RpZnkgYW55IGRvY3MgdG8gbWFr ZSB0aGF0IGNsZWFyLgo+ID4+Pj4+ICAgCj4gPj4+Pj4+IOKAlAo+ID4+Pj4+PiBBVkFSR0FJTgkt CWluX3Bvd2VyX2FxX2dhaW4JCQkJLyogcmVhY3RpdmUgcG93ZXIgKi8KPiA+Pj4+Pj4g4oCUCj4g Pj4+Pj4+IE5vdyBoZXJlIGl0IGJlY29tZXMgbW9yZSBjb21wbGljYXRlZC4gTm90IHN1cmUgaG93 IHRoaXMgZ2V0cyBoYW5kbGVkLiAKPiA+Pj4+Pj4gQUZXQVRUT1MJLQlpbl9wb3dlcl9hX2FjdGl2 ZS9mdW5kYW1lbnRhbC9vZmZzZXQgICAgICAKPiA+Pj4+PiBZZWFoLCBzb21lIG9mIHRoZXNlIGFy ZSBnZXR0aW5nIG9kZC4KPiA+Pj4+PiBJZiBJIHJlYWQgdGhpcyBjb3JyZWN0bHkgdGhpcyBpcyB0 aGUgYWN0aXZlIHBvd2VyIGVzdGltYXRlIGJhc2VkIG9uIG9ubHkKPiA+Pj4+PiB0aGUgZnVuZGFt ZW50YWwgZnJlcXVlbmN5IC0gc28gbm8gaGFybW9uaWNzPwo+ID4+Pj4+IAo+ID4+Pj4+IEhtbS4g IFRoaXMgdGhlbiBiZWNvbWVzIGEgc2VwYXJhdGUgY2hhbm5lbCB3aXRoIGFkZGl0aW9uYWwgcHJv cGVydGllcwo+ID4+Pj4+IHNwZWNpZnlpbmcgaXQgaXMgb25seSB0aGUgZnVuZGFtZW50YWwuICBU aGlzIGZlZWxzIGEgYml0IGxpa2UgYSBmaWx0ZXIKPiA+Pj4+PiBiZSBpdCBhbiB1bnVzdWFsIG9u ZT8gIE1pZ2h0IGp1c3QgYmUgbmVjZXNzYXJ5IHRvIGFkZCBhIF9mdW5kYW1lbnRhbF9vbmx5Cj4g Pj4+Pj4gZWxlbWVudCBvbiB0aGUgZW5kICh3b3VsZCBiZSBpbmZvX21hc2sgaWYgdGhpcyBpcyBj b21tb24gZW5vdWdoIHRvCj4gPj4+Pj4ganVzdGlmeSB0aGF0IHJhdGhlciB0aGFuIHVzaW5nIHRo ZSBleHRlbmRlZCBtZXRob2RzIHRvIGRlZmluZSBpdC4pLgo+ID4+Pj4+IAo+ID4+Pj4+ICAgCj4g Pj4+Pj4+IOKAlAo+ID4+Pj4+PiBBV0FUVEhSCS0JaW5fZW5lcmd5X2FpX2FjY3VtdWxhdGlvbiAg ICAgIAo+ID4+Pj4+IEdyZWF0LCBqdXN0IHdoZW4gSSB0aG91Z2h0IHdlIGhhZCBnb25lIGZhciBl bm91Z2ggdGhleSBkZWZpbmUgcmVhY3RpdmUKPiA+Pj4+PiBlbmVyZ3kgd2hpY2ggaXMgcHJlc3Vt YWJseSByb3VnaGx5IHRoZSBzYW1lIGFzIHJlYWN0aXZlcG93ZXIgKiB0aW1lPwo+ID4+Pj4+IElu IHRoYXQgY2FzZSB3ZSBuZWVkIHR5cGVzIGZvciB0aGF0IGFzIHdlbGwuCj4gPj4+Pj4gaW5fZW5l cmd5cmVhY3RpdmVBXyoKPiA+Pj4+PiBpbl9lbmVyZ3lhY3RpdmVBXyoKPiA+Pj4+PiAgIAo+ID4+ Pj4+PiDigJQKPiA+Pj4+Pj4gQVZBUkhSCQktCWluX2VuZXJneV9hcV9hY2N1bXVsYXRpb24KPiA+ Pj4+Pj4g4oCUCj4gPj4+Pj4+IElQRUFLCQktCWluX2N1cnJlbnRfcGVhayAgICAgIAo+ID4+Pj4+ IFRoYXQgb25lIGlzIGVhc3kgYXMgd2UgaGF2ZSBhbiBpbmZvX21hc2sgZWxlbWVudCBmb3IgcGVh ayBhbmQgb25lCj4gPj4+Pj4gZm9yIHBlYWtfc2NhbGUgdGhhdCBoYXMgYWx3YXlzIGJlZW4gYSBi aXQgb2RkIGJ1dCB3YXMgbmVlZGVkIHNvbWV3aGVyZS4KPiA+Pj4+PiAgIAo+ID4+Pj4+PiDigJQK PiA+Pj4+Pj4gCj4gPj4+Pj4+IEnigJlsbCBsZWF2ZSBpdCB0aGVyZSwgYmVjYXVzZSB0aGVyZSBh cmUgc29tZSBldmVuIG1vcmUgY29tcGxpY2F0ZWQgcmVnaXN0ZXIgbmFtaW5nIGlzc3Vlcy4gICAg ICAKPiA+Pj4+PiBTb21ldGhpbmcgdG8gbG9vayBmb3J3YXJkIHRvLiAgR2FoLCBJIGFsd2F5cyBo YXRlZCBwb3dlciBlbmdpbmVlcmluZwo+ID4+Pj4+IHRob3VnaCBJIHRhdWdodCBpdCB2ZXJ5IGJy aWVmbHkgKEkgcmVhbGx5IHBpdHkgdGhvc2Ugc3R1ZGVudHMgOigKPiA+Pj4+PiAKPiA+Pj4+PiBK b25hdGhhbgo+ID4+Pj4+ICAgCj4gPj4+Pj4+IAo+ID4+Pj4+PiBSZWdhcmRzLAo+ID4+Pj4+PiBK b2huCj4gPj4+Pj4+IAo+ID4+Pj4+PiAKPiA+Pj4+Pj4gCj4gPj4+Pj4+IAo+ID4+Pj4+PiAgIAo+ ID4+Pj4+Pj4gT24gTWFyIDEwLCAyMDE4LCBhdCA3OjEwIEFNLCBKb25hdGhhbiBDYW1lcm9uIDxq aWMyM0BrZXJuZWwub3JnPiB3cm90ZToKPiA+Pj4+Pj4+IAo+ID4+Pj4+Pj4gT24gVGh1LCA4IE1h ciAyMDE4IDIxOjM3OjMzIC0wMzAwCj4gPj4+Pj4+PiBSb2RyaWdvIFNpcXVlaXJhIDxyb2RyaWdv c2lxdWVpcmFtZWxvQGdtYWlsLmNvbT4gd3JvdGU6Cj4gPj4+Pj4+PiAgIAo+ID4+Pj4+Pj4+IE9u IDAzLzA3LCBKb25hdGhhbiBDYW1lcm9uIHdyb3RlOiAgICAgICAgCj4gPj4+Pj4+Pj4+IE9uIFR1 ZSwgNiBNYXIgMjAxOCAyMTo0Mzo0NyAtMDMwMAo+ID4+Pj4+Pj4+PiBSb2RyaWdvIFNpcXVlaXJh IDxyb2RyaWdvc2lxdWVpcmFtZWxvQGdtYWlsLmNvbT4gd3JvdGU6Cj4gPj4+Pj4+Pj4+ICAgCj4g Pj4+Pj4+Pj4+PiBUaGUgbWFjcm8gSUlPX0RFVl9BVFRSX0NIX09GRiBpcyBhIHdyYXBwZXIgZm9y IElJT19ERVZJQ0VfQVRUUiwgd2l0aCBhCj4gPj4+Pj4+Pj4+PiB0aW55IGNoYW5nZSBpbiB0aGUg bmFtZSBkZWZpbml0aW9uLiBUaGlzIGV4dHJhIG1hY3JvIGRvZXMgbm90IGltcHJvdmUKPiA+Pj4+ Pj4+Pj4+IHRoZSByZWFkYWJpbGl0eSBhbmQgYWxzbyBjcmVhdGVzIHNvbWUgY2hlY2twYXRjaCBl cnJvcnMuCj4gPj4+Pj4+Pj4+PiAKPiA+Pj4+Pj4+Pj4+IFRoaXMgcGF0Y2ggZml4ZXMgdGhlIGNo ZWNrcGF0Y2gucGwgZXJyb3JzOgo+ID4+Pj4+Pj4+Pj4gCj4gPj4+Pj4+Pj4+PiBzdGFnaW5nL2lp by9tZXRlci9hZGU3NzUzLmM6MzkxOiBFUlJPUjogVXNlIDQgZGlnaXQgb2N0YWwgKDA3NzcpIG5v dAo+ID4+Pj4+Pj4+Pj4gZGVjaW1hbCBwZXJtaXNzaW9ucwo+ID4+Pj4+Pj4+Pj4gc3RhZ2luZy9p aW8vbWV0ZXIvYWRlNzc1My5jOjM5NTogRVJST1I6IFVzZSA0IGRpZ2l0IG9jdGFsICgwNzc3KSBu b3QKPiA+Pj4+Pj4+Pj4+IGRlY2ltYWwgcGVybWlzc2lvbnMKPiA+Pj4+Pj4+Pj4+IHN0YWdpbmcv aWlvL21ldGVyL2FkZTc3NTkuYzozMzE6IEVSUk9SOiBVc2UgNCBkaWdpdCBvY3RhbCAoMDc3Nykg bm90Cj4gPj4+Pj4+Pj4+PiBkZWNpbWFsIHBlcm1pc3Npb25zCj4gPj4+Pj4+Pj4+PiBzdGFnaW5n L2lpby9tZXRlci9hZGU3NzU5LmM6MzM1OiBFUlJPUjogVXNlIDQgZGlnaXQgb2N0YWwgKDA3Nzcp IG5vdAo+ID4+Pj4+Pj4+Pj4gZGVjaW1hbCBwZXJtaXNzaW9ucwo+ID4+Pj4+Pj4+Pj4gCj4gPj4+ Pj4+Pj4+PiBTaWduZWQtb2ZmLWJ5OiBSb2RyaWdvIFNpcXVlaXJhIDxyb2RyaWdvc2lxdWVpcmFt ZWxvQGdtYWlsLmNvbT4gICAgICAgICAgCj4gPj4+Pj4+Pj4+IAo+ID4+Pj4+Pj4+PiBIbW0uIEkg d29uZGVyZWQgYSBiaXQgYWJvdXQgdGhpcyBvbmUuIEl0J3MgYSBjb3JyZWN0IHBhdGNoIGluIG9m Cj4gPj4+Pj4+Pj4+IGl0c2VsZiBidXQgdGhlIGludGVyZmFjZSBpbiBxdWVzdGlvbiBkb2Vzbid0 IGV2ZW4gdmFndWVseSBjb25mb3JtCj4gPj4+Pj4+Pj4+IHRvIGFueSBvZiBkZWZpbmVkIElJTyBB QkkuICBBbnlob3csIGl0J3Mgc3RpbGwgYW5kIGltcHJvdmVtZW50IHNvCj4gPj4+Pj4+Pj4+IEkn bGwgdGFrZSBpdC4gICAgICAgICAgCj4gPj4+Pj4+Pj4gCj4gPj4+Pj4+Pj4gSSBhbSBub3Qgc3Vy ZSBpZiBJIHVuZGVyc3Rvb2QgdGhlIGNvbW1lbnQgYWJvdXQgdGhlIEFCSS4gVGhlIG1ldGVyCj4g Pj4+Pj4+Pj4gaW50ZXJmYWNlIGlzIHdyb25nIGJlY2F1c2UgaXQgdXNlcyB0aGluZ3MgbGlrZSBJ SU9fREVWSUNFX0FUVFI/IEl0Cj4gPj4+Pj4+Pj4gc2hvdWxkIHVzZSBpaW9faW5mbyB0b2dldGhl ciB3aXRoICp3cml0ZV9yYXcgYW5kICpyZWFkX3Jhdy4gUmlnaHQ/IElzIGl0Cj4gPj4+Pj4+Pj4g dGhlIEFCSSBwcm9ibGVtIHRoYXQgeW91IHJlZmVyPyAgICAgICAgCj4gPj4+Pj4+PiBUaGUgQUJJ IGlzIGFib3V0IHRoZSB1c2Vyc3BhY2UgaW50ZXJmYWNlIG9mIElJTy4gIEl0IGlzIGRlZmluZWQK PiA+Pj4+Pj4+IGluIERvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLWlpbyoKPiA+ Pj4+Pj4+IFNvIHRoaXMgZG9jdW1lbnRzIHRoZSBuYW1pbmcgb2Ygc3lzZnMgYXR0cmlidXRlcyBh bmQgKG1vcmUgb3IgbGVzcykKPiA+Pj4+Pj4+IGRlc2NyaWJlcyBhIGNvbnNpc3RlbnQgaW50ZXJm YWNlIHRvIHVzZXJzcGFjZSBhY3Jvc3MgbG90cyBvZiBkaWZmZXJlbnQKPiA+Pj4+Pj4+IHR5cGVz IG9mIGRldmljZXMuCj4gPj4+Pj4+PiAKPiA+Pj4+Pj4+IEEgbG90IG9mIHRoZXNlIG9sZGVyIGRy aXZlcnMgaW4gc3RhZ2luZyBpbnZvbHZlIGEgZ29vZCBkZWFsIG9mIEFCSSB0aGF0Cj4gPj4+Pj4+ PiB3YXMgbm90IHJldmlld2VkIG9yIGRpc2N1c3NlZC4gIFRoYXQgaXMgb25lIG9mIHRoZSBiaWdn ZXN0IHJlYXNvbnMgd2UKPiA+Pj4+Pj4+IGRpZG4ndCB0YWtlIHRoZW0gb3V0IG9mIHN0YWdpbmcg aW4gdGhlIGZpcnN0IHBsYWNlLgo+ID4+Pj4+Pj4gCj4gPj4+Pj4+PiBJbiBvcmRlciBmb3IgZ2Vu ZXJpYyB1c2Vyc3BhY2UgcHJvZ3JhbXMgdG8gaGF2ZSBhbnkgaWRlYSB3aGF0IHRvIGRvCj4gPj4+ Pj4+PiB3aXRoIHRoZXNlIGRldmljZXMgdGhpcyBhbGwgbmVlZHMgdG8gYmUgZml4ZWQuCj4gPj4+ Pj4+PiAKPiA+Pj4+Pj4+IFRoZXJlIG1heSB3ZWxsIGJlIGNhc2VzIHdoZXJlIHdlIG5lZWQgdG8g ZXhwYW5kIHRoZSBleGlzdGluZyBBQkkgdG8KPiA+Pj4+Pj4+IGNvdmVyIG5ldyB0aGluZ3MuICAg VGhhdCdzIGZpbmUsIGJ1dCBpdCBoYXMgdG8gYmUgZG9uZSB3aXRoIGZ1bGwKPiA+Pj4+Pj4+IHJl dmlldyBvZiB0aGUgcmVsZXZhbnQgZG9jdW1lbnRhdGlvbiBwYXRjaGVzLgo+ID4+Pj4+Pj4gCj4g Pj4+Pj4+PiBJbmNpZGVudGFsbHkgaWYgeW91IHdhbnQgYW4gZWFzeSBkcml2ZXIgdG8gd29yayBv biBtb3Zpbmcgb3V0IG9mIHN0YWdpbmcKPiA+Pj4+Pj4+IHRoZW4gZmlyc3QgdGhpbmcgdG8gZG8g aXMgdG8gY29tcGFyZSB3aGF0IGl0IHNob3dzIHRvIHVzZXJzcGFjZSB3aXRoIHRoZXNlCj4gPj4+ Pj4+PiBkb2NzLiAgSWYgaXQncyB0b3RhbGx5IGRpZmZlcmVudCB0aGVuIHlvdSBoYXZlIGEgYmln IGpvYiBvbiB5b3VyIGhhbmRzCj4gPj4+Pj4+PiBhcyBvZnRlbiBBQkkgY2FuIHRha2UgYSBsb3Qg b2YgZGlzY3Vzc2lvbiBhbmQgYSBsb25nIHRpbWUgdG8gZXN0YWJsaXNoCj4gPj4+Pj4+PiBhIGNv bnNlbnN1cy4KPiA+Pj4+Pj4+IAo+ID4+Pj4+Pj4gSm9uYXRoYW4KPiA+Pj4+Pj4+IAo+ID4+Pj4+ Pj4gICAKPiA+Pj4+Pj4+PiAKPiA+Pj4+Pj4+PiBUaGFua3MgOikKPiA+Pj4+Pj4+PiAgIAo+ID4+ Pj4+Pj4+PiBBcHBsaWVkIHRvIHRoZSB0b2dyZWcgYnJhbmNoIG9mIGlpby5naXQgYW5kIHB1c2hl ZCBvdXQgYXMgdGVzdGluZwo+ID4+Pj4+Pj4+PiBmb3IgdGhlIGF1dG9idWlsZGVycyB0byBwbGF5 IHdpdGggaXQuCj4gPj4+Pj4+Pj4+IAo+ID4+Pj4+Pj4+PiBJIGFsc28gYWRkZWQgdGhlIHJlbW92 YWwgb2YgdGhlIGhlYWRlciBkZWZpbmUgd2hpY2ggaXMgbm8KPiA+Pj4+Pj4+Pj4gbG9uZ2VyIHVz ZWQuCj4gPj4+Pj4+Pj4+IAo+ID4+Pj4+Pj4+PiBQbGVhc2Ugbm90ZSwgZm9sbG93aW5nIGRpc2N1 c3Npb25zIHdpdGggTWljaGFlbCwgSSBhbSBnb2luZyB0byBzZW5kCj4gPj4+Pj4+Pj4+IGFuIGVt YWlsIGFubm91bmNpbmcgYW4gaW50ZW50IHRvIGRyb3AgdGhlc2UgbWV0ZXIgZHJpdmVycyBuZXh0 Cj4gPj4+Pj4+Pj4+IGN5Y2xlIHVubGVzcyBzb21lb25lIGNhbiBwcm92aWRlIHRlc3RpbmcgZm9y IGFueSBhdHRlbXB0IHRvCj4gPj4+Pj4+Pj4+IG1vdmUgdGhlbSBvdXQgb2Ygc3RhZ2luZy4gIEkn bSBzdGlsbCB0YWtpbmcgcGF0Y2hlcyBvbiB0aGUgYmFzaXMKPiA+Pj4+Pj4+Pj4gdGhhdCAnbWln aHQnIGhhcHBlbiAtIGJ1dCBJIHdvdWxkbid0IGZvY3VzIG9uIHRoZXNlIHVudGlsIHdlCj4gPj4+ Pj4+Pj4+IGhhdmUgc29tZSBjZXJ0YWludHkgb24gd2hldGhlciB0aGV5IHdpbGwgYmUgYXJvdW5k IGxvbmcgdGVybSEKPiA+Pj4+Pj4+Pj4gCj4gPj4+Pj4+Pj4+IEpvbmF0aGFuCj4gPj4+Pj4+Pj4+ ICAgCj4gPj4+Pj4+Pj4+PiAtLS0KPiA+Pj4+Pj4+Pj4+IGRyaXZlcnMvc3RhZ2luZy9paW8vbWV0 ZXIvYWRlNzc1My5jIHwgMTggKysrKysrKysrKy0tLS0tLS0tCj4gPj4+Pj4+Pj4+PiBkcml2ZXJz L3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTkuYyB8IDE4ICsrKysrKysrKystLS0tLS0tLQo+ID4+ Pj4+Pj4+Pj4gMiBmaWxlcyBjaGFuZ2VkLCAyMCBpbnNlcnRpb25zKCspLCAxNiBkZWxldGlvbnMo LSkKPiA+Pj4+Pj4+Pj4+IAo+ID4+Pj4+Pj4+Pj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2lu Zy9paW8vbWV0ZXIvYWRlNzc1My5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzUz LmMKPiA+Pj4+Pj4+Pj4+IGluZGV4IGM0NGViNTc3ZGMzNS4uMjc1ZThkZmZmODM2IDEwMDY0NAo+ ID4+Pj4+Pj4+Pj4gLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzUzLmMKPiA+ Pj4+Pj4+Pj4+ICsrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1My5jCj4gPj4+ Pj4+Pj4+PiBAQCAtMzg4LDE0ICszODgsMTYgQEAgc3RhdGljIElJT19ERVZfQVRUUl9WUEVSSU9E KDA0NDQsCj4gPj4+Pj4+Pj4+PiAJCWFkZTc3NTNfcmVhZF8xNmJpdCwKPiA+Pj4+Pj4+Pj4+IAkJ TlVMTCwKPiA+Pj4+Pj4+Pj4+IAkJQURFNzc1M19QRVJJT0QpOwo+ID4+Pj4+Pj4+Pj4gLXN0YXRp YyBJSU9fREVWX0FUVFJfQ0hfT0ZGKDEsIDA2NDQsCj4gPj4+Pj4+Pj4+PiAtCQlhZGU3NzUzX3Jl YWRfOGJpdCwKPiA+Pj4+Pj4+Pj4+IC0JCWFkZTc3NTNfd3JpdGVfOGJpdCwKPiA+Pj4+Pj4+Pj4+ IC0JCUFERTc3NTNfQ0gxT1MpOwo+ID4+Pj4+Pj4+Pj4gLXN0YXRpYyBJSU9fREVWX0FUVFJfQ0hf T0ZGKDIsIDA2NDQsCj4gPj4+Pj4+Pj4+PiAtCQlhZGU3NzUzX3JlYWRfOGJpdCwKPiA+Pj4+Pj4+ Pj4+IC0JCWFkZTc3NTNfd3JpdGVfOGJpdCwKPiA+Pj4+Pj4+Pj4+IC0JCUFERTc3NTNfQ0gyT1Mp Owo+ID4+Pj4+Pj4+Pj4gKwo+ID4+Pj4+Pj4+Pj4gK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoY2hv ZmZfMSwgMDY0NCwKPiA+Pj4+Pj4+Pj4+ICsJCQlhZGU3NzUzX3JlYWRfOGJpdCwKPiA+Pj4+Pj4+ Pj4+ICsJCQlhZGU3NzUzX3dyaXRlXzhiaXQsCj4gPj4+Pj4+Pj4+PiArCQkJQURFNzc1M19DSDFP Uyk7Cj4gPj4+Pj4+Pj4+PiArCj4gPj4+Pj4+Pj4+PiArc3RhdGljIElJT19ERVZJQ0VfQVRUUihj aG9mZl8yLCAwNjQ0LAo+ID4+Pj4+Pj4+Pj4gKwkJCWFkZTc3NTNfcmVhZF84Yml0LAo+ID4+Pj4+ Pj4+Pj4gKwkJCWFkZTc3NTNfd3JpdGVfOGJpdCwKPiA+Pj4+Pj4+Pj4+ICsJCQlBREU3NzUzX0NI Mk9TKTsKPiA+Pj4+Pj4+Pj4+IAo+ID4+Pj4+Pj4+Pj4gc3RhdGljIGludCBhZGU3NzUzX3NldF9p cnEoc3RydWN0IGRldmljZSAqZGV2LCBib29sIGVuYWJsZSkKPiA+Pj4+Pj4+Pj4+IHsKPiA+Pj4+ Pj4+Pj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTkuYyBi L2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1OS5jCj4gPj4+Pj4+Pj4+PiBpbmRleCAx ZGVjYjJiOGFmYWIuLmMwNzhiNzcwZmE1MyAxMDA2NDQKPiA+Pj4+Pj4+Pj4+IC0tLSBhL2RyaXZl cnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1OS5jCj4gPj4+Pj4+Pj4+PiArKysgYi9kcml2ZXJz L3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTkuYwo+ID4+Pj4+Pj4+Pj4gQEAgLTMyOCwxNCArMzI4 LDE2IEBAIHN0YXRpYyBJSU9fREVWX0FUVFJfQUNUSVZFX1BPV0VSX0dBSU4oMDY0NCwKPiA+Pj4+ Pj4+Pj4+IAkJYWRlNzc1OV9yZWFkXzE2Yml0LAo+ID4+Pj4+Pj4+Pj4gCQlhZGU3NzU5X3dyaXRl XzE2Yml0LAo+ID4+Pj4+Pj4+Pj4gCQlBREU3NzU5X0FQR0FJTik7Cj4gPj4+Pj4+Pj4+PiAtc3Rh dGljIElJT19ERVZfQVRUUl9DSF9PRkYoMSwgMDY0NCwKPiA+Pj4+Pj4+Pj4+IC0JCWFkZTc3NTlf cmVhZF84Yml0LAo+ID4+Pj4+Pj4+Pj4gLQkJYWRlNzc1OV93cml0ZV84Yml0LAo+ID4+Pj4+Pj4+ Pj4gLQkJQURFNzc1OV9DSDFPUyk7Cj4gPj4+Pj4+Pj4+PiAtc3RhdGljIElJT19ERVZfQVRUUl9D SF9PRkYoMiwgMDY0NCwKPiA+Pj4+Pj4+Pj4+IC0JCWFkZTc3NTlfcmVhZF84Yml0LAo+ID4+Pj4+ Pj4+Pj4gLQkJYWRlNzc1OV93cml0ZV84Yml0LAo+ID4+Pj4+Pj4+Pj4gLQkJQURFNzc1OV9DSDJP Uyk7Cj4gPj4+Pj4+Pj4+PiArCj4gPj4+Pj4+Pj4+PiArc3RhdGljIElJT19ERVZJQ0VfQVRUUihj aG9mZl8xLCAwNjQ0LAo+ID4+Pj4+Pj4+Pj4gKwkJCWFkZTc3NTlfcmVhZF84Yml0LAo+ID4+Pj4+ Pj4+Pj4gKwkJCWFkZTc3NTlfd3JpdGVfOGJpdCwKPiA+Pj4+Pj4+Pj4+ICsJCQlBREU3NzU5X0NI MU9TKTsKPiA+Pj4+Pj4+Pj4+ICsKPiA+Pj4+Pj4+Pj4+ICtzdGF0aWMgSUlPX0RFVklDRV9BVFRS KGNob2ZmXzIsIDA2NDQsCj4gPj4+Pj4+Pj4+PiArCQkJYWRlNzc1OV9yZWFkXzhiaXQsCj4gPj4+ Pj4+Pj4+PiArCQkJYWRlNzc1OV93cml0ZV84Yml0LAo+ID4+Pj4+Pj4+Pj4gKwkJCUFERTc3NTlf Q0gyT1MpOwo+ID4+Pj4+Pj4+Pj4gCj4gPj4+Pj4+Pj4+PiBzdGF0aWMgaW50IGFkZTc3NTlfc2V0 X2lycShzdHJ1Y3QgZGV2aWNlICpkZXYsIGJvb2wgZW5hYmxlKQo+ID4+Pj4+Pj4+Pj4geyAgICAg ICAgICAKPiA+Pj4+Pj4+Pj4gICAKPiA+Pj4+Pj4+PiAtLQo+ID4+Pj4+Pj4+IFRvIHVuc3Vic2Ny aWJlIGZyb20gdGhpcyBsaXN0OiBzZW5kIHRoZSBsaW5lICJ1bnN1YnNjcmliZSBsaW51eC1paW8i IGluCj4gPj4+Pj4+Pj4gdGhlIGJvZHkgb2YgYSBtZXNzYWdlIHRvIG1ham9yZG9tb0B2Z2VyLmtl cm5lbC5vcmcKPiA+Pj4+Pj4+PiBNb3JlIG1ham9yZG9tbyBpbmZvIGF0ICBodHRwOi8vdmdlci5r ZXJuZWwub3JnL21ham9yZG9tby1pbmZvLmh0bWwgICAgICAgIAo+ID4+Pj4+Pj4gCj4gPj4+Pj4+ PiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwo+ID4+Pj4+ Pj4gZGV2ZWwgbWFpbGluZyBsaXN0Cj4gPj4+Pj4+PiBkZXZlbEBsaW51eGRyaXZlcnByb2plY3Qu b3JnCj4gPj4+Pj4+PiBodHRwOi8vZHJpdmVyZGV2LmxpbnV4ZHJpdmVycHJvamVjdC5vcmcvbWFp bG1hbi9saXN0aW5mby9kcml2ZXJkZXYtZGV2ZWwgICAgICAgIAo+IAoKX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZGV2ZWwgbWFpbGluZyBsaXN0CmRldmVs QGxpbnV4ZHJpdmVycHJvamVjdC5vcmcKaHR0cDovL2RyaXZlcmRldi5saW51eGRyaXZlcnByb2pl Y3Qub3JnL21haWxtYW4vbGlzdGluZm8vZHJpdmVyZGV2LWRldmVsCg==