DIRECTORY BansheeControl USING [Display, EngineStatus, EventContext, GetEngineStatus, RunTurnaroundTest, SendEngineCommand, SetToCurrentEventContext, WaitEngineDiagnostic, WaitEngineEvent, WaitEngineStatus], BansheeCounter USING [Get, Handle, Item], BansheeEngine USING [--Job, SetJob, -- SetPrintingState, WaitPrintingState], BansheeTest USING [], BasicTime USING [Now], Convert USING [AppendCard, AppendTime], Loader USING [BCDBuildTime], LSEPDiagnostics USING [BuildImageSample, ImageFault, InterpretImageSample], NSExec USING [GetTTY, localExec, OutputHandle], NSString USING [AppendToMesaString, CopyString, MakeString, nullString, String, StringRep, StringFromMesaString], Process USING [GetPriority, Pause, Priority, priorityForeground, SecondsToTicks, SetPriority], PSCommand USING [PrintFile], RavenBansheeMessage USING [GetNSMessage, Key], RefText USING [Append], Rope USING [ToRefText], StringSequence USING [Handle, learSieglerStringLength], TestPattern USING [Name, NotFound], TextInput USING [Choices, ChoiceIndex, GetChoice, GetYesNo], ThisMachine USING [ProcessorID], TTY USING [Handle, Rubout], XFormat USING [CR, Handle, NSLine, NSString], XMessage USING [Compose, StringArray]; BansheeTestImpl: CEDAR PROGRAM IMPORTS BasicTime, BansheeControl, BansheeCounter, BansheeEngine, Convert, Loader, LSEPDiagnostics, NSExec, NSString, PSCommand, Process, RavenBansheeMessage, RefText, Rope, TestPattern, TextInput, ThisMachine, TTY, XFormat, XMessage EXPORTS BansheeTest = BEGIN LogItem: TYPE = RECORD [counter: BansheeCounter.Item, message: RavenBansheeMessage.Key]; jamList: ARRAY [0..4) OF LogItem = [ [noPaper, c4noPaper], [preregistrationJam, e2PreregistrationJam], [ fuserJam, e3PreExitJam], [noExit, e4PostExitJam]]; commandList: ARRAY [0..5) OF LogItem = [ [feed, feed], [solicitStatus, solicitStatus], [chime, beep], [ solicitPaperSize, solicitPaperSize], [enterLoopbackMode, enterLoopbackMode]]; statusList: ARRAY [0..38) OF LogItem = [ [pageSync, pageSync], [readyToFeed, readyToFeed], [ pageAtOutputTray, pageAtOutputTray], [feedRejected, feedRejected], [ noToner, noToner], [clamShellOpen, clamShellOpen], [ feedTrayNotEngaged, feedTrayNotEngaged], [diagnosticMode, diagnosticMode], [ callForService, callForService], [copyMode, copyMode], [ paperLetter, paperLetter], [paperA4, paperA4], [paper215X330, paper215X330], [ paperLegal, paperLegal], [paperEnvelope10, paperEnvelope10], [ paperEnvelopeRX, paperEnvelopeRX], [keyOffLine, keyOffLine], [ keyReset, keyReset], [keyLastPage, keyLastPage], [keyTest36, diagnostic36], [ keyTest37, diagnostic37], [keyTest38, diagnostic38], [keyTest39, diagnostic39], [keyTest40, diagnostic40], [keyTest41, diagnostic41], [ keyTest42, diagnostic42], [keyTest43, diagnostic43], [keyTest44, diagnostic44], [keyTest45, diagnostic45], [keyTest46, diagnostic46], [ keyTest47Loopback, diagnostic47], [keyTestStop, stopDiagnostic], [ testPrintRequest, softReset], [parityError, parityError], [ statusError, statusError], [noStatus, noStatus], [ statusOverRun, statusOverRun], [undefinedStatus, undefinedStatus]]; plateStatusList: ARRAY [0..2) OF LogItem = [ [bandOverrun, bandOverrun], [pageSyncMiss, pageSyncMiss]]; statusExtrasList: ARRAY [0..5) OF LogItem = [ [imageFault1, imageFault1], [imageFault2, imageFault2], [ imageFault3, imageFault3], [sequenceFault, sequenceFault], [ communicationFault, communicationFault]]; localTTY: TTY.Handle _ NSExec.GetTTY[NSExec.localExec]; localOutput: XFormat.Handle _ NSExec.OutputHandle[NSExec.localExec]; RunServeTestMode: PUBLIC PROCEDURE = BEGIN ENABLE TTY.Rubout => CONTINUE; testChoices: REF TextInput.Choices _ NEW[TextInput.Choices[6]]; testChoices.data[0] _ RavenBansheeMessage.GetNSMessage[exit]; testChoices.data[1] _ RavenBansheeMessage.GetNSMessage[commandStatusTurnaroundTest]; testChoices.data[2] _ RavenBansheeMessage.GetNSMessage[imageTest]; testChoices.data[3] _ RavenBansheeMessage.GetNSMessage[displayTechRepLog]; testChoices.data[4] _ RavenBansheeMessage.GetNSMessage[printTechRepLog]; testChoices.data[5] _ RavenBansheeMessage.GetNSMessage[resetTechRepLog]; DO SELECT TextInput.GetChoice[ tty: localTTY, prompt: RavenBansheeMessage.GetNSMessage[selectFrom], choices: testChoices, default: 0 ! TTY.Rubout => EXIT] FROM 0 => EXIT; 1 => BEGIN -- command status turnaround test localOutput.CR[]; localOutput.NSString[ -- display heading s: RavenBansheeMessage.GetNSMessage[commandStatusTurnaroundTest2]]; localOutput.NSLine[ s: RavenBansheeMessage.GetNSMessage[ IF BansheeControl.RunTurnaroundTest[] THEN working ELSE failing]]; localOutput.CR[]; IF TextInput.GetYesNo[ tty: localTTY, -- prompt for repeat test response prompt: RavenBansheeMessage.GetNSMessage[repeatTest], default: yes ! TTY.Rubout => GOTO abortTests] = no THEN EXIT; localOutput.CR[]; END; 2 => BEGIN -- image test fault: LSEPDiagnostics.ImageFault; localOutput.CR[]; localOutput.NSString[s: RavenBansheeMessage.GetNSMessage[imageTest2]]; fault _ RunImageTest[]; localOutput.NSLine[s: RavenBansheeMessage.GetNSMessage[ SELECT fault FROM noFault => working, fault1 => imageTestFailingCode1, fault2 => imageTestFailingCode2, fault3 => imageTestFailingCode3, fault4 => imageTestFailingCode4, fault5 => imageTestFailingCode5, fault6 => imageTestFailingCode6, fault7 => imageTestFailingCode7, fault8 => imageTestFailingCode8, aborted => imageTestAbortedOther, ENDCASE => imageTestAbortedTPProblem]]; localOutput.CR[]; END; 3 => BEGIN -- display tech rep log DisplayTechRepLog[]; END; 4 => BEGIN -- print tech rep log PrintTechRepLog[copies: 1]; END; 5 => BEGIN -- reset tech rep log IF TextInput.GetYesNo[tty: localTTY, -- prompt for repeat test response prompt: RavenBansheeMessage.GetNSMessage[pleaseConfirm], default: no ! TTY.Rubout => GOTO abortTests] = yes THEN ResetTechRepLog[]; END; ENDCASE; ENDLOOP; EXITS abortTests => NULL; END; -- RunServeTestMode RunRepairMode: PUBLIC PROCEDURE = BEGIN DO SELECT BansheeControl.GetEngineStatus[] FROM diagnosticOkay, diagnosticNotReady => NULL; -- stay in diagnostic mode ENDCASE => EXIT; -- back in normal mode SELECT BansheeControl.WaitEngineDiagnostic[] FROM test36 => BansheeControl.Display[blank, blank]; test37 => BansheeControl.Display[blank, blank]; test38 => BansheeControl.Display[blank, blank]; test39 => BansheeControl.Display[blank, blank]; test40 => BansheeControl.Display[blank, blank]; test41 => BansheeControl.Display[blank, blank]; test42 => BEGIN PSCommand.PrintFile[fileName: TestPattern.Name[11 ! TestPattern.NotFound => BEGIN BansheeControl.Display[E, F]; LOOP; END], senderName: RavenBansheeMessage.GetNSMessage[repairMode], copies: LAST[CARDINAL], options: [var: bansheeDl[]]]; END; test43 => PrintTechRepLog[copies: LAST[CARDINAL]]; test44 => BEGIN fault: LSEPDiagnostics.ImageFault; fault _ RunImageTest[]; Process.Pause[Process.SecondsToTicks[6]]; -- wait to display SELECT fault FROM noFault => BansheeControl.SendEngineCommand[displayJJ]; -- ok aborted => BansheeControl.Display[blank, blank]; notTested => BansheeControl.Display[E, F]; -- File Error ENDCASE => BansheeControl.Display[LOOPHOLE[fault], F]; -- Fault # END; test45 => BansheeControl.Display[blank, blank]; test46 => BansheeControl.Display[blank, blank]; test47Loopback => NULL; -- done in BansheeControlImpl testStop => BEGIN BansheeControl.Display[blank, blank]; BansheeEngine.SetPrintingState[completed]; END; endDiagnosticMode => EXIT; ENDCASE => NULL; -- whatever ENDLOOP; END; -- RunRepairMode WaitRepairModeRequest: PUBLIC PROCEDURE = BEGIN status: BansheeControl.EngineStatus _ BansheeControl.GetEngineStatus[]; DO SELECT status FROM diagnosticOkay, diagnosticNotReady => EXIT; ENDCASE => status _ BansheeControl.WaitEngineStatus[]; ENDLOOP; END; -- WaitRepairModeRequest BuildTechRepLog: PROCEDURE [sequence: StringSequence.Handle] = BEGIN dataBase: BansheeCounter.Handle; ExpandAppendFreeBump: PROCEDURE [messageKey: RavenBansheeMessage.Key] = BEGIN expandedString _ XMessage.Compose[ source: RavenBansheeMessage.GetNSMessage[messageKey], args: expansionString]; NSString.AppendToMesaString[to: sequence[index], from: expandedString]; index _ index + 1; END; -- ExpandAppendFreeBump FormatLogCounterMessage: PROCEDURE [item: BansheeCounter.Item, messageKey: RavenBansheeMessage.Key] = BEGIN mesaString.length _ 0; mesaString _ Convert.AppendCard[mesaString, dataBase.counter[item]]; expansionString.data[1] _ mesaString; ExpandAppendFreeBump[messageKey]; expansionString.data[1] _ NSString.nullString; END; -- FormatLogCounterMessage expansionString: REF XMessage.StringArray _ NEW[XMessage.StringArray[2]]; -- for arguments to embed in message expandedString: NSString.String; -- string for message with embedded arguments index: CARDINAL _ 0; mesaString: REF TEXT _ NEW[TEXT[StringSequence.learSieglerStringLength]]; nsString: NSString.String _ NSString.MakeString[bytes: StringSequence.learSieglerStringLength]; sDateAndTime: NSString.String _ NEW[NSString.StringRep[40]]; nsDateAndTime: NSString.String _ NSString.StringFromMesaString[sDateAndTime]; counterFieldWidth: CARDINAL = 10; dataBase _ BansheeCounter.Get[]; -- get event counts from log expansionString.data[0] _ NSString.nullString; nsString.length _ 0; nsDateAndTime.length _ 0; nsDateAndTime _ Convert.AppendTime[to: nsDateAndTime, from: BasicTime.Now[]]; expansionString.data[1] _ nsDateAndTime; ExpandAppendFreeBump[xeroxBansheeTechRepLogOf]; mesaString.length _ 0; expansionString.data[1] _ Rope.ToRefText[ThisMachine.ProcessorID[$ProductSoftware]]; ExpandAppendFreeBump[host]; nsString.length _ 0; nsDateAndTime.length _ 0; nsDateAndTime _ Convert.AppendTime[to: nsDateAndTime, from: Loader.BCDBuildTime[], end: seconds]; expansionString.data[1] _ nsDateAndTime; ExpandAppendFreeBump[softwareOf]; mesaString.length _ 0; expansionString.data[1] _ NSString.StringFromMesaString[s: mesaString]; ExpandAppendFreeBump[iotRevision]; nsString.length _ 0; nsDateAndTime.length _ 0; nsDateAndTime _ Convert.AppendTime[to: nsDateAndTime, from: dataBase.resetTime, end: seconds]; expansionString.data[1] _ nsDateAndTime; ExpandAppendFreeBump[lastResetOn]; mesaString.length _ 0; mesaString _ Convert.AppendCard[mesaString, dataBase.counter[pageSync]]; expansionString.data[1] _ mesaString; ExpandAppendFreeBump[feedsSinceLastReset]; index _ index + 1; ExpandAppendFreeBump[jamCountersTotalRate]; FOR i: CARDINAL IN [0..LENGTH[jamList]) DO mesaString.length _ 0; mesaString _ Convert.AppendCard[mesaString, dataBase.counter[jamList[i].counter]]; FOR character: CARDINAL IN [0..counterFieldWidth - 1) DO IF mesaString[character] = '0 THEN mesaString[character] _ '. ELSE EXIT; ENDLOOP; expansionString[0] _ NSString.CopyString[mesaString]; mesaString.length _ 0; IF dataBase.counter[pageSync] = 0 THEN mesaString _ RefText.Append[to: mesaString, from: "**********"] ELSE BEGIN mesaString _ Convert.AppendCard[mesaString, (dataBase.counter[pageSync]) * 1000]; FOR character: CARDINAL IN [0..counterFieldWidth - 1) DO IF mesaString[character] = '0 THEN mesaString[character] _ '. ELSE EXIT; ENDLOOP; END; expansionString.data[1] _ mesaString; ExpandAppendFreeBump[jamList[i].message]; ENDLOOP; expansionString.data[0] _ expansionString.data[1] _ NSString.nullString; ExpandAppendFreeBump[rateTotalTotalFeeds]; index _ index + 1; ExpandAppendFreeBump[commandCounters]; FOR i: CARDINAL IN [0..LENGTH[commandList]) DO FormatLogCounterMessage[commandList[i].counter, commandList[i].message]; ENDLOOP; index _ index + 1; ExpandAppendFreeBump[statusCounters]; FOR i: CARDINAL IN [0..LENGTH[statusList]) DO FormatLogCounterMessage[statusList[i].counter, statusList[i].message]; ENDLOOP; index _ index + 1; ExpandAppendFreeBump[plateStatusCounters]; FOR i: CARDINAL IN [0..LENGTH[plateStatusList]) DO FormatLogCounterMessage[ plateStatusList[i].counter, plateStatusList[i].message]; ENDLOOP; index _ index + 1; ExpandAppendFreeBump[statusExtrasCounters]; FOR i: CARDINAL IN [0..LENGTH[statusExtrasList]) DO FormatLogCounterMessage[ statusExtrasList[i].counter, statusExtrasList[i].message]; ENDLOOP; END; -- BuildTechRepLog DisplayTechRepLog: PROCEDURE = BEGIN END; -- DisplayTechRepLog PrintTechRepLog: PROCEDURE [copies: CARDINAL] = BEGIN END; -- PrintTechRepLog ResetTechRepLog: PROCEDURE = BEGIN END; -- ResetTechRepLog RunImageTest: PROCEDURE RETURNS [imagefault: LSEPDiagnostics.ImageFault] = BEGIN eventContext: REF BansheeControl.EventContext _ NEW[BansheeControl.EventContext]; oldPriority: Process.Priority _ Process.GetPriority[]; Process.SetPriority[Process.priorityForeground]; TRUSTED BEGIN BansheeEngine.SetPrintingState[completed]; -- abort any current job [] _ BansheeEngine.WaitPrintingState[targetState: completed, targetEqual: TRUE]; LSEPDiagnostics.BuildImageSample[phase: prePrinting]; PSCommand.PrintFile[ fileName: TestPattern.Name[9 ! TestPattern.NotFound => GOTO noTestPattern], senderName: RavenBansheeMessage.GetNSMessage[imageTest], copies: 1, options: [var: bansheeDl[]]]; DO SELECT BansheeControl.GetEngineStatus[] FROM IN [okay..diagnosticOkay], IN [imageFault1..sequenceFault] => EXIT; callForService, diagnosticNotReady, communicationFault => GOTO testingError; -- don't bother ENDCASE => [] _ BansheeControl.WaitEngineStatus[]; ENDLOOP; BansheeControl.SetToCurrentEventContext[eventContext]; DO SELECT BansheeControl.WaitEngineEvent[eventContext] FROM feeding, pageDelivery, feedError, hardError => EXIT; ENDCASE => NULL; -- all others loop ENDLOOP; LSEPDiagnostics.BuildImageSample[phase: printing]; BansheeEngine.SetPrintingState[completed]; -- make sure engine is done (kill error retries) [] _ BansheeEngine.WaitPrintingState[targetState: completed, targetEqual: TRUE]; LSEPDiagnostics.BuildImageSample[phase: postPrinting]; imagefault _ LSEPDiagnostics.InterpretImageSample[]; EXITS noTestPattern => imagefault _ notTested; testingError => imagefault _ aborted; END; Process.SetPriority[oldPriority]; -- restore priority END; -- RunImageTest END. LOG When / Who / What. 27-Feb-85 15:18:39 / Strickberger / Created. 1-Apr-85 23:45:17 / Strickberger / Do InterpretImageSample if engineEvent = hardError to avoid wrong message for real image fault (AR13793). 22-Apr-85 22:54:34 / Strickberger / More fixes to RunImageTest (AR13793 again). 14-Jun-85 17:22:43 / Strickberger / Even more fixes to RunImageTest, run at priorityForeground (AR13793). Check BansheeControl.GetEngineStatus for diagnostic mode before BansheeControl.WaitEngineDiagnostic to avoid hanging in RunRepairMode if diagnostic mode exited during a test. Abort image test if communicationFault status. Change image test displays in RunRepairMode: FE for notTested, JJ for ok. Pause 6 seconds before displaying fault to allow IOT to redisplay test ID. 30-Jul-85 21:30:55 / Strickberger / Update for Euclid. All messages now in RavenBansheeMessage. FixArrows. 23-Aug-85 15:32:36 / Strickberger / Make TTY.Rubout exit RunServeTestMode. 1-Apr-86 0:44:11 / Strickberger / Abort current job before starting image test (AR2805). 14-May-86 20:11:19 / Prochaska / Update for new BansheeControl, add call to BansheeControl.SetToCurrentEventContext. bBansheeTestImpl.mesa Copyright (C) Xerox Corporation 1984, 1985, 1986. All rights reserved. Last edited by Prochaska 14-May-86 20:12:17 Ruseli Binsol: November 6, 1986 2:26:45 pm PST Tim Diebert: December 2, 1986 3:02:20 pm PST Format USING [HostNumber, LongNumber, Number, NumberFormat, StringProc], Heap USING [systemZone], RasterLogFont USING [TransferStringSequence], TYPEs: Constants Variables: PUBLIC PROCEDUREs: display a list of numbered test choices and get input; default is exit Runs Banshee server based diagnostics depending on Banshee console input. Returns when Banshee printer is returned to normal mode. builds images, prints test patterns Returns when Banshee printer is placed in repair mode. RunRepairMode should then be called to execute server based printer diagnostic requests. PRIVATE PROCEDUREs: called by DisplayLog to put appropriate text into sequence inserts arguments into a message, places the string into the string sequence, and increments the index body of BuildTechRepLog used for appending dates: used for appending counters: rateFormat: Format.NumberFormat = [ base: 10, zerofill: TRUE, unsigned: TRUE, columns: counterFieldWidth]; decFormat: Format.NumberFormat = [ base: 10, zerofill: FALSE, unsigned: TRUE, columns: 0]; hexFormat: Format.NumberFormat = [ base: 16, zerofill: FALSE, unsigned: TRUE, columns: 0]; Make "Tech Rep Log Of..." line appends time to nsDateAndTime Make "Host #" line Make "Software Of..." line Make "IOT Firmware..." line Make "Last Reset On..." line Make "Feeds..." line Make "Jam Counters" line Make the Jam Counters log block Make "Rate =..." line Make the Command Counters log block Make the Status Counters log block Make the Plate Status Counters log block Make the Status Extras Counters log block builds and displays the tech rep log sequence: StringSequence.Handle; sequence _ StringSequence.Create[ sequenceLength: 72, stringLength: StringSequence.learSieglerStringLength]; BuildTechRepLog[sequence: sequence]; FOR index: CARDINAL IN [0..sequence.length) DO screen display loop NSExec.PutMessage[ exec: NSExec.localExec, string: NSString.StringFromMesaString[s: sequence[index]]]; ENDLOOP; StringSequence.Delete[sequence: sequence]; builds and prints the tech rep log jobData: BansheeEngine.Job; sequence: StringSequence.Handle; sequence _ StringSequence.Create[ sequenceLength: 72, stringLength: StringSequence.learSieglerStringLength]; BuildTechRepLog[sequence: sequence]; jobData _ [ banner: suppressed, printOrder: firstPageOutFirst, copyCount: copies, document: RasterLogFont.TransferStringSequence[sequence], firstPage: 0, lastPage: LAST[CARDINAL]]; StringSequence.Delete[sequence]; [] _ BansheeEngine.WaitPrintingState[ targetState: completed, targetEqual: TRUE]; BansheeEngine.SetJob[@jobData]; BansheeEngine.SetPrintingState[started]; [] _ BansheeEngine.WaitPrintingState[targetState: started, targetEqual: TRUE]; UNTIL BansheeEngine.GetPrintingState[] = completed DO IF BansheeControl.GetEngineStatus[] NOT IN [okay..diagnosticOkay] THEN BansheeEngine.SetPrintingState[completed]; Process.Pause[Process.SecondsToTicks[1]]; ENDLOOP; resets all event counters to zero BansheeCounter.Reset; Process.Pause[ticks: Process.SecondsToTicks[seconds: 1]]; check Video Data, Line Sync, and Video Clock signals run at priorityForeground make sure engine is idle wait for testable status indication wait for page sync (feeding) or error event Κ R˜codešœ™KšœG™GKšœ,™,Kšœ.™.K™,—K˜K˜šΟk ˜ Kšœœ±˜ΕKšœœ˜)KšœœΟcœ&˜LKšœ œ˜Kšœ œ˜Kšœœ˜'Kšœœ<™HKšœœ™Kšœœ˜Kšœœ6˜KKšœœ#˜/šœ œL˜ZK˜—KšœœQ˜^Kšœ œ ˜Kšœœ™-Kšœœ˜.Kšœœ ˜Kšœœ ˜Kšœœ#˜7Kšœ œ˜#Kšœ œ-˜K˜M——˜šœ œ œ ˜(K˜3K˜DK˜4K˜LK˜8K˜NK˜>K˜>K˜MK˜OK˜7K˜OK˜7K˜BK˜;K˜2K˜C——˜šœœœ ˜,K˜:——˜šœœœ ˜-K˜9K˜K˜0Kšœ,ž ˜9Kšœœž ˜B—Kšœ˜—K˜/K˜/Kšœœž˜6šœ ˜K˜%K˜*Kšœ˜—Kšœœ˜Kšœœž ˜—Kšœ˜—Kšœž˜——˜šŸœœ œ˜/Kšœ6™6KšœX™XK˜Gš˜šœ˜Kšœ&œ˜+Kšœ/˜6—Kšœ˜—Kšœž˜——˜Kšœ™—˜šŸœ œ$˜DKšœ:™:K˜ ——˜šŸœ œ(˜MKšœN™NKšœ™˜"K˜5Kšœ˜—K˜GK˜Kšœž˜——˜šŸœ œC˜kK˜K˜DK˜%K˜!K˜.Kšœž˜ ——˜Kšœœœž(˜sKšœ"ž-˜OKšœœ˜—˜Kšœ™Kš œ œœœœ*˜IK˜_—˜Kšœ™Kšœ œ˜—˜K˜.—˜Kšœ™K˜K˜KšœM˜MKšœ™K˜(K˜/—˜Kšœ™K˜KšœT˜TK˜—˜Kšœ™K˜K˜šœR˜RKšœ˜—K˜(K˜!—˜Kšœ™K˜K˜GK˜"—˜Kšœ™K˜K˜Kšœ^˜^K˜(K˜"—˜Kšœ™K˜KšœH˜HK˜%K˜*K˜—˜Kšœ™K˜+—˜Kšœ™š œœœœ ˜*K˜K˜Ršœ œœ˜8Kšœœœœ˜HKšœ˜—K˜5K˜šœ ˜&Kšœ?˜?š ˜ K˜Q—šœ œœ˜8Kšœœœœ˜HKšœ˜—Kšœ˜—K˜%K˜)Kšœ˜—K˜H—˜Kšœ™K˜*—˜Kšœ#™#K˜K˜&š œœœœ˜.K˜HKšœ˜——˜Kšœ"™"K˜K˜%š œœœœ˜-K˜FKšœ˜——˜Kšœ(™(K˜K˜*š œœœœ˜2˜K˜8—Kšœ˜——˜Kšœ)™)K˜K˜+š œœœœ˜3˜K˜:—Kšœ˜——˜Kšœž˜—˜šŸœ œ˜$Kšœ%™%K™ ™!K™J—K™$šœœœ™.Kšœ™™K™K™;—Kšœ™—K™*Kšœž˜——˜šŸœ œ œ˜5Kšœ"™"K™K™ ——™™!K™J—K™$™ K™EK™GKšœ œœ™—K™ ™%Kšœ%œ™+—K™K™(KšœHœ™Nšœ.™5šœ"œœ™FK™*—K™)Kšœ™—Kšœž˜—˜šŸœ œ˜"Kšœ!™!K™K™9Kšœž˜——˜šŸ œ œœ+˜PKšœœœ˜QKšœ4™4——˜Kšœ™K˜6K˜0—˜šœ˜ Kšœ™Kšœ,ž˜DKšœJœ˜PK˜5˜Kšœ7œ˜KK˜CK˜———˜Kšœ#™#š˜šœ"˜,Kšœœ!œ˜C˜9Kšœž˜#—Kšœ+˜2—Kšœ˜K˜Kšœ+™+K˜6š˜šœ.˜8Kšœ/œ˜4Kšœœž˜$—Kšœ˜—K˜2Kšœ,ž0˜\KšœJœ˜PK˜6K˜4KšœO˜TKšœ˜—K˜Kšœ#ž˜6K˜Kšœž˜—K˜Kšœ˜K˜š˜K˜—˜,K˜Œ—K˜OKš œιŸ œœœ;œœ˜ΰK˜lšœ)œ˜JK˜Y—K˜tJ˜—…—; Uΐ