DIRECTORY Ascii, Atom, CD, CDAtomicObjects, CDBasics, CDCells, CDDirectory, CDEnvironment, CDInstances, CDMakeProc, CDProperties, CDOps, CDSequencer, CDSymbolicObjects, Convert, IO, PriorityQueue, RefTab, Rope, SymTab, TerminalIO, TiogaFileOps, TiogaOps, ViewerTools; CDMakeProcCommands: CEDAR PROGRAM IMPORTS Ascii, Atom, Convert, CD, CDAtomicObjects, CDBasics, CDCells, CDDirectory, CDEnvironment, CDInstances, CDProperties, CDOps, CDSequencer, CDSymbolicObjects, IO, PriorityQueue, RefTab, Rope, SymTab, TerminalIO, TiogaFileOps, TiogaOps, ViewerTools EXPORTS CDMakeProc = BEGIN Environment: TYPE = REF EnvironmentRep; EnvironmentRep: PUBLIC TYPE = RECORD [ invocationKey: REF, rootNode: TiogaFileOps.Ref, mustDo: RefTab.Ref, done: RefTab.Ref, fileName: Rope.ROPE, commentNode: TiogaFileOps.Ref, --insert sibling for next comment modHeaderNode: TiogaFileOps.Ref, --DIRECTORY... to excluding BEGIN declNode: TiogaFileOps.Ref, --insert sibling for next declaration on module level procNode: TiogaFileOps.Ref, --insert sibling for next global procedures procDecNode: TiogaFileOps.Ref, --insert sibling for next local declaration postDeclNode: TiogaFileOps.Ref, --insert sibling for next declaration on module level firstModStatementNode: TiogaFileOps.Ref, --reserved for first statement modStatementNode: TiogaFileOps.Ref, --insert sibling for next mudule statement mainName: Rope.ROPE _ NIL, modifier: INT _ 0, directory: SymTab.Ref, imports: SymTab.Ref, declaredLayers: ARRAY CD.Layer OF Rope.ROPE _ ALL[NIL], nameToThing: SymTab.Ref, localThingToName: RefTab.Ref, globalThingToName: RefTab.Ref, hasDirGen: BOOL _ FALSE, design: CD.Design, properties: CD.PropRef ]; ObjectExpressionProc: TYPE = CDMakeProc.ObjectExpressionProc; GetEnvironmentProp: PUBLIC PROC [env: Environment, key: REF] RETURNS [REF] = { RETURN [CDProperties.GetProp[env.properties, key]] }; PutEnvironmentProp: PUBLIC PROC [env: Environment, key: REF, val: REF] = { CDProperties.PutProp[env.properties, key, val] }; RegisterObjectExpressionProc: PUBLIC PROC [for: REF, ep: ObjectExpressionProc, tech: CD.Technology _ NIL] = { WITH for SELECT FROM c: CD.ObjectClass => CDProperties.PutProp[c.properties, $MakeCallExpression, NEW[ObjectExpressionProc_ep]]; a: ATOM => RegisterObjectExpressionProc[CD.FetchObjectClass[a, tech], ep, tech]; ENDCASE => ERROR }; CallObjectExpressionProc: PROC [env: Environment, ob: CD.Object] RETURNS [r: Rope.ROPE _ NIL] = { x: REF _ CDProperties.GetProp[ob.class.properties, $MakeCallExpression]; WITH x SELECT FROM rmce: REF ObjectExpressionProc => r _ rmce^[env, ob] ENDCASE => NULL; }; MakeNodeComment: PROC [node: TiogaFileOps.Ref] = { TRUSTED { TiogaOps.PutProp[LOOPHOLE[node], $Comment, NEW[BOOLEAN _ TRUE]] }; }; Reserve: PROC [env: Environment, key: Rope.ROPE] = { [] _ SymTab.Store[env.nameToThing, key, $reserved]; }; MakePreamble: PUBLIC PROC [env: Environment, module: Rope.ROPE, import: BOOL_TRUE] = { [] _ SymTab.Store[env.nameToThing, module, $module]; [] _ SymTab.Insert[env.directory, module, module]; IF import THEN [] _ SymTab.Insert[env.imports, module, module]; }; MakeDirectory: PROC [env: Environment] = { r: Rope.ROPE _ NIL; Each: SymTab.EachPairAction = { IF num=0 THEN TiogaFileOps.SetContents[env.modHeaderNode, "DIRECTORY"] ELSE r _ r.Concat[", "]; r _ r.Concat[key]; num _ num+1; quit _ FALSE }; num: INT _ 0; [] _ env.directory.Pairs[Each]; IF num>0 THEN { node: TiogaFileOps.Ref _ TiogaFileOps.InsertNode[env.modHeaderNode, TRUE]; TiogaFileOps.SetContents[node, r.Concat[";"]]; } ELSE TiogaFileOps.SetContents[env.modHeaderNode, ""]; }; MakeImportsExpr: PROC [env: Environment] RETURNS [r: Rope.ROPE _ NIL] = { Each: SymTab.EachPairAction = { IF num=0 THEN r _ "IMPORTS " ELSE r _ r.Concat[", "]; r _ r.Concat[key]; num _ num+1; quit _ FALSE }; num: INT _ 0; [] _ env.imports.Pairs[Each]; }; NewEnvironment: PROC [design: CD.Design] RETURNS [env: Environment] = { env _ NEW[EnvironmentRep_[properties: CD.InitPropRef[]]]; env.fileName _ Rope.Cat[CDEnvironment.GetWorkingDirectory[design], "CDMakeProc-Temp.mesa"]; env.invocationKey _ NEW[INT]; env.rootNode _ TiogaFileOps.CreateRoot[]; env.mustDo _ RefTab.Create[]; env.done _ RefTab.Create[]; env.commentNode _ TiogaFileOps.InsertNode[env.rootNode, TRUE]; TiogaFileOps.SetContents[env.commentNode, Rope.Cat["--", env.fileName]]; MakeNodeComment[env.commentNode]; env.commentNode _ TiogaFileOps.InsertNode[env.commentNode]; TiogaFileOps.SetContents[env.commentNode, "--created by ChipNDale"]; MakeNodeComment[env.commentNode]; env.modHeaderNode _ TiogaFileOps.InsertNode[env.commentNode]; env.declNode _ TiogaFileOps.InsertNode[env.modHeaderNode]; TiogaFileOps.SetContents[env.declNode, "BEGIN"]; PlaceDeclarationM1[env, IO.PutFR["tech: CD.Technology _ CD.FetchTechnology[$%g];", IO.atom[design.technology.key]]]; env.procNode _ TiogaFileOps.InsertNode[env.declNode]; TiogaFileOps.SetContents[env.procNode, ""]; env.postDeclNode _ TiogaFileOps.InsertNode[env.procNode]; TiogaFileOps.SetContents[env.postDeclNode, "context: CDGenerate.Context _ CDGenerate.AssertContext[""USER""];"]; env.firstModStatementNode _ env.modStatementNode _ TiogaFileOps.InsertNode[env.postDeclNode]; env.nameToThing _ SymTab.Create[]; env.directory _ SymTab.Create[]; env.imports _ SymTab.Create[]; env.localThingToName _ RefTab.Create[]; env.globalThingToName _ RefTab.Create[]; env.design _ design; }; FinishUp: PROC [env: Environment] = { node: TiogaFileOps.Ref; subNode: TiogaFileOps.Ref; r: Rope.ROPE _ NIL; MakeDirectory[env]; node _ TiogaFileOps.InsertNode[env.modHeaderNode]; TiogaFileOps.SetContents[node, "Temp: CEDAR PROGRAM"]; subNode _ TiogaFileOps.InsertNode[node, TRUE]; TiogaFileOps.SetContents[subNode, Rope.Cat[MakeImportsExpr[env], " ="]]; r _ IO.PutFR["[] _ context.Register[""%g"", %g];", IO.rope[env.mainName], IO.rope[env.mainName]]; TiogaFileOps.SetContents[env.firstModStatementNode, r]; PlaceStatementM[env, "END."]; TiogaFileOps.Store[env.rootNode, env.fileName]; env.rootNode _ env.commentNode _ env.modHeaderNode _ NIL; env.declNode _ env.procNode _ env.postDeclNode _ NIL; env.firstModStatementNode _ env.modStatementNode _ NIL; env.directory _ env.imports _ env.nameToThing _ NIL; env.localThingToName _ NIL; env.globalThingToName _ NIL; TerminalIO.PutRope[env.fileName]; TerminalIO.PutRope[" created\n"]; [] _ ViewerTools.MakeNewTextViewer[info: [ file: env.fileName, label: env.fileName, name: env.fileName, iconic: FALSE ]]; }; MakeProcedureNode: PROC [env: Environment] RETURNS [TiogaFileOps.Ref] = { env.procNode _ TiogaFileOps.InsertNode[env.procNode]; env.procDecNode _ NIL; RETURN [env.procNode] }; MakeDeclarationNode: PROC [env: Environment] RETURNS [TiogaFileOps.Ref] = { env.declNode _ TiogaFileOps.InsertNode[env.declNode]; RETURN [env.declNode] }; PlaceDeclarationM1: PUBLIC PROC [env: Environment, line: Rope.ROPE] = { node: TiogaFileOps.Ref _ MakeDeclarationNode[env]; TiogaFileOps.SetContents[node, line]; }; PlaceDeclarationM2: PUBLIC PROC [env: Environment, line: Rope.ROPE] = { env.postDeclNode _ TiogaFileOps.InsertNode[env.postDeclNode]; TiogaFileOps.SetContents[env.postDeclNode, line]; }; PlaceStatementM: PUBLIC PROC [env: Environment, line: Rope.ROPE] = { env.modStatementNode _ TiogaFileOps.InsertNode[env.modStatementNode]; TiogaFileOps.SetContents[env.modStatementNode, line]; }; MakeDirGenerator: PROC [env: Environment] = { IF ~env.hasDirGen THEN { env.hasDirGen _ TRUE; PlaceDeclarationM2[env, "directory: CDGenerate.Context _ CDGenerate.AssertContext[""DIRECTORY""];"]; } }; Identifier: PUBLIC PROC [r: Rope.ROPE] RETURNS [id: Rope.ROPE] = { first: BOOL _ TRUE; Trans: Rope.TranslatorType = { IF Ascii.Letter[old] THEN new _ old ELSE IF Ascii.Digit[old] AND ~first THEN new _ old ELSE new _ 'x; first _ FALSE }; id _ Rope.Translate[base: r, translator: Trans]; IF Rope.IsEmpty[id] THEN id _ "x"; IF SymTab.Fetch[reservedWords, id].found THEN {id _ Rope.Concat[id, "X"]} }; ForceGlobalIdent: PUBLIC PROC[env: Environment, proposed: Rope.ROPE, whatFor: REF_NIL] RETURNS [ident: Rope.ROPE] = { ident _ ForeceNewIdent[env, proposed, whatFor, TRUE]; }; GetGlobalIdent: PUBLIC PROC [env: Environment, whatFor: REF] RETURNS [Rope.ROPE] = { RETURN [GetIdent[env, whatFor, TRUE]]; }; EnsureGlobalObjectIdent: PROC [env: Environment, ob: CD.Object] RETURNS [r: Rope.ROPE] = { r _ GetGlobalIdent[env, ob]; IF Rope.IsEmpty[r] THEN { name: Rope.ROPE _ CDDirectory.Name[ob, env.design]; IF Rope.IsEmpty[name] THEN name _ "CreateSubObject"; r _ ForceGlobalIdent[env, name, ob]; } }; ForeceNewIdent: PROC [env: Environment, proposed: Rope.ROPE_NIL, whatFor: REF_NIL, global: BOOL_FALSE] RETURNS [ident: Rope.ROPE] = { refTab: RefTab.Ref _ IF global THEN env.globalThingToName ELSE env.localThingToName; proposed _ Identifier[proposed]; ident _ proposed; DO IF SymTab.Insert[env.nameToThing, ident, whatFor] THEN { IF whatFor#NIL THEN [] _ RefTab.Store[refTab, whatFor, ident]; RETURN; }; env.modifier _ env.modifier+1; ident _ IO.PutFR["%gx%g", IO.rope[proposed], IO.int[env.modifier]] ENDLOOP }; GetIdent: PROC [env: Environment, whatFor: REF, global: BOOL] RETURNS [Rope.ROPE_NIL] = { tab: RefTab.Ref _ IF global THEN env.globalThingToName ELSE env.localThingToName; WITH RefTab.Fetch[tab, whatFor].val SELECT FROM n: Rope.ROPE => RETURN [n]; ENDCASE => NULL; }; Capital: PUBLIC PROC [r: Rope.ROPE] RETURNS [Rope.ROPE] = { IF ~Rope.IsEmpty[r] AND Rope.Fetch[r, 0] IN ['a..'z] THEN RETURN [ Rope.Replace[base: r, start: 0, len: 1, with: Rope.FromChar[Ascii.Upper[Rope.Fetch[r, 0]]] ]]; RETURN [r]; }; Small: PUBLIC PROC [r: Rope.ROPE] RETURNS [Rope.ROPE] = { IF ~Rope.IsEmpty[r] AND Rope.Fetch[r, 0] IN ['A..'Z] THEN RETURN [ Rope.Replace[base: r, start: 0, len: 1, with: Rope.FromChar[Ascii.Lower[Rope.Fetch[r, 0]]] ]]; RETURN [r]; }; IdentForLocalObject: PROC [env: Environment, ob: CD.Object] RETURNS [name: Rope.ROPE] = { name _ GetIdent[env, ob, FALSE]; IF name=NIL THEN { name _ CD.Describe[ob, NIL, env.design, 0]; IF Rope.IsEmpty[name] THEN { name _ Atom.GetPName[ob.class.objectType] }; name _ ForeceNewIdent[env, Small[name], ob, FALSE]; } }; PosToRope: PUBLIC PROC [pos: CD.Position] RETURNS [r: Rope.ROPE] = { RETURN [IO.PutFR["[x: %g, y: %g]", IO.int[pos.x], IO.int[pos.y] ]] }; RectToRope: PUBLIC PROC [rect: CD.Rect] RETURNS [r: Rope.ROPE] = { RETURN [IO.PutFR["[x1: %g, y1: %g, x2: %g, y2: %g]", IO.int[rect.x1], IO.int[rect.y1], IO.int[rect.x2], IO.int[rect.y2] ]] }; MakeLayer: PUBLIC PROC [env: Environment, l: CD.Layer] RETURNS [r: Rope.ROPE] = { IF env.declaredLayers[l]=NIL THEN { r: Rope.ROPE; name: Rope.ROPE _ ForeceNewIdent[env, Small[Atom.GetPName[CD.LayerKey[l]]]]; env.declaredLayers[l] _ name; r _ IO.PutFR["%g: CD.Layer _ CD.FetchLayer[t: tech, uniqueKey: $%g];", IO.rope[name], IO.atom[CD.LayerKey[l]] ]; PlaceDeclarationM1[env, r]; }; RETURN [env.declaredLayers[l]] }; PlaceStatement: PUBLIC PROC [env: Environment, line: Rope.ROPE] = { node: TiogaFileOps.Ref; node _ TiogaFileOps.InsertAsLastChild[env.procNode]; TiogaFileOps.SetContents[node, line]; }; OrientationToRope: PUBLIC PROC [o: CD.Orientation] RETURNS [r: Rope.ROPE] = { RETURN [SELECT o FROM original => "original", mirrorX => "mirrorX", rotate90 => "rotate90", rotate90X => "rotate90X", rotate180 => "rotate180", rotate180X => "rotate180X", rotate270 => "rotate270", rotate270X => "rotate270X" ENDCASE => "bad"] }; TransformationToRope: PUBLIC PROC [trans: CD.Transformation] RETURNS [r: Rope.ROPE] = { r _ IO.PutFR["[[x: %g, y: %g]", IO.int[trans.off.x], IO.int[trans.off.y] ]; IF trans.orient#original THEN r _ Rope.Cat[r, ", ", OrientationToRope[trans.orient]]; r _ Rope.Concat[r, "]"]; }; NextObject: PROC [env: Environment] RETURNS [ob: CD.Object_NIL] = { EachOb: RefTab.EachPairAction = { ob1: CD.Object _ NARROW[key]; IF RefTab.Fetch[env.done, ob1].found THEN RETURN [FALSE]; ob _ ob1; quit _ TRUE }; [] _ RefTab.Pairs[env.mustDo, EachOb] }; ProgramText: PROC [ob: CD.Object, design: CD.Design, env: Environment] = { ob1: CD.Object; env.mainName _ ForceGlobalIdent[env, CDDirectory.Name[ob, env.design], ob]; OneObject[ob, design, env]; WHILE (ob1_NextObject[env]) #NIL DO env.localThingToName _ RefTab.Create[]; OneObject[ob1, design, env]; ENDLOOP }; OneObject: PROC [ob: CD.Object, design: CD.Design, env: Environment] = { [] _ RefTab.Insert[env.done, ob, ob]; IF ~CDCells.IsCell[ob] THEN ob _ CDDirectory.Expand1[ob, design, NIL].new; IF ob#NIL AND CDCells.IsCell[ob] THEN { is: CD.Position _ CD.InterestSize[ob]; pq: PriorityQueue.Ref _ PriorityQueue.Create[SortPred, IF is.x { childName _ IdentForLocalObject[env, inst.ob]; [r, needInst] _ MakeACallExpression[env, inst.ob]; r _ Rope.Cat[childName, " _ ", r, ";"]; PlaceStatement[env, r]; IF needInst THEN [] _ RefTab.Store[childs, inst.ob, $hasValueAndNeedsInst] ELSE [] _ RefTab.Store[childs, inst.ob, $hasValue] }; $hasValue => { childName _ IdentForLocalObject[env, inst.ob]; needInst _ FALSE; }; $hasValueAndNeedsInst => { childName _ IdentForLocalObject[env, inst.ob]; needInst _ TRUE; }; ENDCASE => { childName _ "child"; [r, needInst] _ MakeACallExpression[env, inst.ob]; r _ Rope.Cat[childName, " _ ", r, ";"]; PlaceStatement[env, r]; }; IF CDProperties.GetInstanceProp[inst, $SignalName]#NIL OR CDProperties.GetInstanceProp[inst, $InstanceName]#NIL THEN needInst _ TRUE; IF needInst THEN { hasInst _ TRUE; r _ Rope.Cat[ IO.PutFR["inst _ CDCells.IncludeOb[cell: ob, ob: %g, trans: %g, mode: dontResize].newInst;", IO.rope[childName], IO.rope[TransformationToRope[trans]] ]]; } ELSE { r _ Rope.Cat[ IO.PutFR["[] _ CDCells.IncludeOb[cell: ob, ob: %g, trans: %g, mode: dontResize];", IO.rope[childName], IO.rope[TransformationToRope[trans]] ]]; }; PlaceStatement[env, r]; IF needInst THEN MakeInstanceStuff[env, inst]; }; EachInst[inst]; ENDLOOP; ir _ CD.InterestRect[ob]; r _ Rope.Cat["CDCells.SetInterestRect[NIL, ob, ", RectToRope[ir], "];"]; PlaceStatement[env, r]; PlaceStatement[env, "END;"]; PlaceStatement[env, ""]; IF hasInst THEN { env.procDecNode _ TiogaFileOps.InsertNode[env.procDecNode]; TiogaFileOps.SetContents[env.procDecNode, "inst: CD.Instance;"]; }; childs _ NIL; } ELSE { TerminalIO.PutRope["**could not convert to cell\n"]; ERROR ABORTED; } }; RopeToRope: PUBLIC PROC [r: Rope.ROPE] RETURNS [Rope.ROPE] = { RETURN [Convert.RopeFromRope[r]]; }; AtomToRope: PUBLIC PROC [env: Environment, a: ATOM] RETURNS [Rope.ROPE] = { r: Rope.ROPE _ Atom.GetPName[a]; leng: INT _ Rope.Length[r]; normalCase: BOOL _ leng>0; FOR i: INT IN [0..leng) DO c: CHAR _ Rope.Fetch[r, i]; IF ~(Ascii.Letter[c] OR Ascii.Digit[c]) THEN {normalCase_FALSE; EXIT} ENDLOOP; IF normalCase THEN RETURN [Rope.Cat["$", r]]; MakePreamble[env, "Atom"]; RETURN [ Rope.Cat["Atom.MakeAtom[", Convert.RopeFromRope[r], "]"] ]; }; MakeInstanceStuff: PROC[env: Environment, inst: CD.Instance] = { r: Rope.ROPE_NIL; HandleProp: PROC [key: ATOM] = { val: Rope.ROPE _ CDOps.ToRope[CDProperties.GetInstanceProp[inst, key]]; IF ~Rope.IsEmpty[val] THEN { r: Rope.ROPE _ Rope.Cat[ "CDProperties.PutInstanceProp[inst, ", AtomToRope[env, key], ", ", RopeToRope[val], "];" ]; MakePreamble[env, "CDProperties"]; PlaceStatement[env, r]; }; }; IF CDSymbolicObjects.IsSymbolicOb[inst.ob] THEN { l: CD.Layer; owner: ATOM; name: Rope.ROPE _ CDSymbolicObjects.GetName[inst]; IF ~Rope.IsEmpty[name] THEN { r _ Rope.Cat["CDSymbolicObjects.SetName[inst, ", RopeToRope[name], "];"]; PlaceStatement[env, r]; }; l _ CDSymbolicObjects.GetLayer[inst]; IF l#CD.undefLayer THEN { r _ Rope.Cat["CDSymbolicObjects.SetLayer[inst, ", MakeLayer[env, l], "];"]; PlaceStatement[env, r]; }; owner _ CDSymbolicObjects.GetOwner[inst]; IF owner#NIL THEN { r _ Rope.Cat["CDSymbolicObjects.SetOwner[inst, ", AtomToRope[env, owner], "];"]; PlaceStatement[env, r]; }; } ELSE { HandleProp[$SignalName]; HandleProp[$InstanceName]; } }; SortPred: PriorityQueue.SortPred = { p1: CD.Position _ CDBasics.BaseOfRect[CDInstances.InstRectI[NARROW[x]]]; p2: CD.Position _ CDBasics.BaseOfRect[CDInstances.InstRectI[NARROW[y]]]; IF data=$y AND p1.y#p2.y THEN RETURN[p1.yKšœH˜HKšœ!˜!—šœ;˜;KšœD˜DKšœ!˜!—Kšœ=˜=Kšœ:˜:Kšœ0˜0KšœžœΠfs-œžœ˜tKšœ5˜5Kšœ+˜+Kšœ9˜9Kšœ,£Aœ˜pKšœ]˜]Kšœ"˜"Kšœ ˜ Kšœ˜Kšœ'˜'Kšœ(˜(Kšœ˜Kšœ˜—K™šŸœžœ˜%Kšœ˜Kšœ˜Kšœžœžœ˜K˜Kšœ˜Kšœ2˜2Kšœ6˜6K˜Kšœ(žœ˜.KšœH˜HK˜Kš œžœ£!œžœžœ˜aKšœ8˜8K˜Kšœ˜Kšœ/˜/Kšœ5žœ˜9Kšœ1žœ˜5Kšœ3žœ˜7Kšœ0žœ˜4Kšœžœ˜Kšœžœ˜Kšœ!˜!Kšœ!˜!šœ*˜*Kšœ˜Kšœ˜Kšœ˜Kšœž˜ Kšœ˜—Kšœ˜—K˜šŸœžœžœ˜IKšœ5˜5Kšœžœ˜Kšžœ˜Kšœ˜—K˜šŸœžœžœ˜KKšœ5˜5Kšžœ˜Kšœ˜—K˜šŸœž œžœ˜GKšœ2˜2Kšœ%˜%Kšœ˜—K˜šŸœž œžœ˜GKšœ=˜=Kšœ1˜1Kšœ˜—K˜šŸœž œžœ˜DKšœE˜EKšœ5˜5Kšœ˜—K™šŸœžœ˜-šžœžœ˜Kšœžœ˜Kšœ£Hœ˜dKšœ˜—Kšœ˜—K˜š Ÿ œž œ žœžœ žœ˜BKšœžœžœ˜š‘œ˜Kšžœžœ ˜#Kšžœžœžœžœ ˜2Kšžœ ˜Kšœž˜ Kšœ˜—Kšœ0˜0Kšžœžœ ˜"Kšžœ'žœ˜IKšœ˜—K˜šŸœžœžœ"žœ žœžœžœžœ˜uKšœ/žœ˜5Kšœ˜—K˜š Ÿœžœžœžœžœžœ˜TKšžœžœ˜&Kšœ˜—K˜š Ÿœžœžœ žœ žœ˜ZKšœ˜šžœžœ˜Jšœ žœ$˜3Kšžœžœ £œ˜4Kšœ$˜$K˜—Kšœ˜—K˜šŸœžœ#žœžœ žœžœ žœžœžœžœ˜…Kšœžœžœžœ˜TKšœ ˜ Kšœ˜šž˜šžœ0žœ˜8Kšžœ žœžœ+˜>Kšžœ˜K˜—Kšœ˜Kš œžœ£œžœžœ˜BKšž˜—Kšœ˜—K˜šŸœžœžœ žœžœžœžœ˜YKšœžœžœžœ˜Qšžœ žœž˜/Kšœžœžœ˜Kšžœžœ˜—Kšœ˜—K˜š Ÿœžœžœ žœžœžœ˜;šžœžœžœ ž˜9šžœ*˜0Kšœ2˜2K˜——Kšžœ˜ K˜—K˜š Ÿœž œ žœžœžœ˜9šžœžœžœ ž˜9šžœ*˜0Kšœ2˜2K˜——Kšžœ˜ K˜—K˜š Ÿœžœžœ žœ žœ˜YKšœžœ˜ šžœžœžœ˜Kšœžœžœ˜+šžœžœ˜Kšœ)˜)K˜—Kšœ,žœ˜3K˜—Kšœ˜K˜—š Ÿ œž œžœ žœ žœ˜Dšžœžœ£˜"Kšžœ ˜Kšžœ ˜Kšœ˜—Kšœ˜—K˜š Ÿ œž œžœžœ žœ˜Bšžœžœ£"˜4Kšžœ˜Kšžœ˜Kšžœ˜Kšžœ˜Kšœ˜—Kšœ˜—K˜š Ÿ œž œžœžœ žœ˜Qšžœžœžœ˜#Kšœžœ˜ Kšœ žœ+žœ˜LKšœ˜šœžœ£5œ˜FKšžœ ˜Kšžœžœ ˜Kšœ˜—Kšœ˜K˜—Kšžœ˜Kšœ˜K˜—šŸœž œžœ˜CKšœ˜Kšœ4˜4Kšœ%˜%Kšœ˜—K˜š Ÿœž œžœžœ žœ˜Mšžœžœž˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšžœ ˜—K˜—K˜š Ÿœž œ žœžœ žœ˜Wšœžœ£˜Kšžœ˜Kšžœ˜Kšœ˜—Kšžœžœ9˜VKšœ˜Kšœ˜—K˜š Ÿ œžœžœžœžœ˜CšŸœ˜!Kšœžœ žœ˜Kšžœ#žœžœžœ˜9Kšœž˜K˜—Kšœ%˜%K˜K˜—šŸ œžœžœžœ˜JKšœ˜KšœK˜KKšœ˜šžœžœž˜#Kšœ'˜'Kšœ˜Kšž˜—K˜—K˜šŸ œžœžœžœ˜HKšœ%˜%Kšžœžœ&žœ˜Jšžœžœžœžœ˜'Kšœžœ žœ˜&Kšœ7žœ žœžœ˜UKšœžœ˜ Kšœ žœžœ˜Kšœžœ˜ Kšœžœžœ˜Kšœžœžœ˜,K˜%Kšœ0˜0šŸ œ˜'Kšœžœ%˜+Kšœ˜šžœžœžœ˜Kšœ ˜ Kšœ+˜+K˜—šžœžœ žœ˜Kšœžœ%˜1Kšœ ˜ Kšœ/˜/Kšœ!£ œ˜1Kšœ˜—Kšžœžœ˜ K˜—KšœK£œ˜kKšœ?˜?Kšœ+£œ˜3Kšœ™Kšœ1˜1Kšžœžœ£œ˜7Kšœ£%œ˜=Kšœ£œ˜7Kšœ™šžœžœžœž˜.Kšœžœ žœ˜5K˜šŸœžœžœ˜&Kšœ žœžœ˜Kšœžœ£œ˜Kšœ&˜&šžœ#ž˜-šœ˜Kšœ.˜.Kšœ2˜2Kšœ£œ£˜'Kšœ˜Kšžœ žœ:˜JKšžœ.˜2Kšœ˜—šœ˜Kšœ.˜.Kšœ žœ˜K˜—šœ˜Kšœ.˜.Kšœ žœ˜K˜—šžœ˜ Kšœ˜Kšœ2˜2Kšœ£œ£˜'Kšœ˜K˜——Kš žœ1žœžœ3žœžœ žœ˜…šžœ žœ˜Kšœ žœ˜šœ ˜ Kšžœ£R˜\Kšžœ˜Kšžœ#˜%Kšœ˜—K˜—šžœ˜šœ ˜ Kšžœ£H˜RKšžœ˜Kšžœ#˜%Kšœ˜—K˜—Kšœ˜Kšžœ žœ˜.Kšœ˜—K˜Kšœ˜Kšžœ˜ —K˜K˜šœ™Kšœžœ˜Kšœ£!œ£œ˜HKšœ˜—šœ™Kšœ£3œ™Dšžœ žœžœ™KšœΟsœ™3—Kšœ£œ™Kšœ™—Kšœ£œ˜Kšœ˜šžœ žœ˜Kšœ;˜;Kšœ+£œ˜@K˜—Kšœ žœ˜ Kšœ˜—šžœ˜Kšœ4˜4Kšžœž˜K˜—Kšœ˜—K˜š Ÿ œž œ žœžœžœ˜>Kšžœ˜!Kšœ˜—K˜š Ÿ œž œžœžœžœ˜KKšœžœ˜ Kšœžœ˜Kšœ žœ ˜šžœžœžœ ž˜Kšœžœ˜Kš žœžœžœ žœžœ˜EKšžœ˜—Kšžœ žœžœ˜-Kšœ˜Kšžœ £œ£œ˜DKšœ˜—K˜šŸœžœžœ˜@Kšœžœžœ˜K˜šŸ œžœžœ˜ Kšœ žœ9˜Gšžœžœ˜šœžœ ˜Kšœ£#œ˜'Kšœ˜Kšœ£œ˜Kšœ˜Kšœ£œ˜Kšœ˜—Kšœ"˜"Kšœ˜K˜—Kšœ˜—K˜šžœ)žœ˜1Kšœžœ˜ Kšœžœ˜ Kšœ žœ$˜3šžœžœ˜Kšœ£€œ€œ˜IKšœ˜K˜—Kšœ%˜%šžœž œžœ˜Kšœ£€œ€œ˜KKšœ˜K˜—Kšœ*˜*šžœžœžœ˜Kšœ£€œ€œ˜PKšœ˜K˜—Kšœ˜—šžœ˜Kšœ˜Kšœ˜K˜—Kšœ˜—K˜šŸœ˜$Kšœžœ6žœ˜HKšœžœ6žœ˜HKšžœ žœ žœžœ ˜0Kšžœ žœžœ ˜$Kšžœ ˜K˜—K˜šŸœžœžœ žœ žœžœžœžœ˜}Kšœ&˜&šžœžœ˜šžœžœ˜šžœ(žœ˜0Kšœ˜Kšœ£*œ/£œ£˜mK˜—šžœ˜Kšœ%˜%Kšœ&˜&Kšœ£œ£œ˜/K˜—K˜—šžœžœ žœ˜-Kšœ%˜%Kšœ0˜0KšœD˜DKšœžœ˜6Kšœ£œ£œ˜FKšœ˜—šžœžœžœ˜*Kšœ'˜'Kš œžœ£œ£œžœ'˜YKšœž˜Kšœ˜—šžœžœ!žœ˜.Kšœ'˜'Kšœžœ£(œ£œ£œžœ£žœ˜ŠKšœžœ˜Kšœ˜—šžœžœžœ˜+Kšœ'˜'Kš œžœ£(œ£œžœ˜[Kšœžœ˜Kšœ˜—šžœžœžœ˜!Kšœ˜Kšœ£œ˜ Kšœžœ˜0Kšœ£œ£œ˜8Kšœ˜—šžœ˜Kšœ£ œ˜Kšœ˜Kšœ£œ˜-Kšœžœ˜0Kšœ£œ£œ˜+Kšœ˜—Kšœ˜—Kšœ˜—K˜šŸœžœ ˜8KšœžœB˜Jšžœžœžœ˜Kšœ0˜0Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ ˜ Kšœ˜Kšœ!™!Kšœ'˜'Kšœ˜Kšœ˜—Kšœ˜—K˜Kšœ,˜,K˜šŸœžœ˜Kšœ-˜-Kšœ-˜-Kšœ/˜/Kšœ.˜.Kšœ/˜/Kšœ.˜.Kšœ1˜1Kšœ.˜.Kšœ0˜0Kšœ0˜0Kšœ2˜2Kšœ/˜/Kšœ2˜2Kšœ3˜3Kšœ,˜,Kšœ.˜.Kšœ-˜-Kšœ1˜1Kšœ1˜1Kšœ/˜/Kšœ.˜.Kšœ/˜/Kšœ1˜1Kšœ/˜/Kšœ.˜.Kšœ.˜.Kšœ1˜1Kšœ-˜-Kšœ1˜1Kšœ,˜,Kšœ.˜.Kšœ.˜.Kšœ2˜2Kšœ,˜,Kšœ0˜0Kšœ-˜-Kšœ-˜-Kšœ.˜.Kšœ1˜1Kšœ1˜1Kšœ1˜1Kšœ.˜.Kšœ3˜3Kšœ0˜0Kšœ.˜.Kšœ0˜0Kšœ-˜-Kšœ0˜0Kšœ0˜0Kšœ1˜1Kšœ0˜0Kšœ0˜0Kšœ.˜.Kšœ.˜.Kšœ1˜1Kšœ,˜,Kšœ.˜.Kšœ.˜.K˜—K™Kšœ˜Kšœ>˜>KšœI˜IKšœ4˜4Kšžœ˜K˜K˜K˜—…—Z>wx