DIRECTORY G3dBasic, G3dPlane, IO, Rope; G3dOctree: CEDAR DEFINITIONS ~ BEGIN ROPE: TYPE ~ Rope.ROPE; STREAM: TYPE ~ IO.STREAM; Box: TYPE ~ G3dBasic.Box; Pair: TYPE ~ G3dBasic.Pair; Triple: TYPE ~ G3dBasic.Triple; Plane: TYPE ~ G3dPlane.Plane; NoSuchOctant: ERROR [msg: ROPE]; NoSuchFace: ERROR [msg: ROPE]; StackOverflow: ERROR; StackUnderflow: ERROR; Axis: TYPE ~ {x, y, z}; -- edge alignment Face: TYPE ~ {l, r, b, t, n, f}; TwoFaces: TYPE ~ RECORD [f0, f1: Face]; ActiveFaces: TYPE ~ ARRAY Face OF BOOL ¬ ALL[FALSE]; Edge: TYPE ~ {lb, lt, ln, lf, rb, rt, rn, rf, bn, bf, tn, tf}; ThreeEdges: TYPE ~ RECORD [e0, e1, e2: Edge]; Direction: TYPE ~ { l, r, b, t, n, f, -- faces lb, lt, ln, lf, rb, rt, rn, rf, bn, bf, tn, tf, -- edges lbn, lbf, ltn, ltf, rbn, rbf, rtn, rtf, -- corners c, none -- center, none }; DirectionType: TYPE ~ {none, face, edge, corner}; DirectionSelect: TYPE ~ {x, y, z, xy, xz, yz, xyz, none}; DirectionPairs: TYPE ~ ARRAY Direction OF Pair; TwoDirections: TYPE ~ RECORD [d0, d1: Direction]; ThreeDirections: TYPE ~ RECORD [d0, d1, d2: Direction]; FourDirections: TYPE ~ RECORD [d0, d1, d2, g3d: Direction]; Octant: TYPE ~ MACHINE DEPENDENT { lbn(0), lbf(1), ltn(2), ltf(3), -- left corners rbn(4), rbf(5), rtn(6), rtf(7) -- right corners }; OctantPairs: TYPE ~ ARRAY Octant OF Pair; TwoOctants: TYPE ~ RECORD [o0, o1: Octant]; FourOctants: TYPE ~ RECORD [o0, o1, o2, o3: Octant]; FaceNeighborInfo: TYPE ~ RECORD [nOctant: Octant, recurse: BOOL]; Corner: TYPE ~ REF CornerRep; CornerRep: TYPE ~ RECORD [ point: Triple ¬ [], -- location of corner outOfRange: BOOL ¬ FALSE, -- corner not in function domain valueSet: BOOL ¬ FALSE, -- true if value computed value: REAL ¬ 0.0, -- surface value at corner inside: BOOL ¬ FALSE, -- if valueSet & value > 0 nearestSet: BOOL ¬ FALSE, -- true iff nearest computed nearest: Triple ¬ [], -- surface point nearest to corner squareDistance: REAL ¬ 0.0, -- square-distance to nearest lCross: Cross ¬ NIL, -- leftward surface intersection bCross: Cross ¬ NIL, -- bottomward surface intersection nCross: Cross ¬ NIL -- nearward surface intersection ]; TwoCorners: TYPE ~ RECORD [c0, c1: Corner]; FourCorners: TYPE ~ RECORD [c0, c1, c2, c3: Corner]; Corners: TYPE ~ ARRAY Octant OF Corner; DirectionCorners: TYPE ~ ARRAY Direction OF Corner; Cube: TYPE ~ REF CubeRep; CubeRep: TYPE ~ RECORD [ parent: Cube ¬ NIL, -- parent cube size: REAL ¬ 1.0, -- length of an edge octant: Octant ¬ lbn, -- relation to parent cube level: INT ¬ 0, -- recursion depth terminal: BOOL ¬ FALSE, -- if true, leaf node corners: Corners ¬ ALL[NIL], -- corner locations and info kids: Kids ¬ ALL[NIL], -- subdivided cube crossesComputed: BOOL ¬ FALSE, -- true if surfaceCrossed: BOOL ¬ FALSE, -- true iff surface crosses cube refAny: REF ANY ¬ NIL]; -- a potentially useful pointer Kids: TYPE ~ ARRAY Octant OF Cube; Neighborhood: TYPE ~ ARRAY Direction OF Cube ¬ ALL[NIL]; -- neighbors of a cube TwoCubes: TYPE ~ RECORD [c0, c1: Cube]; ThreeCubes: TYPE ~ RECORD [c0, c1, c2: Cube]; CubeStack: TYPE ~ REF CubeStackRep; CubeStackRep: TYPE ~ RECORD [ top: INT ¬ 0, bottom: INT ¬ 0, size: INT ¬ 0, maxSize: INT ¬ 0, element: SEQUENCE maxLength: INT OF Cube]; CubeSequence: TYPE ~ REF CubeSequenceRep; CubeSequenceRep: TYPE ~ RECORD [ length: INT ¬ 0, element: SEQUENCE maxLength: INT OF Cube]; OctreeMode: TYPE ~ RECORD [ postAdaptMax: INT ¬ 0, -- max subdivs beyond terminal, given octree flatness: REAL ¬ 30.0, -- criterion in degrees for adaptive subdivision tolerance: REAL ¬ 0.0001, -- tolerance for edge convergence type: SELECT OctreeType: OctreeType FROM converge => [ rootSize: REAL, -- size of octree recurseMin: INT ¬ 1, -- min # of subdivisions of octree recurseMax: INT ¬ 5], -- max # of subdivisions of octree track => [ cubeSize: REAL ¬ 0.05, -- size of initial cube surfacePoint: Triple ¬ [], -- a point on the surface duringAdaptMax: INT ¬ 0], -- max # subdivisions during tracking ENDCASE]; OctreeType: TYPE ~ {track, converge}; Octree: TYPE ~ REF OctreeRep; OctreeRep: TYPE ~ RECORD [ root: Cube ¬ NIL, -- the octree root mode: OctreeMode ¬ [,,, track[]], -- way octree was constructed depth: INT ¬ 0, -- level of most deeply recursed name: ROPE ¬ NIL, -- name of octree errorMsg: ROPE ¬ NIL, -- error message during creation radius, terminalRadius: REAL ¬ 0.0, -- half edge length of root, leaf diameter, terminalDiameter: REAL ¬ 0.0, -- edge length of root, leaf nCubes, nTerminalCubes: CARD ¬ 0, -- # of cubes and terminal cubes truncated: BOOL ¬ FALSE, -- if octree truncates a surface completed: BOOL ¬ FALSE, -- if octree creation not aborted nFaceDepthChanges: INT ¬ 0, -- # terminal faces/non-terminal nRecursiveTrackFailures: INT ¬ 0, -- # anomalies: facedepth changes refAny: REF ANY ¬ NIL] ; -- a potentially useful pointer Cross: TYPE ~ REF CrossRep; CrossRep: TYPE ~ RECORD [ id: INT ¬ -1, -- vertex id value: REAL ¬ 0.0, -- spatial value point: Triple ¬ [], -- location of surface vertex normal: Triple ¬ [], -- if not origin, normal at point ok: BOOL ¬ TRUE]; -- FALSE if subsequently rejected CrossArray: TYPE ~ ARRAY Edge OF Cross; CrossSequence: TYPE ~ REF CrossSequenceRep; CrossSequenceRep: TYPE ~ RECORD [ length: INT ¬ 0, element: SEQUENCE maxLength: INT OF Cross]; CrossedEdge: TYPE ~ RECORD [ -- a surface-crossedEdge edge cIn, cOut: Corner ¬ NIL, -- inside and outside corners oIn, oOut: Octant]; -- and their octants CrossedEdges: TYPE ~ ARRAY Edge OF CrossedEdge; -- possible edge-surface inter. IntersectionType: TYPE ~ {empty, entering, leaving}; Intersection: TYPE ~ RECORD [ type: IntersectionType ¬ empty, -- entered, left, or missed the cube directionSelect: DirectionSelect ¬ none, -- intersect at face, edge, or corner t: REAL ¬ 0.0, -- parametric point of intersection point: Triple ¬ [], -- point of intersection value: REAL ¬ 0.0, -- value at intersection point cube: Cube ¬ NIL]; -- which cube intersected IntersectionList: TYPE ~ LIST OF Intersection; CubeProc: TYPE ~ PROC [cube: Cube] RETURNS [continue: BOOL ¬ TRUE]; CornerProc: TYPE ~ PROC [corner: Corner] RETURNS [continue: BOOL ¬ TRUE]; CornerDataProc: TYPE ~ PROC [corner: Corner] RETURNS [REF ANY]; CrossPolygonProc: TYPE ~ PROC [nPolygon: INT, polygon: CrossSequence] RETURNS [continue: BOOL ¬ TRUE]; NewCube: PROC [size: REAL, center: Triple ¬ [], cornerDataProc: CornerDataProc ¬ NIL] RETURNS [Cube]; Root: PROC [cube: Cube] RETURNS [Cube]; CubeOk: PROC [cube: Cube] RETURNS [BOOL]; FullyPointed: PROC [cube: Cube] RETURNS [BOOL]; NCubes: PROC [cube: Cube] RETURNS [INT]; NTerminalCubes: PROC [cube: Cube] RETURNS [INT]; Center: PROC [cube: Cube] RETURNS [Triple]; Size: PROC [cube: Cube] RETURNS [REAL]; MinSize: PROC [cube: Cube] RETURNS [REAL]; BoxOfCube: PROC [cube: Cube] RETURNS [Box]; AnyKids: PROC [cube: Cube] RETURNS [BOOL]; DepthOf: PROC [cube: Cube] RETURNS [INT]; Subdivide: PROC [cube: Cube]; SubdivideTerminal: PROC [cube: Cube]; RecursivelySubdivide: PROC [cube: Cube, nLevels: INT]; PointInCube: PROC [point: Triple, cube: Cube, fudge: REAL ¬ 0.0] RETURNS [BOOL]; WhichCube: PROC [point: Triple, root: Cube] RETURNS [Cube]; FirstKid: PROC [cube: Cube] RETURNS [Cube]; FirstTerminalKid: PROC [cube: Cube] RETURNS [Cube]; Apply: PROC [cube: Cube, cubeProc: CubeProc]; ApplyToKids: PROC [cube: Cube, cubeProc: CubeProc]; ApplyToLevel: PROC [cube: Cube, cubeProc: CubeProc, level: INT]; ApplyToTerminal: PROC [cube: Cube, cubeProc: CubeProc]; ApplyToTerminalCorners: PROC [cube: Cube, cornerProc: CornerProc]; ApplyToNonParentKidCorners: PROC [cube: Cube, cornerProc: CornerProc]; FaceNeighbor: PROC [cube: Cube, face: Face] RETURNS [Cube]; EdgeNeighbors: PROC [cube: Cube, edge: Edge] RETURNS [ThreeCubes]; Neighbor: PROC [cube: Cube, direction: Direction] RETURNS [Cube]; Neighbors: PROC [cube: Cube] RETURNS [Neighborhood]; Move: PROC [cube: Cube, direction: Direction] RETURNS [Neighborhood]; AddCube: PROC [cube: Cube, face: Face, fullyPointed: BOOL ¬ TRUE] RETURNS [root: Cube]; DeleteCube: PROC [cube: Cube]; MakeRestrictedOctree: PROC [root: Cube]; SetOctreeFields: PROC [octree: Octree]; SetTerminalField: PROC [root: Cube]; SetLevels: PROC [root: Cube]; PlaneFromCubeFace: PROC [cube: Cube, face: Face] RETURNS [Plane]; GetClientData: PROC [Cube] RETURNS [REF ANY]; SetClientData: PROC [Cube, REF ANY]; CubeObject: TYPE ~ REF CubeObjectRep; CubeObjectQueryProc: TYPE ~ PROC [val: REF, pt: Triple] RETURNS [BOOL]; CubeObjectRep: TYPE ~ RECORD [val: REF _ NIL, bbox: Box, query: CubeObjectQueryProc]; FromObjects: PROC [objs: LIST OF CubeObject] RETURNS [Cube]; AddObject: PROC [Cube, CubeObject]; SubdivideGivenObjects: PROC [cube: Cube, maxPerCube: INT, maxDepth: INT]; QueryObjects: PROC [Cube, Triple] RETURNS [obj: REF ANY]; EdgeCorners: PROC [cube: Cube, edge: Edge] RETURNS [TwoCorners]; FaceCorners: PROC [cube: Cube, face: Face] RETURNS [FourCorners]; NewCorners: PROC [size: REAL, center: Triple, cornerDataProc: CornerDataProc ¬ NIL] RETURNS [Corners]; GetDirectionCorner: PROC [cube: Cube, d: Direction] RETURNS [c: Corner]; GetDirectionCorners: PROC [cube: Cube] RETURNS [DirectionCorners]; EdgesFromOctant: PROC [octant: Octant] RETURNS [ThreeEdges]; DirectionsFromOctant: PROC [octant: Octant] RETURNS [ThreeDirections]; FaceFromEdgeOctant: PROC [edge: Edge, octant: Octant] RETURNS [Face]; NextCWEdge: PROC [edge: Edge, face: Face] RETURNS [Edge]; NextCCWEdge: PROC [edge: Edge, face: Face] RETURNS [Edge]; EdgeDirections: PROC [edge: Edge] RETURNS [ThreeDirections]; EdgeFaces: PROC [edge: Edge] RETURNS [TwoFaces]; EdgeOctants: PROC [edge: Edge] RETURNS [TwoOctants]; FaceOctants: PROC [face: Face] RETURNS [FourOctants]; OppositeEdge: PROC [edge: Edge, face: Face] RETURNS [Edge]; InverseEdge: PROC [edge: Edge, face: Face] RETURNS [Edge]; DiagonalEdge: PROC [edge: Edge] RETURNS [Edge]; OtherFace: PROC [edge: Edge, face: Face] RETURNS [Face]; AxisFromEdge: PROC [edge: Edge] RETURNS [Axis]; DirectionTypeFromDirection: PROC [direction: Direction] RETURNS [DirectionType]; DirectionFromFace: PROC [face: Face] RETURNS [Direction]; DirectionFromEdge: PROC [edge: Edge] RETURNS [Direction]; DirectionFromOctant: PROC [octant: Octant] RETURNS [Direction]; DirectionFromOctants: PROC [octant0, octant1: Octant] RETURNS [Direction]; DirectionFromPoints: PROC [point0, point1: Triple] RETURNS [Direction]; OppositeOctant: PROC [octant: Octant] RETURNS [Octant] ~ INLINE { RETURN[VAL[ORD[LAST[Octant]]-ORD[octant]]]}; OppositeFace: PROC [face: Face] RETURNS [Face]; OppositeDirection: PROC [direction: Direction] RETURNS [Direction]; AddDirection: PROC [d0, d1: Direction] RETURNS [Direction]; EdgeFromDirection: PROC [d: Direction] RETURNS [Edge]; OctantFromDirection: PROC [d: Direction] RETURNS [Octant]; OctantFromThreeDirections: PROC [d0, d1, d2: Direction] RETURNS [Octant]; FaceFromDirection: PROC [d: Direction] RETURNS [Face]; FaceDirections: PROC [face: Face] RETURNS [FourDirections]; NormalFromFace: PROC [face: Face] RETURNS [Triple]; WriteCubesToFile: PROC [fileName: ROPE, cube: Cube, miscInfo: ROPE ¬ NIL]; ReadCubesFromFile: PROC [fileName: ROPE] RETURNS [Cube]; AddToCubeSequence: PROC [cube: Cube, cubes: CubeSequence ¬ NIL] RETURNS [CubeSequence]; LengthenCubeSequence: PROC [cubes: CubeSequence, amount: REAL ¬ 1.3] RETURNS [CubeSequence]; NewCubeStack: PROC [length: INT] RETURNS [CubeStack]; WriteBottomOfCubeStack: PROC [cube: Cube, cubeStack: CubeStack]; ReadTopOfCubeStack: PROC [cubeStack: CubeStack] RETURNS [cube: Cube]; CubeStackSize: PROC [cubeStack: CubeStack] RETURNS [INT]; MaxCubeStackSize: PROC [cubeStack: CubeStack] RETURNS [INT]; CubeStackEmpty: PROC [cubeStack: CubeStack] RETURNS [BOOL]; LengthenCubeStack: PROC [cubeStack: CubeStack, amount: REAL ¬ 1.3] RETURNS [CubeStack]; ObtainCrossSequence: PROC RETURNS [crossSequence: CrossSequence]; ReleaseCrossSequence: PROC [crossSequence: CrossSequence]; RopeFromOctant: PROC [octant: Octant] RETURNS [ROPE]; RopeFromFace: PROC [face: Face] RETURNS [ROPE]; RopeFromDirection: PROC [direction: Direction] RETURNS [ROPE]; RopeFromDirectionSelect: PROC [directionSelect: DirectionSelect] RETURNS [ROPE]; OctantFromRope: PROC [rope: ROPE] RETURNS [Octant]; FaceFromRope: PROC [rope: ROPE] RETURNS [Face]; DirectionFromRope: PROC [rope: ROPE] RETURNS [Direction]; RopeFromRefAny: PROC [ref: REF ANY] RETURNS [rope: ROPE]; END. ‚ G3dOctree.mesa Copyright Σ 1985, 1992 by Xerox Corporation. All rights reserved. Bloomenthal, November 21, 1992 2:11 pm PST Imported Types Errors Directions, Edges, Faces, Octants There are six basic directions: l: left (lesser in x), r: right (greater in x), b: bottom (lesser in y), t: top (greater in y), n: near (lesser in z), f: far (greater in z) Corners Cubes, Cube Sequences, and CubeStacks Octrees Cube Crossing a Surface Ray-Cube Intersections CallBack Procs Procedure for operating on a cube and its descendents. Perform operation on a cube corner. Called when a corner is allocated. nPolygon is polygon id; polygon is sequence of crosses. Cube Operations Allocation Create a new cube; its octant defaults to lbn and its level is 0. Attributes Return the root of cube. Verify the integrity of the cube. Return true if all kids are defined for non-terminal cubes. Return 1+number of cubes descended from cube. Return the number of terminal cubes descended from cube. Return the center of the cube. Return the size (width, height, depth) of the cube. Return the size of the smallest cube descended from cube. Return the bounding box of the cube. Return true if any of cube.kids is non-NIL. Return the level of the most deeply recursed terminal cube descended from cube. Subdivision Subdivide the cube into eight octants. Subdivide all terminal cubes descended from cube. Recursively subdivide the terminal nodes of cube to a depth of nLevels. Searching Return true if point is inside the cube. fudge is the percent deviation from cube size. Return the cube descended from root that contains point; return NIL if no such cube. Return the first non-nil kid of cube. Return the first terminal cube found descended from cube. Callback Apply cubeProc to cube and all its descendents. Apply cubeProc to cube's descendents. Apply cubeProc to all cubes descended from cube with specified level. Apply cubeProc to all terminal descendents of cube. Apply cornerProc to all corners of terminal descendents of cube. Apply cornerProc to all the kid corners of cube that are not corners of cube; these are the midpoints of cube's edges, the center of cube's faces, and the center of cube. An error may result if any of cubes.kids is undefined. Neighbors Return the neighbor next to cube's face; return NIL if no such neighbor. Return the three neighbors next to cube's edge; return NIL if no such neighbor. Return the neighbor next to cube in the given direction; return NIL if no such neighbor. Return the cube and its 26 neighbors. Return the neighborhood of cube after it has moved in the given direction. Octree If the face neighbor of cube doesn't exist, allocate it, creating any required parents. If fullyPointed, then parent (and grandparent, etc.) of cube will be fully subdivided, otherwise, only cube is added. Delete cube from its parent. Ensure by subdivision that no cube neighbors differ in octree depth by more than one. Set the depth, radius, terminalRadius, diameter, terminalDiameter, and nTerminalCubes fields of the octree. For each cube, set terminal field true iff cube has no kids, false otherwise. For each cube, set level field according to its depth in the octree. Miscellany Return the plane containing the specified face. Get any previously set client data. Setset client data for subsequent access. Object Query Construct a cube which contains the given objects Adds one more object - the Cube must have been created with 'FromObjects.' The new object must fit within the old cube. Subdivide the given cube (which must have been created with FromObjects/AddObject) until every sub-cube has either 1) <= (maxPerCube) objects in it 2) a depth = (maxDepth) Find the object which contains the given triple. If none, returns NIL. The cube must have been createdc by (FromObjects). Corner Operations Return the two corners at cube's edge. In the TwoCorners record, l precedes r, b precedes t, and n precedes f. Return the four corners along cube's face. Corners are clockwise if viewed from outside. Compute the corners of a cube given its center and size. Return the corner lying in the given direction. Return the 27 corners of cube's children. An error may occur if any of cube.kids is undefined. Axis, Edge, Face, Octant, Direction Operations Return the three edges that emanate from octant. Return the three Directions that create octant. face traversed cw by edge starting at octant; no checking that octant agrees with edge. Return the next edge clockwise around face; no checking that edge and face agree. Return the next edge counter-clockwise around face; no checking that edge and face agree. Return the three directions that cubes can lie around an edge. Return the two faces around a cube's edge. Return the two octants at a cube's edge. In the TwoOctants record, l precedes r, b precedes t, and n precedes f. Return the four octants along face. Octants are clockwise if viewed from outside. Return the edge on the opposite side of face. Return the edge as shared by a cube with face adjacency. Return the edge diagonally across the cube. Return the face on the other side of edge from face. Return the axis aligned with the edge. Return the direction type given the direction. Return the direction that is the face. Return the direction that is the edge. Return the direction that is the octant. Return the direction which takes octant0 to octant1. Return direction taking point0 to point1 (none if the points aren't aligned on the grid). Return the opposite octant. Return the face opposite face. Return the opposite direction of direction. Return the result of applying d1 to d0 (eg., return none if d0 = l and d1 = r; return lb if d0 = l and d1 = b). Return the edge that is the direction d; ERROR raised if d is not an edge direction. Return the octant that is the direction d; ERROR raised if d is not an octant direction. Return the octant that is in the direction given by the sum of d0, d1, and d2. Return the face that is the direction d; ERROR raised if d is not an face direction. Return the directions associated with the four corners of face. Return the face normal. IO File Format: The first line gives the center and size of the root cube. Following lines each represent a cube, specifying, by "0" or "1", which octants exist. Write the Volume to the named file. Read the Volume from the named file. Cube Sequence Procedures Add cube to cubes, lengthening cubes if necessary. Return a copy of the input sequence whose maxLength is amount*input.maxLength. Cube Stack Support Procedures Create a new stack of cubes capable of storing length cubes Add cube to the bottom of the stack; may raise ERROR StackOverflow. Read a cube from the top of the stack; may raise ERROR StackUnderflow. Return the current number of cubes in the stack. Return the maximum size obtained by cubeStack. Return true iff there are no cubes in the stack. Return a copy of the input CubeStack whose maxLength is amount*input.maxLength. Cross Support Procedures From the pool, obtain a cross sequence with maxLength of 12. Return the crossSequence to the pool. Ropes Return the rope describing the octant. Return the rope describing the face. Return the rope describing the direction. Return the rope describing the directionSelect. Return the octant given the rope; can raise $NoSuchOctant. Return the face given the rope; can raise $NoSuchDirection. Return the direction given the rope. Return a capitalized rope. Κ)–"cedarcode" style•NewlineDelimiter ™™Jšœ Οeœ6™BJ™*J˜JšΟk œ˜'J˜—• CharProps' Postfix16.0 24 .div 1 1 textColoršΠbl œžœž ˜Jšž˜—head–16.0 24 .div 1 1 textColoršΟl™Jšžœž œžœ˜Jš žœžžœžœžœ˜Jšœžœ˜Jšœž œ˜ Jšœ žœ˜$Jšœžœ˜"—–16.0 24 .div 1 1 textColorš ™J–& Postfix0.0 24 .div 1 1 textColoršœžœžœ˜"J–& Postfix0.0 24 .div 1 1 textColoršœ žœžœ˜!J–&Postfix0.0 24 .div 1 1 textColor šœžœ˜J–&Postfix0.0 24 .div 1 1 textColor šœžœ˜—–16.0 24 .div 1 1 textColorš !™!–$Postfix0.0 24 .div 1 1 textColor™J–$/Postfix0.0 24 .div 1 1 textColor™/J–$/Postfix0.0 24 .div 1 1 textColor™/J–$,Postfix0.0 24 .div 1 1 textColor™,J™—Jšœ žœΟc˜9J˜Jšœ žœ˜%Jšœ žœžœ˜*Jš œ žœžœžœžœžœžœ˜7J˜Jšœ žœ4˜CJšœžœžœ˜0J˜šœžœ˜Jšœ œ‘˜*Jšœ9‘˜AJšœ2‘ ˜Jšœ ‘"˜BJšœžœ ‘˜AJšœžœ‘ ˜?Jšœžœ‘"˜AJšœžœ‘ ˜>J˜J˜—Jšœžœžœ˜.Jšœžœžœ˜7Jšœ žœžœžœ˜+Jšœžœžœ žœ˜4—–16.0 24 .div 1 1 textColorš %™%Jšœ žœžœ ˜šœ žœžœ˜Jšœžœ‘˜,Jšœžœ ‘˜2Jšœ‘˜9Jšœ žœ ‘˜.Jšœžœžœ‘˜6Jšœžœžœ‘˜@Jšœžœžœ‘˜2Jšœžœžœ‘ ˜0Jšœžœžœ‘ ˜EJšœžœžœžœ‘˜?J˜—Jšœ žœžœžœ˜'Jš œžœžœ žœžœžœ‘˜QJšœ žœžœ˜*šœžœžœ˜0J˜—Jšœ žœžœ˜&šœžœžœ˜Jšœ žœ˜Jšœžœ˜Jšœ žœ˜Jšœžœ˜Jšœžœ žœžœœ˜0J˜—Jšœžœžœ˜+šœžœžœ˜!Jšœžžœ˜Jšœžœ žœžœœ˜0——–16.0 24 .div 1 1 textColorš ™šœ Οsœ’œ˜Jšœžœ‘,˜HJšœžœ‘1˜MJšœžœ ‘!˜Ašœžœž˜(˜ Jšœ ž œ‘˜)Jšœ žœ‘"˜=Jšœžœ ‘"˜>—˜ Jšœ ž œ ‘˜4Jšœ ‘˜9Jšœžœ ‘%˜C—Jš’ ˜ —J˜—šœžœ˜(J˜—Jšœ žœžœ ˜!šœ žœžœ˜Jšœžœ‘˜/Jšœ)‘˜FJšœžœ ‘ ˜Jšœ‘˜7Jšœžœ ‘˜J™—š€ œžœžœ ˜0J™*J™—š€ œžœžœ˜4J™(J™GJ™—š€ œžœžœ˜5J™RJ™—š€ œžœžœ˜;J™-J™—š€ œžœžœ˜:J™8J™—š€ œžœžœ˜/J™+J™—š€ œžœžœ˜8J™4J™—š€ œžœžœ˜/J™&J™—š€œžœžœ˜PJ™.J™—š€œžœžœ ˜9J™&J™—š€œžœžœ ˜9J™&J™—š€œžœžœ ˜?J™(J™—š€œžœžœ ˜JJ™4J™—š€œžœžœ ˜GJ™YJ™—š€œžœžœ žœ˜AJš žœžœžœžœ žœ ˜,J™J™—š€ œžœžœ˜/J™J˜—š€œžœžœ ˜CJ™+J™—š€ œžœžœ ˜;J™&J™HJ™—š€œžœžœ˜6Jšœ)’œ&™TJ™—š€œžœžœ ˜:Jšœ+’œ(™XJ™—š€œžœžœ ˜IJ™NJ˜—š€œžœžœ˜6Jšœ)’œ&™TJ™—š€œžœžœ˜;J™?J™—š€œžœžœ ˜3J™——–16.0 24 .div 1 1 textColorš ™–0.0 24 .div 1 1 textColor™ J–0.0 24 .div 1 1 textColor™:J–0.0 24 .div 1 1 textColor™WJ–0.0 24 .div 1 1 textColor™—š €œžœ žœžœžœ˜JJ™#J˜—š€œžœ žœžœ˜8J™$——–16.0 24 .div 1 1 textColorš ™š€œžœ$žœ˜?Jšžœ˜J™2J˜—š€œžœžœ˜DJšžœ˜J™N——–16.0 24 .div 1 1 textColorš ™š€ œžœ žœžœ ˜5J™;J˜—š€œžœ$˜@Jšœ/’œ™CJ˜—š€œžœžœ˜EJšœ1’œ™FJ˜—š€ œžœžœžœ˜9J™0J˜—š€œžœžœžœ˜J™)J™—š€œžœ$žœžœ˜PJ™/J™—š€œžœžœžœ ˜3J™:J™—š€ œžœžœžœ˜/J™;J™—š€œžœžœžœ ˜9J™$J™—š €œžœžœžœžœžœ˜9J™J™——Jšžœ˜J˜—…—3„j/