DIRECTORY BasicTime USING [Now], Commander USING [CommandProc, Handle, Register], CommandTool USING [RegistrationDirectory], IO, Rope, Buttons USING [Button, ButtonProc, Create, ReLabel], Containers USING [ChildXBound, ChildYBound], Convert USING [CardFromRope, Error, IntFromRope], FS USING [SetKeep], ImagerFont USING [Font, Find], Labels USING [Create, Set], PopUpSelection USING [Request], Rules USING [Create], TypeScript USING [ChangeLooks, Create], ViewerClasses USING [Viewer, ViewerRec], ViewerIO USING [CreateViewerStreams], ViewerOps USING [CreateViewer], ViewerTools USING [GetContents, MakeNewTextViewer, SetContents, SetSelection], SoftcardOps, SoftcardToolPrivate; SoftcardToolImpl: CEDAR MONITOR IMPORTS BasicTime, Commander, CommandTool, Convert, FS, ImagerFont, IO, PopUpSelection, Rope, Buttons, Containers, Labels, Rules, ViewerIO, ViewerOps, ViewerTools, TypeScript, SoftcardOps, SoftcardToolPrivate EXPORTS SoftcardToolPrivate = BEGIN OPEN IO, SoftcardToolPrivate; STREAM: TYPE = IO.STREAM; topViewer: PUBLIC Viewer; tsViewer: Viewer; tsOut: PUBLIC STREAM; runOrStopButton: Viewer; runChoice: ROPE = " Is running "; stopChoice: ROPE = " Is stopped "; unknownChoice: ROPE = " Is unknown "; dragonState: DragonState _ unknown; connectionText: Viewer; phaseAdjustText: Viewer; delayText: Viewer; freqSelectLabel: Viewer; freqSelectChoice: INT _ -1; freqSelectArray: PUBLIC ARRAY [0..3] OF SelectRecord; SelectRecord: TYPE = RECORD [name: ROPE, val: CARD16]; activeFont: PUBLIC ImagerFont.Font; labelFont: PUBLIC ImagerFont.Font; tinySelectFont: PUBLIC ImagerFont.Font; selectFont: PUBLIC ImagerFont.Font; regDir: PUBLIC ROPE; MakeControlWindow: PROC[name, tsLogFile: ROPE] RETURNS [STREAM] = { IF topViewer = NIL OR topViewer.destroyed THEN { sib: Viewer; y: INTEGER; topViewer _ ViewerOps.CreateViewer[ flavor: $Container, info: [name: name, iconic: FALSE, scrollable: FALSE] ]; sib _ Buttons.Create[ info: [ name: " EstablishConnection ", parent: topViewer, wx: leftEdge, wy: 4, wh: entryHeight, border: TRUE, scrollable: FALSE], font: activeFont, proc: OpenConnectionProc ]; sib _ Buttons.Create[ info: [ name: " CloseConnection ", parent: topViewer, wx: sib.wx+sib.ww+1, wy: sib.wy, wh: entryHeight, border: TRUE, scrollable: FALSE], font: activeFont, proc: CloseConnectionProc ]; sib _ Buttons.Create[ info: [ name: "Host:", parent: topViewer, wx: sib.wx+sib.ww+10, wy: sib.wy, wh: entryHeight, border: FALSE, scrollable: FALSE], font: selectFont, proc: ConnectionTextProc ]; sib _ connectionText _ ViewerTools.MakeNewTextViewer[ info: [parent: topViewer, wx: sib.wx+sib.ww+xFudge, wy: sib.wy, ww: 1000, wh: entryHeight, border: FALSE, scrollable: TRUE]]; Containers.ChildXBound[topViewer, sib]; sib _ Labels.Create[ info: [ name: " DragonRunControl ", parent: topViewer, wx: leftEdge, wy: sib.wy+sib.wh+betweenHeight, wh: entryHeight, border: FALSE, scrollable: FALSE], font: labelFont ]; sib _ runOrStopButton _ Buttons.Create[ info: [ name: unknownChoice, parent: topViewer, wx: sib.wx+sib.ww+xFudge, wy: sib.wy, wh: entryHeight, border: TRUE, scrollable: FALSE], font: activeFont, proc: RunOrStopProc ]; sib _ Buttons.Create[ info: [ name: " HaltDragonInPhase ", parent: topViewer, wx: leftEdge, wy: sib.wy+sib.wh+betweenHeight, wh: entryHeight, border: TRUE, scrollable: FALSE], font: activeFont, proc: HaltDragonProc ]; sib _ Buttons.Create[ info: [ name: " Current Dragon Phase ", parent: topViewer, wx: sib.wx+sib.ww+xFudge+6, wy: sib.wy, wh: entryHeight, border: TRUE, scrollable: FALSE], font: activeFont, proc: CurrentPhaseProc ]; sib _ Labels.Create[ info: [ name: " StepDragon ", parent: topViewer, wx: sib.wx+sib.ww+xFudge+6, wy: sib.wy, wh: entryHeight, border: FALSE, scrollable: FALSE], font: labelFont ]; sib _ Buttons.Create[ info: [ name: "quarter", parent: topViewer, wx: sib.wx+sib.ww+xFudge, wy: sib.wy, wh: entryHeight, border: TRUE, scrollable: FALSE], font: activeFont, proc: QuarterStepProc ]; sib _ Buttons.Create[ info: [ name: "half", parent: topViewer, wx: sib.wx+sib.ww+xFudge, wy: sib.wy, wh: entryHeight, border: TRUE, scrollable: FALSE], font: activeFont, proc: HalfStepProc ]; sib _ Buttons.Create[ info: [ name: "full", parent: topViewer, wx: sib.wx+sib.ww+xFudge, wy: sib.wy, wh: entryHeight, border: TRUE, scrollable: FALSE], font: activeFont, proc: FullStepProc ]; sib _ Labels.Create[ info: [ name: " ClockControl ", parent: topViewer, wx: leftEdge, wy: sib.wy+sib.wh+betweenHeight, wh: entryHeight, border: FALSE, scrollable: FALSE], font: labelFont ]; sib _ Buttons.Create[ info: [name: "Read", parent: topViewer, wx: sib.wx+sib.ww+xFudge, wy: sib.wy, wh: entryHeight, scrollable: FALSE ], font: activeFont, proc: ReadClockControl ]; sib _ Buttons.Create[ info: [name: "Write", parent: topViewer, wx: sib.wx+sib.ww+xFudge, wy: sib.wy, wh: entryHeight, scrollable: FALSE ], font: activeFont, proc: WriteClockControl ]; sib _ Buttons.Create[ info: [name: " FreqSelect: ", parent: topViewer, wx: sib.wx+sib.ww+xFudge+5, wy: sib.wy, wh: entryHeight, border: FALSE, scrollable: FALSE ], font: tinySelectFont, proc: FreqSelectProc ]; sib _ freqSelectLabel _ Labels.Create[ info: [name: " ", parent: topViewer, wx: sib.wx+sib.ww+xFudge+2, wy: sib.wy, wh: entryHeight, border: FALSE, scrollable: FALSE], font: labelFont ]; sib _ Buttons.Create[ info: [name: "PhaseAdjust [0..7]: ", parent: topViewer, wx: sib.wx+sib.ww+xFudge, wy: sib.wy, wh: entryHeight, border: FALSE, scrollable: FALSE ], font: tinySelectFont, proc: PhaseAdjustProc ]; sib _ phaseAdjustText _ ViewerTools.MakeNewTextViewer[ info: [parent: topViewer, wx: sib.wx+sib.ww+xFudge, wy: sib.wy, ww: 20, wh: entryHeight, border: FALSE, scrollable: FALSE] ]; sib _ Buttons.Create[ info: [name: "Delay [0..7]: ", parent: topViewer, wx: sib.wx+sib.ww+xFudge, wy: sib.wy, wh: entryHeight, border: FALSE, scrollable: FALSE ], font: tinySelectFont, proc: DelayProc ]; sib _ delayText _ ViewerTools.MakeNewTextViewer[ info: [parent: topViewer, wx: sib.wx+sib.ww+xFudge+2, wy: sib.wy, ww: 20, wh: entryHeight, border: FALSE, scrollable: FALSE]]; sib _ BuildVariousButtons[topViewer, sib]; sib _ BuildRegisterButtons[topViewer, sib]; sib _ BuildPeekPokeButtons[topViewer, sib]; sib _ BuildQuadIOButtons[topViewer, sib]; sib _ Rules.Create[ info: [parent: topViewer, wy: sib.wy+sib.wh+2, ww: topViewer.ww, wh: 2]]; Containers.ChildXBound[topViewer, sib]; sib _ BuildMiscButtons[topViewer, sib]; sib _ Rules.Create[ info: [parent: topViewer, wy: sib.wy+sib.wh+1, ww: topViewer.ww, wh: 2]]; Containers.ChildXBound[topViewer, sib]; y _ sib.wy+sib.wh+4; tsViewer _ TypeScript.Create[ info: [parent: topViewer, ww: sib.cw, wy: y, wh: topViewer.ch - y, border: FALSE] ]; TypeScript.ChangeLooks[tsViewer, 'f]; Containers.ChildYBound[topViewer, tsViewer]; Containers.ChildXBound[topViewer, tsViewer]; tsOut _ ViewerIO.CreateViewerStreams[NIL, tsViewer, tsLogFile, FALSE].out; FS.SetKeep[tsLogFile, 6]; TSOutPutF["\tTypescript on file: %g, started at %g\n", [rope[tsLogFile]], [time[BasicTime.Now[]]] ]; }; topViewer.inhibitDestroy _ TRUE; RETURN[tsOut]; }; OpenConnectionProc: ClickProc = { name: ROPE = ViewerTools.GetContents[connectionText]; ok: BOOL = SoftcardOps.EstablishConnection[name]; isRunning: BOOL = SoftcardOps.ReadControlBit[dragonRun]; IF ok THEN { IF isRunning THEN SetDragonStateLabelButton[running] ELSE SetDragonStateLabelButton[stopped]; TSOutPutF["Connection to %g has been established\n", IO.rope[name]] } ELSE TSOutPutF["Could not establish connection with %g has \n", IO.rope[name]]; }; CloseConnectionProc: ClickProc = { SoftcardOps.CloseConnection[]; TSOutPutRope["Connection has been closed\n\n"]; SetDragonStateLabelButton[unknown]; }; ReadClockControl: ClickProc = { current: SoftcardOps.ClockControl = SoftcardOps.ReadClockControl[]; TSOutPutF[ " Current value of clock control is: [freqSelect: %g, phaseAdjust: %g, delay: %g]\n", [rope[freqSelectArray[current.freqSelect].name]], [integer[current.phaseAdjust]], [integer[current.delay]] ]; freqSelectChoice _ current.freqSelect; Labels.Set[freqSelectLabel, freqSelectArray[freqSelectChoice].name ]; ViewerTools.SetContents[phaseAdjustText, IO.PutFR[NIL, [integer[current.phaseAdjust]]] ]; ViewerTools.SetContents[delayText, IO.PutFR[NIL, [integer[current.delay]]] ]; }; WriteClockControl: ClickProc = { new: SoftcardOps.ClockControl; ok: BOOL; typeIn: CARD32; IF freqSelectChoice = -1 THEN { TSOutPutRope[" Please select a frequency first\n"]; RETURN; }; new.freqSelect _ freqSelectArray[freqSelectChoice].val; [ok, typeIn] _ CheckedGetAsCard[phaseAdjustText, "PhaseAdjust", 7]; IF ~ok THEN RETURN; new.phaseAdjust _ typeIn; [ok, typeIn] _ CheckedGetAsCard[delayText, "Delay", 7]; IF ~ok THEN RETURN; new.delay _ typeIn; SoftcardOps.WriteClockControl[new]; TSOutPutRope[" New value of clockControl has been set\n"]; }; RunOrStopProc: ClickProc = { IF dragonState = unknown THEN { TSOutPutRope[" Dragon state is unknown - can't change\n"]; RETURN }; IF dragonState = running THEN { SoftcardOps.DragonStop[]; SetDragonStateLabelButton[stopped]; } ELSE { SoftcardOps.DragonRun[]; SetDragonStateLabelButton[running]; }; }; SetDragonStateLabelButton: PUBLIC PROC[which: DragonState] = { IF dragonState = which THEN RETURN; -- nothing to do SELECT which FROM running => Buttons.ReLabel[runOrStopButton, runChoice]; stopped => Buttons.ReLabel[runOrStopButton, stopChoice]; unknown => Buttons.ReLabel[runOrStopButton, unknownChoice]; ENDCASE => ERROR; dragonState _ which; }; ConnectionTextProc: ClickProc = { ViewerTools.SetSelection[connectionText, NIL] }; FreqSelectProc: ClickProc = { which: INT = PopUpSelection.Request[ header: "Frequency Select", choice: LIST[freqSelectArray[0].name, freqSelectArray[1].name, freqSelectArray[2].name, freqSelectArray[3].name] ]; IF which = 0 THEN RETURN; -- no selection Labels.Set[freqSelectLabel, freqSelectArray[which - 1].name]; freqSelectChoice _ which - 1; }; PhaseAdjustProc: ClickProc = { ViewerTools.SetSelection[phaseAdjustText, NIL] }; DelayProc: ClickProc = { ViewerTools.SetSelection[delayText, NIL] }; HaltDragonProc: ClickProc = { which: INT = PopUpSelection.Request[ header: "DragonPhase", choice: LIST["phaseA", "betweenAandB", "phaseB", "betweenBandA"] ]; phase: SoftcardOps.DragonPhase; name: ROPE; IF which = 0 THEN RETURN; SELECT which FROM 1 => { phase _ phaseA; name _ "phaseA" }; 2 => { phase _ betweenAandB; name _ "betweenAandB" }; 3 => { phase _ phaseB; name _ "phaseB" }; 4 => { phase _ betweenBandA; name _ "betweenBandA" }; ENDCASE => ERROR; SoftcardOps.DragonHaltInPhase[phase]; TSOutPutF[" Dragon has been halted in %g\n", IO.rope[name] ]; SetDragonStateLabelButton[stopped]; }; QuarterStepProc: ClickProc = { DoStep[quarter, "quarter"] }; HalfStepProc: ClickProc = { DoStep[half, "half"] }; FullStepProc: ClickProc = { DoStep[full, "full"] }; DoStep: PROC[step: SoftcardOps.DragonStepSize, name: ROPE] = { ok: BOOL = SoftcardOps.DragonStep[step]; IF ~ok THEN { TSOutPutRope["Dragon can only be stepped when halted\n"]; RETURN }; TSOutPutF[" Dragon has been stepped by one %g cycle\n", IO.rope[name] ]; }; CurrentPhaseProc: ClickProc = { phase: SoftcardOps.DragonPhase; ok: BOOL; name: ROPE; IF dragonState # stopped THEN { TSOutPutRope["Current phase can only be shown when the Dragon is halted\n"]; RETURN }; [phase, ok] _ SoftcardOps.CurrentDragonPhase[]; IF ~ok THEN { TSOutPutRope[" Softcard returned not ok - phase not readable\n"]; RETURN }; SELECT phase FROM phaseA => name _ "phaseA"; betweenAandB => name _ "betweenAandB"; phaseB => name _ "phaseB"; betweenBandA => name _ "betweenBandA" ENDCASE => ERROR; TSOutPutF["Dragon is stopped in %g\n", IO.rope[name] ]; }; GetAsInt: PUBLIC PROC[who: Viewer] RETURNS[val: INT] = { rope: ROPE = ViewerTools.GetContents[who]; val _ -1; val _ Convert.IntFromRope[rope ! Convert.Error => CONTINUE]; }; GetAsCard: PUBLIC PROC[who: Viewer] RETURNS[val: CARD32] = { rope: ROPE = ViewerTools.GetContents[who]; val _ LAST[CARD32]; val _ Convert.CardFromRope[rope ! Convert.Error => CONTINUE]; }; CheckedGetAsCard: PUBLIC PROC[who: Viewer, which: ROPE, max: CARD32] RETURNS[ok: BOOL, val: CARD32] = { typeIn: ROPE = ViewerTools.GetContents[who]; val _ LAST[CARD32]; ok _ TRUE; IF typeIn.Length[] = 0 THEN { IF which # NIL THEN TSOutPutF["\n**** Please fill in the %g field\n", [rope[which]] ]; RETURN[FALSE, val ]; }; val _ Convert.CardFromRope[typeIn ! Convert.Error => { ok _ FALSE; CONTINUE}]; IF ~ok THEN { IF which # NIL THEN TSOutPutF["\n**** %g is not a number in the %g field\n", [rope[typeIn]], [rope[which]] ]; RETURN[FALSE, val]; }; IF max # 0 THEN ok _ CheckForValid[val, max, which]; RETURN[ok, val]; }; CheckForValid: PUBLIC PROC[val, max: CARD32, which: ROPE] RETURNS[ok: BOOL] = { IF val > max THEN { TSOutPutF["\n*** %g field is restricted to [1..%xH], %g is invalid\n", [rope[which]], [cardinal[max]], [cardinal[val]] ]; RETURN[FALSE]; }; RETURN[TRUE]; }; tsCount: CARDINAL _ 0; flushCount: CARDINAL _ 5; TSOutPutF: PUBLIC PROC[format: ROPE _ NIL, v1, v2, v3, v4, v5: Value _ [null[]]] = { tsOut.PutF[format, v1, v2, v3, v4, v5]; IF (tsCount _ tsCount + 1) > flushCount THEN { tsOut.Flush[]; tsCount _ 0; }; }; TSOutPutRope: PUBLIC PROC[r: ROPE] = { tsOut.PutRope[r]; IF (tsCount _ tsCount + 1) > flushCount THEN { tsOut.Flush[]; tsCount _ 0; }; }; TSOutPutChar: PUBLIC PROC[ch: CHAR] = { tsOut.PutChar[ch]; IF (tsCount _ tsCount + 1) > flushCount THEN { tsOut.Flush[]; tsCount _ 0; }; }; SoftcardTool: Commander.CommandProc = { regDir _ CommandTool.RegistrationDirectory[cmd]; [] _ MakeControlWindow["SoftcardTool","///temp/SoftcardTool.log"]; topViewer.inhibitDestroy _ FALSE; }; Init: PROC = { freqSelectArray[0] _ ["stopped", 0]; freqSelectArray[1] _ ["6.6 mhz", 1]; freqSelectArray[2] _ ["10 mhz", 2]; freqSelectArray[3] _ ["5 mhz", 3]; activeFont _ ImagerFont.Find["Xerox/TiogaFonts/Tioga10B"]; labelFont _ ImagerFont.Find["Xerox/TiogaFonts/Tioga10I"]; selectFont _ ImagerFont.Find["Xerox/TiogaFonts/Helvetica10"]; tinySelectFont _ ImagerFont.Find["Xerox/TiogaFonts/Helvetica7"]; }; Init[]; Commander.Register["SoftcardTool", SoftcardTool]; END. SoftcardToolImpl.mesa Copyright Σ 1987 by Xerox Corporation. All rights reserved. Willie-Sue, March 19, 1987 12:27:49 pm PST variables * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * line 1 of Buttons DragonRunControl Halting and stepping ClockControl the other buttonss the rest of the viewer - typescript StepDragonProc: ClickProc = { which: INT = PopUpSelection.Request[ header: "DragonStep", choice: LIST["quarter", "half", "full"] ]; step: SoftcardOps.DragonStepSize; name: ROPE; IF which = 0 THEN RETURN; IF dragonState # stopped THEN { TSOutPutRope["Dragon can only be stepped when halted\n"]; RETURN }; SELECT which FROM 1 => { step _ quarter; name _ "quarter" }; 2 => { step _ half; name _ "half" }; 3 => { step _ full; name _ "full" }; ENDCASE => ERROR; [] _ SoftcardOps.DragonStep[step]; TSOutPutF[" Dragon has been stepped by one %g cycle\n", IO.rope[name] ]; }; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Κ˜codešœ™Kšœ<™—Jšœ'˜'J˜—šœ™šœ˜šœ7˜7Jšœ@˜@Jšœ œœ˜#—J˜J˜—šœ'˜'šœ/˜/Jšœ7˜7Jšœ œœ˜"—Jšœ(˜(J˜——™šœ˜šœ8˜8Jšœ@˜@Jšœ œœ˜"—Jšœ)˜)J˜—šœ˜šœ:˜:Jšœ9˜9Jšœ œœ˜"—Jšœ+˜+J˜—šœ˜šœ0˜0Jšœ9˜9Jšœ œœ˜#—Jšœ˜J˜—šœ˜šœ+˜+Jšœ7˜7Jšœ œœ˜"—Jšœ*˜*J˜—šœ˜šœ(˜(Jšœ7˜7Jšœ œœ˜"—Jšœ'˜'J˜—šœ˜šœ(˜(Jšœ7˜7Jšœ œœ˜"—Jšœ'˜'J˜——™ šœ˜šœ3˜3Jšœ@˜@Jšœ œœ˜#—J˜—J˜šœ˜šœ'˜'JšœCœ˜K—Jšœ+˜+—J˜šœ˜šœ(˜(JšœCœ˜K—Jšœ,˜,J˜—šœ˜šœ1˜1Jšœ8˜8Jšœœœ˜#—Jšœ-˜-J˜—šœ&˜&JšœT˜TJšœœœ˜5Jšœ˜—J˜šœ˜šœ7˜7Jšœ6˜6Jšœœœ˜#—Jšœ.˜.J˜—šœ6˜6Jšœ?˜?Jšœ"œœ˜>J˜—šœ˜šœ2˜2Jšœ6˜6Jšœœœ˜#—Jšœ(˜(J˜—šœ0˜0JšœA˜AJšœ"œœ˜=—J˜—™Jšœ*˜*Jšœ+˜+Jšœ+˜+Jšœ)˜)˜JšœI˜IJšœ'˜'—Jšœ'˜'J™—™#˜JšœI˜IJšœ'˜'—J˜Jšœœ˜˜JšœLœ˜U—Jšœ%˜%Jšœ,˜,Jšœ,˜,Jšœ%œœ˜JJšœ˜šœ6˜6Jšœ-˜-—J˜—Jšœœ˜ Jšœ˜Jšœ˜J˜—šžœ˜!Jšœœ+˜5Jšœœ*˜2Jšœ œ)˜8šœœ˜ šœ œ#˜4Jšœ$˜(—Jšœ5œ ˜CJ˜š˜Jšœ;œ ˜J——J˜J˜—šžœ˜"Jšœ˜Jšœ/˜/Jšœ#˜#Jšœ˜J˜—šžœ˜JšœC˜Cšœ ˜ JšœU˜UJšœQ˜QJšœ˜—Jšœ&˜&JšœE˜EJšœ)œœ$˜YJšœ#œœ˜MJ˜J˜—šžœ˜ Jšœ˜Jšœœ˜ Jšœœ˜šœœ˜Jšœ3˜3Jšœ˜Jšœ˜—Jšœ7˜7šœC˜CJšœœœ˜—Jšœ˜šœ7˜7Jšœœœ˜—Jšœ˜Jšœ#˜#Jšœ:˜:J˜J˜—šž œ˜šœœ˜Jšœ:˜:Jš˜J˜—šœœ˜J˜Jšœ#˜#J˜šœ˜J˜Jšœ#˜#J˜——J˜J˜—šžœœœ˜>JšœœœΟc˜5šœ˜Jšœ7˜7Jšœ8˜8Jšœ;˜;Jšœœ˜—Jšœ˜J˜J˜—šžœ ˜Jšœ+œ˜2J˜—šžœ˜šœœ˜$Jšœ˜šœœK˜WJ˜—J˜—Jšœ œœŸ˜*Jšœ=˜=Jšœ˜Jšœ˜J˜—šžœ ˜Jšœ,œ˜3J˜—šž œ ˜Jšœ&œ˜-J˜—šžœ˜šœœ˜$Jšœ˜Jšœœ7˜C—Jšœ˜Jšœœ˜ Jšœ œœ˜šœ˜Jšœ)˜)Jšœ5˜5Jšœ)˜)Jšœ5˜5Jšœœ˜—Jšœ%˜%Jšœ-œ˜=Jšœ#˜#J˜J˜—šžœ™šœœ™$Jšœ™Jšœœ™*—Jšœ!™!Jšœœ™ Jšœ œœ™šœœ™Jšœ9™9Jš™J™—šœ™Jšœ*™*Jšœ$™$Jšœ$™$Jšœœ™—Jšœ"™"Jšœ8œ™HJ™J™—šžœ-˜Jšœœ ˜(šœœ˜ Jšœ9˜9Jš˜J˜—Jšœ8œ˜HJ˜J˜—šžœ˜Jšœ˜Jšœœ˜ Jšœœ˜ šœœ˜JšœL˜LJš˜J˜—Jšœ/˜/šœœ˜ JšœA˜AJš˜J˜—šœ˜Jšœ˜Jšœ&˜&Jšœ˜Jšœ%˜%Jšœœ˜—Jšœ'œ˜7Jšœ˜J˜—š žœœœœœ˜8Jšœœ ˜*Jšœ ˜ Jšœ2œ˜