DIRECTORY AMModel USING [CharIndex], AMModelPrivate USING [EPI, FGIndex, FGNull, NullPCOffset, PCOffset], BrandXSymbolDefs USING [ SymbolTableBase, BodyTableEntry, FineGrainTableEntry, rootBodyIndex, BodyIndex, nullBodyIndex], BrandYSymbolDefs USING [ SymbolTableBase, BodyTableEntry, FineGrainTableEntry, rootBodyIndex, BodyIndex, nullBodyIndex], RTSymbolDefs USING [SymbolTableBase]; AMModelPrivateImpl: PROGRAM EXPORTS AMModelPrivate = BEGIN OPEN AMModel, AMModelPrivate, bx: BrandXSymbolDefs, by: BrandYSymbolDefs, RTSymbolDefs; XBodyPtr: TYPE = LONG POINTER TO bx.BodyTableEntry; YBodyPtr: TYPE = LONG POINTER TO by.BodyTableEntry; EPIndex: TYPE = AMModelPrivate.EPI; FGCard: TYPE = CARDINAL; XFGPtr: TYPE = LONG POINTER TO bx.FineGrainTableEntry; YFGPtr: TYPE = LONG POINTER TO by.FineGrainTableEntry; fudge: INT _ 8; -- number of characters to assume beyond the last fgi in a procedure FGIToEPI: PUBLIC PROC [stb: SymbolTableBase, fgi: FGIndex] RETURNS [EPIndex] = { WITH stb SELECT FROM t: SymbolTableBase.x => RETURN[FGIToEPIX[t.e, fgi]]; t: SymbolTableBase.y => RETURN[FGIToEPIY[t.e, fgi]]; ENDCASE => ERROR}; FGIToEPIX: PROC [stb: bx.SymbolTableBase, fgi: FGIndex] RETURNS [epi: EPIndex _ 0] = { bti: bx.BodyIndex; IF fgi = FGNull THEN RETURN; bti _ FGItoBTIX[stb, fgi]; IF bti # bx.nullBodyIndex THEN { body: XBodyPtr _ @stb.bb[bti]; WITH ext: body^ SELECT FROM Callable => epi _ ext.entryIndex; ENDCASE => RETURN; }; }; FGIToEPIY: PROC [stb: by.SymbolTableBase, fgi: FGIndex] RETURNS [epi: EPIndex _ 0] = { bti: by.BodyIndex; IF fgi = FGNull THEN RETURN; bti _ FGItoBTIY[stb, fgi]; IF bti # by.nullBodyIndex THEN { body: YBodyPtr _ @stb.bb[bti]; WITH ext: body^ SELECT FROM Callable => epi _ ext.entryIndex; ENDCASE => RETURN; }; }; EPIToFirstFGI: PUBLIC PROC [stb: SymbolTableBase, epi: EPIndex, skipArgs: BOOL] RETURNS [FGIndex] = { WITH stb SELECT FROM t: SymbolTableBase.x => RETURN[EPIToFirstFGIX[t.e, epi, skipArgs]]; t: SymbolTableBase.y => RETURN[EPIToFirstFGIY[t.e, epi, skipArgs]]; ENDCASE => ERROR}; EPIToFirstFGIX: PROC [stb: bx.SymbolTableBase, epi: EPIndex, skipArgs: BOOL] RETURNS [fgi: FGIndex _ FGNull] = { bti: bx.BodyIndex _ EPItoBTIX[stb, epi]; IF bti = bx.nullBodyIndex THEN RETURN; WITH info: stb.bb[bti].info SELECT FROM External => fgi _ [fgCard: info.startIndex, fudge: FALSE]; ENDCASE; IF skipArgs AND fgi # FGNull THEN { pc: PCOffset _ FGIToFirstPC[[x[stb]], fgi]; DO nfgi: FGIndex _ NextFGIX[stb, fgi, epi]; npc: PCOffset; IF nfgi = FGNull THEN RETURN [fgi]; npc _ FGIToFirstPCX[stb, nfgi]; IF npc # pc THEN RETURN [nfgi]; fgi _ nfgi; ENDLOOP}; }; EPIToFirstFGIY: PROC [stb: by.SymbolTableBase, epi: EPIndex, skipArgs: BOOL] RETURNS [fgi: FGIndex _ FGNull] = { bti: by.BodyIndex _ EPItoBTIY[stb, epi]; IF bti = by.nullBodyIndex THEN RETURN; WITH info: stb.bb[bti].info SELECT FROM External => fgi _ [fgCard: info.startIndex, fudge: FALSE]; ENDCASE; IF skipArgs AND fgi # FGNull THEN { pc: PCOffset _ FGIToFirstPC[[y[stb]], fgi]; DO nfgi: FGIndex _ NextFGIY[stb, fgi, epi]; npc: PCOffset; IF nfgi = FGNull THEN RETURN [fgi]; npc _ FGIToFirstPCY[stb, nfgi]; IF npc # pc THEN RETURN [nfgi]; fgi _ nfgi; ENDLOOP}; }; EPIToLastFGI: PUBLIC PROC [stb: SymbolTableBase, epi: EPIndex] RETURNS [FGIndex] = { WITH stb SELECT FROM t: SymbolTableBase.x => RETURN[EPIToLastFGIX[t.e, epi]]; t: SymbolTableBase.y => RETURN[EPIToLastFGIY[t.e, epi]]; ENDCASE => ERROR}; EPIToLastFGIX: PROC [stb: bx.SymbolTableBase, epi: EPIndex] RETURNS [fgi: FGIndex _ FGNull] = { bti: bx.BodyIndex _ EPItoBTIX[stb, epi]; IF bti = bx.nullBodyIndex THEN RETURN; WITH info: stb.bb[bti].info SELECT FROM External => fgi _ [fgCard: info.startIndex + MAX[info.indexLength, 1] - 1, fudge: TRUE]; ENDCASE; }; EPIToLastFGIY: PROC [stb: by.SymbolTableBase, epi: EPIndex] RETURNS [fgi: FGIndex _ FGNull] = { bti: by.BodyIndex _ EPItoBTIY[stb, epi]; IF bti = by.nullBodyIndex THEN RETURN; WITH info: stb.bb[bti].info SELECT FROM External => fgi _ [fgCard: info.startIndex + MAX[info.indexLength, 1] - 1, fudge: TRUE]; ENDCASE; }; EPIToFirstPC: PUBLIC PROC [stb: SymbolTableBase, epi: EPIndex, skipArgs: BOOL] RETURNS [pc: PCOffset _ NullPCOffset] = { fgi: FGIndex _ EPIToFirstFGI[stb, epi, skipArgs]; IF fgi = FGNull THEN RETURN; pc _ FGIToFirstPC[stb, fgi]; }; EPIToLastPC: PUBLIC PROC [stb: SymbolTableBase, epi: EPIndex] RETURNS [PCOffset] = { WITH stb SELECT FROM t: SymbolTableBase.x => RETURN[EPIToLastPCX[t.e, epi]]; t: SymbolTableBase.y => RETURN[EPIToLastPCY[t.e, epi]]; ENDCASE => ERROR}; EPIToLastPCX: PROC [stb: bx.SymbolTableBase, epi: EPIndex] RETURNS [pc: PCOffset _ NullPCOffset] = { bti: bx.BodyIndex _ EPItoBTIX[stb, epi]; IF bti = bx.nullBodyIndex THEN RETURN; WITH info: stb.bb[bti].info SELECT FROM External => {pc _ info.bytes; pc _ pc - 1}; ENDCASE; }; EPIToLastPCY: PROC [stb: by.SymbolTableBase, epi: EPIndex] RETURNS [pc: PCOffset _ NullPCOffset] = { bti: by.BodyIndex _ EPItoBTIY[stb, epi]; IF bti = by.nullBodyIndex THEN RETURN; WITH info: stb.bb[bti].info SELECT FROM External => {pc _ info.bytes; pc _ pc - 1}; ENDCASE; }; CharIndexToFGI: PUBLIC PROC [stb: SymbolTableBase, ci: CharIndex] RETURNS [FGIndex] = { WITH stb SELECT FROM t: SymbolTableBase.x => RETURN[CharIndexToFGIX[t.e, ci]]; t: SymbolTableBase.y => RETURN[CharIndexToFGIY[t.e, ci]]; ENDCASE => ERROR}; CharIndexToFGIX: PROC [stb: bx.SymbolTableBase, ci: CharIndex] RETURNS [fgi: FGIndex _ FGNull] = { bti: bx.BodyIndex _ bx.nullBodyIndex; bti _ CItoBTIX[stb, ci]; IF bti # bx.nullBodyIndex THEN { body: XBodyPtr _ @stb.bb[bti]; WITH info: body.info SELECT FROM External => { firstFGI: FGCard _ info.startIndex; lastFGI: FGCard _ firstFGI + MAX[info.indexLength, 1] - 1; thisCI: CharIndex _ body.sourceIndex; fgi _ [fgCard: firstFGI, fudge: FALSE]; FOR tfgi: FGCard IN [firstFGI..lastFGI] DO fp: XFGPtr _ @stb.fgTable[tfgi]; nextCI: CharIndex _ thisCI; fgi.fgCard _ tfgi; WITH fp^ SELECT FROM normal => nextCI _ nextCI + deltaSource; step => IF which = source THEN { thisCI _ nextCI + delta; LOOP}; ENDCASE; IF nextCI > ci THEN RETURN; thisCI _ nextCI; ENDLOOP; fgi.fudge _ TRUE; }; ENDCASE; }; }; CharIndexToFGIY: PROC [stb: by.SymbolTableBase, ci: CharIndex] RETURNS [fgi: FGIndex _ FGNull] = { bti: by.BodyIndex _ by.nullBodyIndex; bti _ CItoBTIY[stb, ci]; IF bti # by.nullBodyIndex THEN { body: YBodyPtr _ @stb.bb[bti]; WITH info: body.info SELECT FROM External => { firstFGI: FGCard _ info.startIndex; lastFGI: FGCard _ firstFGI + MAX[info.indexLength, 1] - 1; thisCI: CharIndex _ body.sourceIndex; fgi _ [fgCard: firstFGI, fudge: FALSE]; FOR tfgi: FGCard IN [firstFGI..lastFGI] DO fp: YFGPtr _ @stb.fgTable[tfgi]; nextCI: CharIndex _ thisCI; fgi.fgCard _ tfgi; WITH fp^ SELECT FROM normal => nextCI _ nextCI + deltaSource; step => IF which = source THEN { thisCI _ nextCI + delta; LOOP}; ENDCASE; IF nextCI > ci THEN RETURN; thisCI _ nextCI; ENDLOOP; fgi.fudge _ TRUE; }; ENDCASE; }; }; PCToFGI: PUBLIC PROC [stb: SymbolTableBase, epi: EPIndex, pc: PCOffset] RETURNS [FGIndex] = { WITH stb SELECT FROM t: SymbolTableBase.x => RETURN[PCToFGIX[t.e, epi, pc]]; t: SymbolTableBase.y => RETURN[PCToFGIY[t.e, epi, pc]]; ENDCASE => ERROR}; PCToFGIX: PROC [stb: bx.SymbolTableBase, epi: EPIndex, pc: PCOffset] RETURNS [fgi: FGIndex _ FGNull] = { bti: bx.BodyIndex _ EPItoBTIX[stb, epi]; IF bti # bx.nullBodyIndex THEN { body: XBodyPtr _ @stb.bb[bti]; WITH info: body.info SELECT FROM External => { firstFGI: FGCard _ info.startIndex; lastFGI: FGCard _ firstFGI + MAX[info.indexLength, 1] - 1; rem: INT _ pc; IF pc >= info.bytes THEN RETURN [FGNull]; fgi _ [fgCard: firstFGI, fudge: FALSE]; FOR tfgi: FGCard IN [firstFGI..lastFGI] DO fp: XFGPtr _ @stb.fgTable[tfgi]; fgi.fgCard _ tfgi; IF rem = 0 THEN RETURN; WITH fp^ SELECT FROM normal => rem _ rem - deltaObject; step => IF which = object THEN rem _ rem - delta; ENDCASE; IF rem < 0 THEN RETURN; ENDLOOP; fgi.fudge _ TRUE; }; ENDCASE; }; }; PCToFGIY: PROC [stb: by.SymbolTableBase, epi: EPIndex, pc: PCOffset] RETURNS [fgi: FGIndex _ FGNull] = { bti: by.BodyIndex _ EPItoBTIY[stb, epi]; IF bti # by.nullBodyIndex THEN { body: YBodyPtr _ @stb.bb[bti]; WITH info: body.info SELECT FROM External => { firstFGI: FGCard _ info.startIndex; lastFGI: FGCard _ firstFGI + MAX[info.indexLength, 1] - 1; rem: INT _ pc; IF pc >= info.bytes THEN RETURN [FGNull]; fgi _ [fgCard: firstFGI, fudge: FALSE]; FOR tfgi: FGCard IN [firstFGI..lastFGI] DO fp: YFGPtr _ @stb.fgTable[tfgi]; fgi.fgCard _ tfgi; IF rem = 0 THEN RETURN; WITH fp^ SELECT FROM normal => rem _ rem - deltaObject; step => IF which = object THEN rem _ rem - delta; ENDCASE; IF rem < 0 THEN RETURN; ENDLOOP; fgi.fudge _ TRUE; }; ENDCASE; }; }; NextFGI: PUBLIC PROC [stb: SymbolTableBase, fgi: FGIndex, epi: EPIndex] RETURNS [FGIndex] = { WITH stb SELECT FROM t: SymbolTableBase.x => RETURN[NextFGIX[t.e, fgi, epi]]; t: SymbolTableBase.y => RETURN[NextFGIY[t.e, fgi, epi]]; ENDCASE => ERROR}; NextFGIX: PROC [stb: bx.SymbolTableBase, fgi: FGIndex, epi: EPIndex] RETURNS [nfgi: FGIndex _ FGNull] = { bti: bx.BodyIndex; IF fgi = FGNull THEN RETURN; bti _ EPItoBTIX[stb, epi]; IF bti # bx.nullBodyIndex THEN WITH info: stb.bb[bti].info SELECT FROM External => { firstFGI: FGCard _ info.startIndex; lastFGI: FGCard _ firstFGI + MAX[info.indexLength, 1] - 1; IF fgi.fudge OR fgi.fgCard NOT IN [firstFGI..lastFGI] THEN RETURN; IF fgi.fgCard = lastFGI THEN fgi.fudge _ TRUE ELSE fgi.fgCard _ fgi.fgCard + 1; nfgi _ fgi; }; ENDCASE; }; NextFGIY: PROC [stb: by.SymbolTableBase, fgi: FGIndex, epi: EPIndex] RETURNS [nfgi: FGIndex _ FGNull] = { bti: by.BodyIndex; IF fgi = FGNull THEN RETURN; bti _ EPItoBTIY[stb, epi]; IF bti # by.nullBodyIndex THEN WITH info: stb.bb[bti].info SELECT FROM External => { firstFGI: FGCard _ info.startIndex; lastFGI: FGCard _ firstFGI + MAX[info.indexLength, 1] - 1; IF fgi.fudge OR fgi.fgCard NOT IN [firstFGI..lastFGI] THEN RETURN; IF fgi.fgCard = lastFGI THEN fgi.fudge _ TRUE ELSE fgi.fgCard _ fgi.fgCard + 1; nfgi _ fgi; }; ENDCASE; }; FGIToFirstChar: PUBLIC PROC [stb: SymbolTableBase, fgi: FGIndex] RETURNS [ci: CharIndex] = { WITH stb SELECT FROM t: SymbolTableBase.x => RETURN[FGIToFirstCharX[t.e, fgi]]; t: SymbolTableBase.y => RETURN[FGIToFirstCharY[t.e, fgi]]; ENDCASE => ERROR}; FGIToFirstCharX: PROC [stb: bx.SymbolTableBase, fgi: FGIndex] RETURNS [ci: CharIndex _ -1] = { bti: bx.BodyIndex _ FGItoBTIX[stb, fgi]; IF bti # bx.nullBodyIndex THEN { body: XBodyPtr _ @stb.bb[bti]; WITH info: body.info SELECT FROM External => { ci _ body.sourceIndex; FOR tfgi: FGCard _ info.startIndex, tfgi + 1 DO fp: XFGPtr _ @stb.fgTable[tfgi]; WITH fp^ SELECT FROM normal => IF tfgi # fgi.fgCard THEN ci _ ci + deltaSource ELSE EXIT; step => {-- think of the step fgi as part of the next real fgi IF tfgi = fgi.fgCard THEN EXIT; IF which = object THEN LOOP; IF which # source THEN ERROR; IF tfgi + 1 = fgi.fgCard THEN EXIT; IF stb.fgTable[tfgi+1].tag = step AND tfgi + 2 = fgi.fgCard THEN EXIT; ci _ ci + delta; }; ENDCASE; ENDLOOP; }; ENDCASE; }; }; FGIToFirstCharY: PROC [stb: by.SymbolTableBase, fgi: FGIndex] RETURNS [ci: CharIndex _ -1] = { bti: by.BodyIndex _ FGItoBTIY[stb, fgi]; IF bti # by.nullBodyIndex THEN { body: YBodyPtr _ @stb.bb[bti]; WITH info: body.info SELECT FROM External => { ci _ body.sourceIndex; FOR tfgi: FGCard _ info.startIndex, tfgi + 1 DO fp: YFGPtr _ @stb.fgTable[tfgi]; WITH fp^ SELECT FROM normal => IF tfgi # fgi.fgCard THEN ci _ ci + deltaSource ELSE EXIT; step => {-- think of the step fgi as part of the next real fgi IF tfgi = fgi.fgCard THEN EXIT; IF which = object THEN LOOP; IF which # source THEN ERROR; IF tfgi + 1 = fgi.fgCard THEN EXIT; IF stb.fgTable[tfgi+1].tag = step AND tfgi + 2 = fgi.fgCard THEN EXIT; ci _ ci + delta; }; ENDCASE; ENDLOOP; }; ENDCASE; }; }; FGIToLastChar: PUBLIC PROC [stb: SymbolTableBase, fgi: FGIndex] RETURNS [ci: CharIndex] = { WITH stb SELECT FROM t: SymbolTableBase.x => RETURN[FGIToLastCharX[t.e, fgi]]; t: SymbolTableBase.y => RETURN[FGIToLastCharY[t.e, fgi]]; ENDCASE => ERROR}; FGIToLastCharX: PROC [stb: bx.SymbolTableBase, fgi: FGIndex] RETURNS [ci: CharIndex _ -1] = { bti: bx.BodyIndex _ FGItoBTIX[stb, fgi]; IF bti # bx.nullBodyIndex THEN { body: XBodyPtr _ @stb.bb[bti]; WITH info: body.info SELECT FROM External => { firstFGI: FGCard _ info.startIndex; lastFGI: FGCard _ firstFGI + MAX[info.indexLength, 1] - 1; ci _ body.sourceIndex; FOR tfgi: FGCard IN [firstFGI..fgi.fgCard] DO fp: XFGPtr _ @stb.fgTable[tfgi]; WITH fp^ SELECT FROM normal => ci _ ci + deltaSource; step => IF which = source THEN ci _ ci + delta; ENDCASE; ENDLOOP; IF fgi.fudge THEN ci _ ci + fudge --XXX ELSE ci _ ci - 1; }; ENDCASE; }; }; FGIToLastCharY: PROC [stb: by.SymbolTableBase, fgi: FGIndex] RETURNS [ci: CharIndex _ -1] = { bti: by.BodyIndex _ FGItoBTIY[stb, fgi]; IF bti # by.nullBodyIndex THEN { body: YBodyPtr _ @stb.bb[bti]; WITH info: body.info SELECT FROM External => { firstFGI: FGCard _ info.startIndex; lastFGI: FGCard _ firstFGI + MAX[info.indexLength, 1] - 1; ci _ body.sourceIndex; FOR tfgi: FGCard IN [firstFGI..fgi.fgCard] DO fp: YFGPtr _ @stb.fgTable[tfgi]; WITH fp^ SELECT FROM normal => ci _ ci + deltaSource; step => IF which = source THEN ci _ ci + delta; ENDCASE; ENDLOOP; IF fgi.fudge THEN ci _ ci + fudge --XXX ELSE ci _ ci - 1; }; ENDCASE; }; }; FGIToFirstPC: PUBLIC PROC [stb: SymbolTableBase, fgi: FGIndex] RETURNS [pc: PCOffset] = { WITH stb SELECT FROM t: SymbolTableBase.x => RETURN[FGIToFirstPCX[t.e, fgi]]; t: SymbolTableBase.y => RETURN[FGIToFirstPCY[t.e, fgi]]; ENDCASE => ERROR}; FGIToFirstPCX: PROC [stb: bx.SymbolTableBase, fgi: FGIndex] RETURNS [pc: PCOffset _ NullPCOffset] = { bti: bx.BodyIndex _ FGItoBTIX[stb, fgi]; IF bti # bx.nullBodyIndex THEN { body: XBodyPtr _ @stb.bb[bti]; WITH info: body.info SELECT FROM External => { pc _ 0; FOR tfgi: FGCard _ info.startIndex, tfgi + 1 DO fp: XFGPtr _ @stb.fgTable[tfgi]; WITH fp^ SELECT FROM normal => IF tfgi # fgi.fgCard THEN pc _ pc + deltaObject ELSE EXIT; step => {-- think of the step fgi as part of the next real fgi IF tfgi = fgi.fgCard THEN EXIT; IF which = source THEN LOOP; IF which # object THEN ERROR; IF tfgi + 1 = fgi.fgCard THEN EXIT; IF stb.fgTable[tfgi+1].tag = step AND tfgi + 2 = fgi.fgCard THEN EXIT; pc _ pc + delta; }; ENDCASE; ENDLOOP; }; ENDCASE; }; }; FGIToFirstPCY: PROC [stb: by.SymbolTableBase, fgi: FGIndex] RETURNS [pc: PCOffset _ NullPCOffset] = { bti: by.BodyIndex _ FGItoBTIY[stb, fgi]; IF bti # by.nullBodyIndex THEN { body: YBodyPtr _ @stb.bb[bti]; WITH info: body.info SELECT FROM External => { pc _ 0; FOR tfgi: FGCard _ info.startIndex, tfgi + 1 DO fp: YFGPtr _ @stb.fgTable[tfgi]; WITH fp^ SELECT FROM normal => IF tfgi # fgi.fgCard THEN pc _ pc + deltaObject ELSE EXIT; step => {-- think of the step fgi as part of the next real fgi IF tfgi = fgi.fgCard THEN EXIT; IF which = source THEN LOOP; IF which # object THEN ERROR; IF tfgi + 1 = fgi.fgCard THEN EXIT; IF stb.fgTable[tfgi+1].tag = step AND tfgi + 2 = fgi.fgCard THEN EXIT; pc _ pc + delta; }; ENDCASE; ENDLOOP; }; ENDCASE; }; }; FGIToLastPC: PUBLIC PROC [stb: SymbolTableBase, fgi: FGIndex] RETURNS [pc: PCOffset] = { WITH stb SELECT FROM t: SymbolTableBase.x => RETURN[FGIToLastPCX[t.e, fgi]]; t: SymbolTableBase.y => RETURN[FGIToLastPCY[t.e, fgi]]; ENDCASE => ERROR}; FGIToLastPCX: PROC [stb: bx.SymbolTableBase, fgi: FGIndex] RETURNS [pc: PCOffset _ NullPCOffset] = { bti: bx.BodyIndex _ FGItoBTIX[stb, fgi]; IF bti # bx.nullBodyIndex THEN { body: XBodyPtr _ @stb.bb[bti]; WITH info: body.info SELECT FROM External => { firstFGI: FGCard _ info.startIndex; IF fgi.fudge THEN { pc _ info.bytes; pc _ pc - 1; RETURN}; pc _ 0; FOR tfgi: FGCard IN [firstFGI..fgi.fgCard] DO fp: XFGPtr _ @stb.fgTable[tfgi]; WITH fp^ SELECT FROM normal => pc _ pc + deltaObject; step => IF which = object THEN pc _ pc + delta; ENDCASE; ENDLOOP; pc _ pc - 1; }; ENDCASE; }; }; FGIToLastPCY: PROC [stb: by.SymbolTableBase, fgi: FGIndex] RETURNS [pc: PCOffset _ NullPCOffset] = { bti: by.BodyIndex _ FGItoBTIY[stb, fgi]; IF bti # by.nullBodyIndex THEN { body: YBodyPtr _ @stb.bb[bti]; WITH info: body.info SELECT FROM External => { firstFGI: FGCard _ info.startIndex; IF fgi.fudge THEN { pc _ info.bytes; pc _ pc - 1; RETURN}; pc _ 0; FOR tfgi: FGCard IN [firstFGI..fgi.fgCard] DO fp: YFGPtr _ @stb.fgTable[tfgi]; WITH fp^ SELECT FROM normal => pc _ pc + deltaObject; step => IF which = object THEN pc _ pc + delta; ENDCASE; ENDLOOP; pc _ pc - 1; }; ENDCASE; }; }; EPItoBTIX: PROC[stb: bx.SymbolTableBase, epi: EPIndex] RETURNS [outerBti: bx.BodyIndex _ bx.nullBodyIndex] = { innerEPItoBTI: PROC [bti: bx.BodyIndex] RETURNS [stop: BOOL _ FALSE] = { body: XBodyPtr _ @stb.bb[bti]; thisEPI: EPIndex _ 0; WITH ext: body^ SELECT FROM Callable => thisEPI _ ext.entryIndex; ENDCASE => RETURN; WITH info: body.info SELECT FROM External => IF epi = thisEPI THEN {outerBti _ bti; stop _ TRUE}; ENDCASE; }; [] _ stb.EnumerateBodies[bx.rootBodyIndex, innerEPItoBTI]; }; EPItoBTIY: PROC[stb: by.SymbolTableBase, epi: EPIndex] RETURNS [outerBti: by.BodyIndex _ by.nullBodyIndex] = { innerEPItoBTI: PROC [bti: by.BodyIndex] RETURNS [stop: BOOL _ FALSE] = { body: YBodyPtr _ @stb.bb[bti]; thisEPI: EPIndex _ 0; WITH ext: body^ SELECT FROM Callable => thisEPI _ ext.entryIndex; ENDCASE => RETURN; WITH info: body.info SELECT FROM External => IF epi = thisEPI THEN {outerBti _ bti; stop _ TRUE}; ENDCASE; }; [] _ stb.EnumerateBodies[by.rootBodyIndex, innerEPItoBTI]; }; FGItoBTIX: PROC[stb: bx.SymbolTableBase, fgi: FGIndex] RETURNS [outerBti: bx.BodyIndex _ bx.nullBodyIndex] = { innerFGItoBTI: PROC [bti: bx.BodyIndex] RETURNS [stop: BOOL _ FALSE] = { body: XBodyPtr _ @stb.bb[bti]; thisEPI: EPIndex _ 0; WITH ext: body^ SELECT FROM Callable => thisEPI _ ext.entryIndex; ENDCASE => RETURN; WITH info: body.info SELECT FROM External => { firstFGI: FGCard _ info.startIndex; lastFGI: FGCard _ firstFGI + MAX[info.indexLength, 1] - 1; IF fgi.fgCard IN [firstFGI..lastFGI] THEN { outerBti _ bti; stop _ TRUE}; }; ENDCASE; }; [] _ stb.EnumerateBodies[bx.rootBodyIndex, innerFGItoBTI]; }; FGItoBTIY: PROC[stb: by.SymbolTableBase, fgi: FGIndex] RETURNS [outerBti: by.BodyIndex _ by.nullBodyIndex] = { innerFGItoBTI: PROC [bti: by.BodyIndex] RETURNS [stop: BOOL _ FALSE] = { body: YBodyPtr _ @stb.bb[bti]; thisEPI: EPIndex _ 0; WITH ext: body^ SELECT FROM Callable => thisEPI _ ext.entryIndex; ENDCASE => RETURN; WITH info: body.info SELECT FROM External => { firstFGI: FGCard _ info.startIndex; lastFGI: FGCard _ firstFGI + MAX[info.indexLength, 1] - 1; IF fgi.fgCard IN [firstFGI..lastFGI] THEN { outerBti _ bti; stop _ TRUE}; }; ENDCASE; }; [] _ stb.EnumerateBodies[by.rootBodyIndex, innerFGItoBTI]; }; CItoBTIX: PROC[stb: bx.SymbolTableBase, ci: CharIndex] RETURNS [bestBTI: bx.BodyIndex _ bx.nullBodyIndex] = { bestCI: CharIndex _ 0; bti1: bx.BodyIndex _ bx.nullBodyIndex; fgi1: FGCard _ 0; ci1: CharIndex _ 0; bti2: bx.BodyIndex _ bx.nullBodyIndex; fgi2: FGCard _ 0; ci2: CharIndex _ 0; preliminaries: PROC [bti: bx.BodyIndex] RETURNS [stop: BOOL _ FALSE] = { body: XBodyPtr _ @stb.bb[bti]; WITH ext: body^ SELECT FROM Callable => NULL; ENDCASE => RETURN; WITH info: body.info SELECT FROM External => { firstFGI: FGCard _ info.startIndex; lastFGI: FGCard _ firstFGI + MAX[info.indexLength, 1] - 1; thisCI: CharIndex _ body.sourceIndex; -- the first sourceIndex of this Callable body lastCI: CharIndex _ thisCI; -- the first sourceIndex of the current statement FOR tfgi: FGCard IN [firstFGI..lastFGI] DO fp: XFGPtr _ @stb.fgTable[tfgi]; IF (bti1 = bx.nullBodyIndex OR lastCI >= ci1) AND lastCI <= ci THEN {bti1 _ bti; fgi1 _ tfgi; ci1 _ lastCI}; IF (bti2 = bx.nullBodyIndex OR lastCI <= ci2) AND lastCI >= ci THEN {bti2 _ bti; fgi2 _ tfgi; ci2 _ lastCI}; WITH fp^ SELECT FROM normal => lastCI _ lastCI + deltaSource; step => IF which = source THEN lastCI _ lastCI + delta; ENDCASE; ENDLOOP; }; ENDCASE; }; -- end preliminaries innerCItoBTI: PROC [bti: bx.BodyIndex] RETURNS [stop: BOOL _ FALSE] = { body: XBodyPtr _ @stb.bb[bti]; WITH ext: body^ SELECT FROM Callable => NULL; ENDCASE => RETURN; WITH info: body.info SELECT FROM External => { firstFGI: FGCard _ info.startIndex; lastFGI: FGCard _ firstFGI + MAX[info.indexLength, 1] - 1; thisCI: CharIndex _ body.sourceIndex; -- the first sourceIndex of this Callable body IF bestCI <= thisCI AND thisCI <= ci THEN { -- this body might be a smaller encloser lastCI: CharIndex _ thisCI; FOR tfgi: FGCard IN [firstFGI..lastFGI] DO fp: XFGPtr _ @stb.fgTable[tfgi]; WITH fp^ SELECT FROM normal => lastCI _ lastCI + deltaSource; step => IF which = source THEN lastCI _ lastCI + delta; ENDCASE; IF lastCI >= ci THEN {bestBTI _ bti; bestCI _ thisCI; RETURN}; ENDLOOP; IF fgi1 = lastFGI THEN {bestBTI _ bti; bestCI _ thisCI; RETURN[stop: TRUE]}; }; }; ENDCASE; }; -- end innerCItoBTI [] _ stb.EnumerateBodies[bx.rootBodyIndex, preliminaries]; [] _ stb.EnumerateBodies[bx.rootBodyIndex, innerCItoBTI]; }; -- end CItoBTIX CItoBTIY: PROC[stb: by.SymbolTableBase, ci: CharIndex] RETURNS [bestBTI: by.BodyIndex _ by.nullBodyIndex] = { bestCI: CharIndex _ 0; bti1: by.BodyIndex _ by.nullBodyIndex; fgi1: FGCard _ 0; ci1: CharIndex _ 0; bti2: by.BodyIndex _ by.nullBodyIndex; fgi2: FGCard _ 0; ci2: CharIndex _ 0; preliminaries: PROC [bti: by.BodyIndex] RETURNS [stop: BOOL _ FALSE] = { body: YBodyPtr _ @stb.bb[bti]; WITH ext: body^ SELECT FROM Callable => NULL; ENDCASE => RETURN; WITH info: body.info SELECT FROM External => { firstFGI: FGCard _ info.startIndex; lastFGI: FGCard _ firstFGI + MAX[info.indexLength, 1] - 1; thisCI: CharIndex _ body.sourceIndex; -- the first sourceIndex of this Callable body lastCI: CharIndex _ thisCI; -- the first sourceIndex of the current statement FOR tfgi: FGCard IN [firstFGI..lastFGI] DO fp: YFGPtr _ @stb.fgTable[tfgi]; IF (bti1 = by.nullBodyIndex OR lastCI >= ci1) AND lastCI <= ci THEN {bti1 _ bti; fgi1 _ tfgi; ci1 _ lastCI}; IF (bti2 = by.nullBodyIndex OR lastCI <= ci2) AND lastCI >= ci THEN {bti2 _ bti; fgi2 _ tfgi; ci2 _ lastCI}; WITH fp^ SELECT FROM normal => lastCI _ lastCI + deltaSource; step => IF which = source THEN lastCI _ lastCI + delta; ENDCASE; ENDLOOP; }; ENDCASE; }; -- end preliminaries innerCItoBTI: PROC [bti: by.BodyIndex] RETURNS [stop: BOOL _ FALSE] = { body: YBodyPtr _ @stb.bb[bti]; WITH ext: body^ SELECT FROM Callable => NULL; ENDCASE => RETURN; WITH info: body.info SELECT FROM External => { firstFGI: FGCard _ info.startIndex; lastFGI: FGCard _ firstFGI + MAX[info.indexLength, 1] - 1; thisCI: CharIndex _ body.sourceIndex; -- the first sourceIndex of this Callable body IF bestCI <= thisCI AND thisCI <= ci THEN { -- this body might be a smaller encloser lastCI: CharIndex _ thisCI; FOR tfgi: FGCard IN [firstFGI..lastFGI] DO fp: YFGPtr _ @stb.fgTable[tfgi]; WITH fp^ SELECT FROM normal => lastCI _ lastCI + deltaSource; step => IF which = source THEN lastCI _ lastCI + delta; ENDCASE; IF lastCI >= ci THEN {bestBTI _ bti; bestCI _ thisCI; RETURN}; ENDLOOP; IF fgi1 = lastFGI THEN {bestBTI _ bti; bestCI _ thisCI; RETURN[stop: TRUE]}; }; }; ENDCASE; }; -- end innerCItoBTI [] _ stb.EnumerateBodies[by.rootBodyIndex, preliminaries]; [] _ stb.EnumerateBodies[by.rootBodyIndex, innerCItoBTI]; }; -- end CItoBTIY END. ^AMModelPrivateImpl.Mesa Russ Atkinson, April 8, 1983 2:25 pm Paul Rovner, November 29, 1983 7:25 pm local type definitions kludge for the missing FGI procedures exported to AMModelPrivate returns first fine grain index for the given procedure (0 for start proc OR invalid fgi) returns first fine grain index for the given procedure (0 for start proc OR invalid fgi) returns first fine grain index for the given procedure (FGNull for invalid epi) returns first fine grain index for the given procedure (FGNull for invalid epi) returns last fine grain index for the given procedure (FGNull for invalid epi) returns last fine grain index for the given procedure (FGNull for invalid epi) returns offset of last byte in the procedure (may be padding byte) returns offset of last byte in the procedure (may be padding byte) returns the "best" fine grain index for the given character position (FGNull for invalid position) we try not to stop at a source step, because source steps usually come just before the pc step for the statement (sigh) returns the "best" fine grain index for the given character position (FGNull for invalid position) we try not to stop at a source step, because source steps usually come just before the pc step for the statement (sigh) returns the "best" fine grain index for the given pc offset in the given procedure (FGNull for invalid epi or invalid pc) returns the "best" fine grain index for the given pc offset in the given procedure (FGNull for invalid epi or invalid pc) takes a FGIndex & entry point, returns the next FGIndex returns FGNull if next fgi is in a different proc than entryPointIndex OR the given FGIndex or entry point was not valid takes a FGIndex & entry point, returns the next FGIndex returns FGNull if next fgi is in a different proc than entryPointIndex OR the given FGIndex or entry point was not valid takes a FGIndex, returns the first character position -1 for invalid fgi takes a FGIndex, returns the first character position -1 for invalid fgi takes a FGIndex, returns the last character position -1 for invalid fgi takes a FGIndex, returns the last character position -1 for invalid fgi takes a FGIndex, returns the first PC (NullPCOffset for invalid fgi) takes a FGIndex, returns the first PC (NullPCOffset for invalid fgi) returns offset of last byte in the fine grain entry (NullPCOffset for invalid fgi) returns offset of last byte in the fine grain entry (NullPCOffset for invalid fgi) implementation procedures takes a SymbolTableBase & entry point returns a Callable BTI for the entry point or nullBodyIndex if that can't be done takes a SymbolTableBase & entry point returns a Callable BTI for the entry point or nullBodyIndex if that can't be done takes a SymbolTableBase & FGIndex returns a Callable BTI containing the FGIndex or nullBodyIndex if that can't be done takes a SymbolTableBase & FGIndex returns a Callable BTI containing the FGIndex or nullBodyIndex if that can't be done takes a SymbolTableBase & character position returns a Callable BTI containing the FGIndex or nullBodyIndex if that can't be done the start CharIndex of the smallest enclosing (of ci) Callable body, initialized to the start CharIndex of the module Compute (fgt1) the largest fgt entry startIndex that is smaller than ci Compute (fgt2) the smallest fgt entry startIndex that is larger than ci NOTE: we assume that the character ranges covered by the Callable BTI's are disjoint or nested and the smallest source range containing the index is the one desired Here if (this body is the first examined OR the best body seen so far precedes this body) AND this body precedes ci a statement (not the last) in this body encloses ci Here to examine the last statement in this body to determine whether it encloses this ci: search thru ALL Callable bodies to find 1. (fgt1) the largest fgt entry startIndex that is smaller than ci, and 2. (fgt2) the smallest fgt entry startIndex that is larger than ci If the last statement in this block is (fgt1) the largest fgt entry startIndex that is smaller than ci then ... START CItoBTIX HERE takes a SymbolTableBase & character position returns a Callable BTI containing the FGIndex or nullBodyIndex if that can't be done the start CharIndex of the smallest enclosing (of ci) Callable body, initialized to the start CharIndex of the module Compute (fgt1) the largest fgt entry startIndex that is smaller than ci Compute (fgt2) the smallest fgt entry startIndex that is larger than ci NOTE: we assume that the character ranges covered by the Callable BTI's are disjoint or nested and the smallest source range containing the index is the one desired Here if (this body is the first examined OR the best body seen so far precedes this body) AND this body precedes ci a statement (not the last) in this body encloses ci Here to examine the last statement in this body to determine whether it encloses this ci: search thru ALL Callable bodies to find 1. (fgt1) the largest fgt entry startIndex that is smaller than ci, and 2. (fgt2) the smallest fgt entry startIndex that is larger than ci If the last statement in this block is (fgt1) the largest fgt entry startIndex that is smaller than ci then ... START CItoBTIY HERE Ê™˜Jšœ™Jšœ$™$Jšœ&™&J˜šÏk ˜ Jšœœ ˜Jšœœœ+˜Dšœœ˜Jšœ_˜_—šœœ˜Jšœ_˜_—Jšœ œ˜%J˜—šÏbœ˜Jšœ˜šœœ˜ JšœR˜RJ˜——šœ™J˜Jš œ œœœœ˜3Jš œ œœœœ˜3J˜Jšœ œœ˜#Jšœœœ˜J˜Jš œœœœœ˜6Jš œœœœœ˜6J˜Jšœ™JšœœÏcD˜TJ˜—šœ%™%J˜—šÏnœœ˜Jšœ%œ˜:šœœ˜Jšœœ˜4Jšœœ˜4Jšœœ˜—J˜—š  œ˜Jšœ(œ˜FJšœ6™6Jšœ!™!J˜Jšœœœ˜J˜šœœ˜ Jšœ˜šœ œ˜J˜!Jšœœ˜—J˜—J˜J˜—š  œ˜Jšœ(œ˜FJšœ6™6Jšœ!™!J˜Jšœœœ˜J˜šœœ˜ Jšœ˜šœ œ˜J˜!Jšœœ˜—J˜—J˜J˜—š  œœ˜Jšœ/œœ˜Jšœœ˜Jšœœ%˜CJšœœ%˜CJšœœ˜J˜——š œ˜Jšœ2œ˜7Jšœ˜#JšœO™OJ˜(Jšœœœ˜&šœœ˜'Jšœ3œ˜:Jšœ˜—šœ œœ˜#Jšœ+˜+š˜Jšœ(˜(Jšœ˜Jšœœœ˜#Jšœ˜Jšœ œœ˜J˜ Jšœ˜ ——J˜J˜—š œ˜Jšœ2œ˜7Jšœ˜#JšœO™OJ˜(Jšœœœ˜&šœœ˜'Jšœ3œ˜:Jšœ˜—šœ œœ˜#Jšœ+˜+š˜Jšœ(˜(Jšœ˜Jšœœœ˜#Jšœ˜Jšœ œœ˜J˜ Jšœ˜ ——J˜J˜—š  œœ˜Jšœ%œ˜:šœœ˜Jšœœ˜8Jšœœ˜8Jšœœ˜—J˜—š  œ˜J˜'Jšœ˜#Jšœ5™5Jšœ™J˜(Jšœœœ˜&šœœ˜'˜ Jšœ!œ"œ˜L—Jšœ˜—J˜J˜—š  œ˜J˜'Jšœ˜#Jšœ5™5Jšœ™J˜(Jšœœœ˜&šœœ˜'˜ Jšœ!œ"œ˜L—Jšœ˜—J˜J˜—š  œœ˜Jšœ/œ˜4Jšœ"˜)Jšœ1˜1Jšœœœ˜Jšœ˜Jšœ˜J˜—š  œœ˜Jšœ%œ˜;šœœ˜Jšœœ˜7Jšœœ˜7Jšœœ˜—J˜—š  œ˜J˜'Jšœ"˜)JšœB™BJ˜(Jšœœœ˜&šœœ˜'J˜+Jšœ˜—J˜J˜—š  œ˜J˜'Jšœ"˜)JšœB™BJ˜(Jšœœœ˜&šœœ˜'J˜+Jšœ˜—J˜J˜—š œœ˜Jšœ&œ˜;šœœ˜Jšœœ˜9Jšœœ˜9Jšœœ˜J˜——š œ˜Jšœ)œ˜LJšœD™Dšœ™J˜%J˜šœœ˜ Jšœ˜šœœ˜ ˜ J˜#Jšœœ˜:J˜%Jšœ œ˜'šœœ˜*J˜ J˜J˜JšœF™FJšœ0™0šœœ˜˜ J˜—˜šœœ˜Jšœ˜Jšœ˜——Jšœ˜—Jšœ œœ˜J˜Jšœ˜—Jšœ œ˜J˜—Jšœ˜—J˜——J˜J˜—š œ˜Jšœ)œ˜LJšœD™Dšœ™J˜%J˜šœœ˜ Jšœ˜šœœ˜ ˜ J˜#Jšœœ˜:J˜%Jšœ œ˜'šœœ˜*J˜ J˜J˜JšœF™FJšœ0™0šœœ˜˜ J˜—˜šœœ˜Jšœ˜Jšœ˜——Jšœ˜—Jšœ œœ˜J˜Jšœ˜—Jšœ œ˜J˜—Jšœ˜—J˜——J˜J˜—š œœ˜Jšœ3œ˜Hšœœ˜Jšœœ˜7Jšœœ˜7Jšœœ˜J˜——š œ˜J˜5Jšœ˜#JšœR™RJšœ&™&J˜(šœœ˜ Jšœ˜šœœ˜ ˜ J˜#Jšœœ˜:Jšœœ˜Jšœœœ ˜)Jšœ œ˜'šœœ˜*J˜ J˜Jšœ œœ˜šœœ˜J˜"Jšœœœ˜1Jšœ˜—Jšœ œœ˜Jšœ˜—Jšœ œ˜J˜—Jšœ˜—J˜—J˜J˜—š œ˜J˜5Jšœ˜#JšœR™RJšœ&™&J˜(šœœ˜ Jšœ˜šœœ˜ ˜ J˜#Jšœœ˜:Jšœœ˜Jšœœœ ˜)Jšœ œ˜'šœœ˜*J˜ J˜Jšœ œœ˜šœœ˜J˜"Jšœœœ˜1Jšœ˜—Jšœ œœ˜Jšœ˜—Jšœ œ˜J˜—Jšœ˜—J˜—J˜J˜—š œœ˜Jšœ3œ˜Hšœœ˜Jšœœ˜8Jšœœ˜8Jšœœ˜J˜——š œ˜J˜5Jšœ˜$Jšœ7™7JšœF™FJšœ1™1J˜Jšœœœ˜J˜šœ˜šœœ˜'˜ J˜#Jšœœ˜:Jš œ œ œœœœ˜Bšœ˜Jšœ ˜Jšœ˜!—J˜ J˜—Jšœ˜——J˜J˜—š œ˜J˜5Jšœ˜$Jšœ7™7JšœF™FJšœ1™1J˜Jšœœœ˜J˜šœ˜šœœ˜'˜ J˜#Jšœœ˜:Jš œ œ œœœœ˜Bšœ˜Jšœ ˜Jšœ˜!—J˜ J˜—Jšœ˜——˜J˜——š œœ˜Jšœ%œ˜@šœœ˜Jšœœ˜:Jšœœ˜:Jšœœ˜J˜——š œ˜Jšœ(œ˜HJšœ5™5Jšœ™J˜(šœœ˜ Jšœ˜šœœ˜ ˜ J˜šœ*˜/J˜ šœœ˜Jš œ œœœœ˜Dšœ Ÿ5˜>Jšœœœ˜Jšœœœ˜Jšœœœ˜Jšœœœ˜#Jšœ œœœ˜FJšœ˜J˜—Jšœ˜—Jšœ˜—J˜—Jšœ˜—J˜—J˜J˜—š œ˜Jšœ(œ˜HJšœ5™5Jšœ™J˜(šœœ˜ Jšœ˜šœœ˜ ˜ J˜šœ*˜/J˜ šœœ˜Jš œ œœœœ˜Dšœ Ÿ5˜>Jšœœœ˜Jšœœœ˜Jšœœœ˜Jšœœœ˜#Jšœ œœœ˜FJšœ˜J˜—Jšœ˜—Jšœ˜—J˜—Jšœ˜—J˜—J˜J˜—š  œœ˜Jšœ%œ˜@šœœ˜Jšœœ˜9Jšœœ˜9Jšœœ˜—J˜—š œ˜Jšœ(œ˜HJšœ4™4Jšœ™J˜(šœœ˜ Jšœ˜šœœ˜ ˜ J˜#Jšœœ˜:J˜šœœ˜-J˜ šœœ˜J˜ Jšœœœ˜/Jšœ˜—Jšœ˜—šœ ˜ Jšœ˜Jšœ ˜—J˜—Jšœ˜—J˜—˜J˜——š œ˜Jšœ(œ˜HJšœ4™4Jšœ™J˜(šœœ˜ Jšœ˜šœœ˜ ˜ J˜#Jšœœ˜:J˜šœœ˜-J˜ šœœ˜J˜ Jšœœœ˜/Jšœ˜—Jšœ˜—šœ ˜ Jšœ˜Jšœ ˜—J˜—Jšœ˜—J˜—˜J˜——š  œœ˜Jšœ%œ˜?šœœ˜Jšœœ˜8Jšœœ˜8Jšœœ˜J˜——š  œ˜šœ(œ"˜QJšœD™D—J˜(šœœ˜ Jšœ˜šœœ˜ ˜ J˜šœ*˜/J˜ šœœ˜Jš œ œœœœ˜Dšœ Ÿ5˜>Jšœœœ˜Jšœœœ˜Jšœœœ˜Jšœœœ˜#Jšœ œœœ˜FJšœ˜J˜—Jšœ˜—Jšœ˜—J˜—Jšœ˜—J˜—J˜J˜—š  œ˜šœ(œ"˜QJšœD™D—J˜(šœœ˜ Jšœ˜šœœ˜ ˜ J˜šœ*˜/J˜ šœœ˜Jš œ œœœœ˜Dšœ Ÿ5˜>Jšœœœ˜Jšœœœ˜Jšœœœ˜Jšœœœ˜#Jšœ œœœ˜FJšœ˜J˜—Jšœ˜—Jšœ˜—J˜—Jšœ˜—J˜—J˜J˜—š  œœ˜Jšœ%œ˜?šœœ˜Jšœœ˜7Jšœœ˜7Jšœœ˜J˜——š  œ˜Jšœ(œ"˜QJšœ3™3Jšœ™J˜(šœœ˜ Jšœ˜šœœ˜ ˜ J˜#šœ œ˜Jšœ˜Jšœ ˜ Jšœ˜—J˜šœœ˜-J˜ šœœ˜J˜ Jšœœœ˜/Jšœ˜—Jšœ˜—J˜ J˜—Jšœ˜—J˜—J˜J˜—š  œ˜Jšœ(œ"˜QJšœ3™3Jšœ™J˜(šœœ˜ Jšœ˜šœœ˜ ˜ J˜#šœ œ˜Jšœ˜Jšœ ˜ Jšœ˜—J˜šœœ˜-J˜ šœœ˜J˜ Jšœœœ˜/Jšœ˜—Jšœ˜—J˜ J˜—Jšœ˜—J˜—J˜J˜—šœ™J˜—š  œœ'˜6Jšœ0˜7Jšœ%™%Jšœ*™*Jšœ&™&š œœœœœ˜HJ˜J˜šœ œ˜J˜%Jšœœ˜—šœœ˜ ˜ Jšœœœ˜4—Jšœ˜—J˜—J˜:˜J˜——š  œœ'˜6Jšœ0˜7Jšœ%™%Jšœ*™*Jšœ&™&š œœœœœ˜HJ˜J˜šœ œ˜J˜%Jšœœ˜—šœœ˜ ˜ Jšœœœ˜4—Jšœ˜—J˜—J˜:˜J˜——š  œœ'˜6Jšœ0˜7Jšœ!™!Jšœ-™-Jšœ&™&š œœœœœ˜HJ˜J˜šœ œ˜J˜%Jšœœ˜—šœœ˜ ˜ J˜#Jšœœ˜:šœ œœ˜+Jšœ˜Jšœœ˜ —J˜—Jšœ˜—J˜—J˜:J˜J˜—š  œœ'˜6Jšœ0˜7Jšœ!™!Jšœ-™-Jšœ&™&š œœœœœ˜HJ˜J˜šœ œ˜J˜%Jšœœ˜—šœœ˜ ˜ J˜#Jšœœ˜:šœ œœ˜+Jšœ˜Jšœœ˜ —J˜—Jšœ˜—J˜—J˜:J˜J˜—š œœ(˜6šœ/˜6Jšœ,™,JšœT™T—šœ˜Jšœu™u—J˜Jšœ&˜&Jšœ˜Jšœ˜J˜Jšœ&˜&Jšœ˜Jšœ˜J˜š ž œœœœœ˜HJ˜Jš œ œœ œœœ˜@šœœ˜ ˜ J˜#Jšœœ˜:Jšœ'Ÿ.˜UJšœŸ1˜Nšœœ˜*˜ JšœG™G—šœœœ ˜>Jšœ)˜-JšœG™G—šœœœ ˜>Jšœ)˜-—šœœ˜J˜(Jšœœœ˜7Jšœ˜—Jšœ˜—J˜—Jšœ˜—JšœŸ˜J˜—š ž œœœœœ˜GJšœ¤™¤J˜Jš œ œœ œœœ˜@šœœ˜ ˜ J˜#Jšœœ˜:Jšœ'Ÿ.˜UšœœœŸ(˜UJ™sJ˜šœœ˜*J˜ šœœ˜J˜(Jšœœœ˜7Jšœ˜—šœ ˜šœ"œ˜.Jšœ3™3——Jšœ˜šœ‚™‚JšœG™GJšœB™B—Jšœo™o—Jšœœ"œœ˜LJšœ˜—J˜—Jšœ˜—JšœŸ˜—J™Jšœ Ÿœ™J˜:Jšœ9˜9JšœŸ˜J˜—š œœ(˜6šœ/˜6Jšœ,™,JšœT™T—šœ˜Jšœu™u—J˜Jšœ&˜&Jšœ˜Jšœ˜J˜Jšœ&˜&Jšœ˜Jšœ˜J˜š ž œœœœœ˜HJ˜Jš œ œœ œœœ˜@šœœ˜ ˜ J˜#Jšœœ˜:Jšœ'Ÿ.˜UJšœŸ1˜Nšœœ˜*˜ JšœG™G—šœœœ ˜>Jšœ)˜-JšœG™G—šœœœ ˜>Jšœ)˜-—šœœ˜J˜(Jšœœœ˜7Jšœ˜—Jšœ˜—J˜—Jšœ˜—JšœŸ˜J˜—š ž œœœœœ˜GJšœ¤™¤J˜Jš œ œœ œœœ˜@šœœ˜ ˜ J˜#Jšœœ˜:Jšœ'Ÿ.˜UšœœœŸ(˜UJ™sJ˜šœœ˜*J˜ šœœ˜J˜(Jšœœœ˜7Jšœ˜—šœ ˜šœ"œ˜.Jšœ3™3——Jšœ˜šœ‚™‚JšœG™GJšœB™B—Jšœo™o—Jšœœ"œœ˜LJšœ˜—J˜—Jšœ˜—JšœŸ˜—J™JšœŸœ™J˜:Jšœ9˜9JšœŸ˜J˜Jšœ˜J˜J˜——…—ZÀŽ·