DIRECTORY NodeStyleExtra, NodeStyle, NodeStyleObject, TiogaNode, TiogaNodeOps, TiogaLooks, TiogaLooksOps, TiogaPathOps, EditNotify, NodeProps, NameSymbolTable, Inline, JaMOps; NodeStyleApplyImpl: CEDAR MONITOR IMPORTS EditNotify, Inline, JaMOps, NameSymbolTable, NodeProps, NodeStyle, NodeStyleExtra, TiogaPathOps EXPORTS NodeStyle, NodeStyleExtra = BEGIN OPEN NodeStyle, NodeStyleExtra; defaultStyle: PUBLIC Ref; -- contains initial values for the style parameters defaultName, rootName: Name; ApplyAll: PUBLIC PROC [ref: Ref, path: TiogaNode.Path, kind: OfStyle _ screen] = { [] _ DoApplyAll[ref, path, kind] }; DoApplyAll: PROC [ref: Ref, path: TiogaNode.Path, kind: OfStyle] RETURNS [depth: CARDINAL] = { found: BOOLEAN; parent: TiogaNode.Path; alt: Name; IF path.node=NIL THEN { ref^ _ defaultStyle^; RETURN [0] }; [found, depth] _ FindInApplyAllCache[ref, path, kind]; IF found THEN RETURN [depth+1]; parent _ TiogaPathOps.Parent[path]; alt _ IF parent=TiogaNode.nullPath THEN rootName ELSE defaultName; depth _ DoApplyAll[ref, parent, kind]; ApplyForNode[ref, path, alt, kind]; EnterInApplyAllCache[ref, path, depth]; RETURN [depth+1] }; applyCacheInfo: REF ApplyCacheRecord _ NEW[ApplyCacheRecord]; ApplyCacheRecord: TYPE = RECORD [ applyCacheDepth: CARDINAL _ 0, -- next free entry applyCacheResults: REF ApplyCacheResults, applyCachePaths: REF ApplyCachePaths, applyCacheProbes, applyCacheHits, applyCacheSaves: INT _ 0 ]; applyCacheSize: CARDINAL = 8; -- number of levels deep in tree ApplyCachePaths: TYPE = ARRAY [0..applyCacheSize) OF TiogaNode.Path; ApplyCacheResults: TYPE = ARRAY [0..applyCacheSize) OF StyleBody; InitApplyCacheRecord: PROC = { OPEN applyCacheInfo; applyCacheResults _ NEW[ApplyCacheResults]; applyCachePaths _ NEW[ApplyCachePaths] }; RemoveAllFromApplyAllCache: PUBLIC PROC = { FlushApplyAllCache[] }; FlushApplyAllCache: PUBLIC ENTRY PROC [init: BOOLEAN _ FALSE] = { ENABLE UNWIND => NULL; ClearApplyAllCache[init] }; ClearApplyAllCache: PROC [init: BOOLEAN] = { OPEN applyCacheInfo; paths: REF ApplyCachePaths _ applyCachePaths; FOR i:CARDINAL IN [0..applyCacheSize) DO paths[i] _ TiogaNode.nullPath; ENDLOOP; applyCacheDepth _ 0 }; RemoveNodeFromApplyAllCache: PUBLIC ENTRY PROC [node: TiogaNode.Ref] = { OPEN applyCacheInfo; ENABLE UNWIND => NULL; paths: REF ApplyCachePaths _ applyCachePaths; FOR i:CARDINAL IN [0..applyCacheDepth) DO IF paths[i].node=node THEN { -- clear from here on FOR j:CARDINAL IN [i..applyCacheSize) DO paths[j] _ TiogaNode.nullPath; ENDLOOP; applyCacheDepth _ i; EXIT }; ENDLOOP }; FindInApplyAllCache: ENTRY PROC [ref: Ref, path: TiogaNode.Path, kind: OfStyle] RETURNS [found: BOOLEAN, depth: CARDINAL] = { OPEN applyCacheInfo; ENABLE UNWIND => NULL; node: TiogaNode.Ref = path.node; paths: REF ApplyCachePaths _ applyCachePaths; print: BOOL = (kind=print); -- if true, then find result with print true also applyCacheProbes _ applyCacheProbes+1; FOR i:CARDINAL DECREASING IN [0..applyCacheDepth) DO IF paths[i].node=node AND print=applyCacheResults[i].print AND TiogaPathOps.Equal[paths[i], path] THEN { -- found it applyCacheHits _ applyCacheHits+1; applyCacheSaves _ applyCacheSaves+i+1; ref^ _ applyCacheResults[i]; RETURN [TRUE, i] }; ENDLOOP; RETURN [FALSE, 0] }; EnterInApplyAllCache: ENTRY PROC [ref: Ref, path: TiogaNode.Path, depth: CARDINAL] = { OPEN applyCacheInfo; ENABLE UNWIND => NULL; paths: REF ApplyCachePaths _ applyCachePaths; IF depth >= applyCacheSize THEN RETURN; paths[depth] _ path; applyCacheResults[depth] _ ref^; FOR i:CARDINAL IN [depth+1..applyCacheSize) DO paths[i] _ TiogaNode.nullPath; ENDLOOP; applyCacheDepth _ depth+1 }; prefixAtom: ATOM = NodeProps.PrefixAtom[]; postfixAtom: ATOM = NodeProps.PostfixAtom[]; Notify: PROC [change: REF READONLY EditNotify.Change] = TRUSTED { HasSubstructure: PROC [node: TiogaNode.Ref] RETURNS [BOOL] = TRUSTED { path: TiogaNode.Path = [node, NIL]; IF TiogaPathOps.Contents[path] # TiogaNode.nullPath THEN RETURN [TRUE]; IF TiogaPathOps.BranchChild[path] # TiogaNode.nullPath THEN RETURN [TRUE]; RETURN [FALSE] }; DoNode: PROC [node: TiogaNode.Ref] = TRUSTED { IF HasSubstructure[node] THEN FlushApplyAllCache ELSE RemoveNodeFromApplyAllCache[node] }; WITH x:change SELECT FROM InsertingNode => IF HasSubstructure[x.new] THEN FlushApplyAllCache; MovingNodes, MovingGroup => FlushApplyAllCache; NodeNesting => IF x.first = x.last -- only changing one node AND ~HasSubstructure[x.first] -- node has no substructure THEN SELECT x.change FROM 1 => FlushApplyAllCache; -- increasing nesting in tree -1 => RemoveNodeFromApplyAllCache[x.first]; -- decreasing nesting in tree ENDCASE => FlushApplyAllCache ELSE FlushApplyAllCache; ChangingFormat => DoNode[x.node]; ChangingProp => SELECT x.propAtom FROM prefixAtom, postfixAtom, $Comment, $StyleDef => DoNode[x.node]; ENDCASE; ENDCASE => ERROR; -- not expecting notify for any other kinds of changes }; ApplyForNode: PUBLIC PROC [ref: Ref, path: TiogaNode.Path, alt: Name, kind: OfStyle] = { ext: ATOM; node: TiogaNode.Ref = path.node; ref.isComment _ node.comment; ref.print _ (kind=print); ref.nestingLevel _ MIN[TiogaPathOps.Level[path], MaxNestingLevel]; EvalFreeVars[ref, node]; IF node.hasstyledef THEN { localStyle: LocalStyle _ NARROW[NodeProps.GetProp[node, $StyleDef]]; IF localStyle # NIL THEN ref.name[style] _ localStyle.name }; IF node.hasprefix THEN ApplyObject[ref, NodeProps.GetPrefixObject[node], kind] ELSE IF ref.nestingLevel=0 -- root node -- AND -- check for file extension default (ext _ NARROW[NodeProps.GetProp[node, $FileExtension]])#NIL THEN FOR list: LIST OF ExtObjPair _ defaultStylesForExtensions, list.rest UNTIL list=NIL DO IF list.first.fileExtension # ext THEN LOOP; ApplyObject[ref, list.first.styleObject, kind]; EXIT; ENDLOOP; ApplyFormat[ref, node.format, alt, kind]; IF node.haspostfix THEN ApplyObject[ref, NodeProps.GetPostfixObject[node], kind] }; ApplyFormat: PUBLIC PROC [ref: Ref, name, alt: Name, kind: OfStyle _ screen] = { OPEN ruleCacheInfo; BITXOR: PROC[CARDINAL, CARDINAL] RETURNS[CARDINAL] = LOOPHOLE[Inline.BITXOR]; names: REF RuleCacheNames _ ruleCacheNames; inputs: REF RuleCacheBodies _ ruleCacheInputs; input: StyleBody; initloc, loc: CARDINAL; ok: BOOLEAN; frame: Frame _ NIL; styleName: Name; FindInRuleCache: ENTRY PROC RETURNS [BOOLEAN] = { ENABLE UNWIND => NULL; ruleCacheProbes _ ruleCacheProbes+1; DO -- search cache SELECT names[loc] FROM name => IF inputs[loc] = ref^ THEN { ref^ _ ruleCacheResults[loc]; ruleCacheHits _ ruleCacheHits+1; RETURN [TRUE] }; NameSymbolTable.nullName => RETURN [FALSE]; -- this is an unused entry ENDCASE; SELECT (loc _ loc+1) FROM ruleCacheSize => IF (loc _ 0)=initloc THEN RETURN [FALSE]; initloc => RETURN [FALSE]; ENDCASE; ENDLOOP }; PutInRuleCache: ENTRY PROC = { ENABLE UNWIND => NULL; IF ruleCacheCount = ruleCacheMax THEN ClearRuleCache[]; loc _ initloc; DO -- search cache for place to put the entry SELECT names[loc] FROM name => IF inputs[loc] = input THEN RETURN; -- already in cache NameSymbolTable.nullName => EXIT; -- this is an unused entry ENDCASE; SELECT (loc _ loc+1) FROM ruleCacheSize => IF (loc _ 0)=initloc THEN ERROR; -- cache full initloc => ERROR; -- cache full ENDCASE; ENDLOOP; ruleCacheCount _ ruleCacheCount+1; inputs[loc] _ input; ruleCacheResults[loc] _ ref^; names[loc] _ name }; IF name = NameSymbolTable.nullName AND (name _ alt) = NameSymbolTable.nullName THEN RETURN; loc _ initloc _ BITXOR[LOOPHOLE[name, CARDINAL], Hash[ref]] MOD ruleCacheSize; IF FindInRuleCache[] THEN RETURN; frame _ GetFrame[ref, styleName _ ref.name[style], kind]; input _ ref^; -- save the input value of the record ok _ ExecuteName[frame, name]; FreeFrame[frame, styleName, kind]; frame _ NIL; IF ok THEN PutInRuleCache[] -- save results in cache ELSE IF name # alt THEN ApplyFormat[ref, alt, NameSymbolTable.nullName] }; ruleCacheInfo: REF RuleCacheInfoRecord _ NEW[RuleCacheInfoRecord]; RuleCacheInfoRecord: TYPE = RECORD [ ruleCacheCount: CARDINAL _ 0, -- number of entries currently in use ruleCacheNames: REF RuleCacheNames, ruleCacheInputs: REF RuleCacheBodies, ruleCacheResults: REF RuleCacheBodies, ruleCacheProbes, ruleCacheHits: INT _ 0 ]; ruleCacheSize: CARDINAL = 64; -- should be a power of 2 ruleCacheMax: CARDINAL = (ruleCacheSize*4)/5; -- don't fill too full RuleCacheNames: TYPE = ARRAY [0..ruleCacheSize) OF Name; RuleCacheBodies: TYPE = ARRAY [0..ruleCacheSize) OF StyleBody; InitRuleCacheInfo: PROC = { OPEN ruleCacheInfo; ruleCacheNames _ NEW[RuleCacheNames]; ruleCacheInputs _ NEW[RuleCacheBodies]; ruleCacheResults _ NEW[RuleCacheBodies] }; FlushRuleCache: ENTRY PROC [init: BOOLEAN _ FALSE] = { ENABLE UNWIND => NULL; ClearRuleCache[] }; ClearRuleCache: PROC [init: BOOLEAN _ FALSE] = { OPEN ruleCacheInfo; names: REF RuleCacheNames _ ruleCacheNames; IF ~init AND ruleCacheCount = 0 THEN RETURN; ruleCacheCount _ 0; FOR i: CARDINAL IN [0..ruleCacheSize) DO names[i] _ NameSymbolTable.nullName; ENDLOOP }; Hash: PROC [ref: Ref] RETURNS [CARDINAL] = { BITXOR: PROC[CARDINAL, CARDINAL] RETURNS[CARDINAL] = LOOPHOLE[Inline.BITXOR]; RETURN [LOOPHOLE[ BITXOR[LOOPHOLE[ref.name[style]], BITXOR[LOOPHOLE[ref.name[fontFamily], CARDINAL], BITXOR[ref.real[fontSize], BITXOR[ref.real[leftIndent], ref.real[leading]]]]], CARDINAL]] }; ApplyLooks: PUBLIC PROC [ref: Ref, looks: TiogaLooks.Looks, kind: OfStyle] = { OPEN looksCacheInfo; BITXOR: PROC[CARDINAL, CARDINAL] RETURNS[CARDINAL] = LOOPHOLE[Inline.BITXOR]; lks: REF LooksCacheLooks _ looksCacheLooks; inputs: REF LooksCacheBodies _ looksCacheInputs; initloc, loc: CARDINAL; input: StyleBody; frame: Frame _ NIL; styleName: Name; FindInLooksCache: ENTRY PROC RETURNS [BOOLEAN] = { ENABLE UNWIND => NULL; looksCacheProbes _ looksCacheProbes+1; DO -- search cache SELECT lks[loc] FROM looks => IF inputs[loc] = ref^ THEN { ref^ _ looksCacheResults[loc]; looksCacheHits _ looksCacheHits+1; RETURN [TRUE] }; TiogaLooks.noLooks => RETURN [FALSE]; -- this is an unused entry ENDCASE; SELECT (loc _ loc+1) FROM looksCacheSize => IF (loc _ 0)=initloc THEN RETURN [FALSE]; initloc => RETURN [FALSE]; ENDCASE; ENDLOOP }; PutInLooksCache: ENTRY PROC = { ENABLE UNWIND => NULL; IF looksCacheCount = looksCacheMax THEN ClearLooksCache[]; loc _ initloc; DO -- search cache SELECT lks[loc] FROM looks => IF inputs[loc] = input THEN RETURN; -- already in cache TiogaLooks.noLooks => EXIT; -- this is an unused entry ENDCASE; SELECT (loc _ loc+1) FROM looksCacheSize => IF (loc _ 0)=initloc THEN ERROR; -- cache full initloc => ERROR; -- cache full ENDCASE; ENDLOOP; looksCacheResults[loc] _ ref^; lks[loc] _ looks; inputs[loc] _ input; looksCacheCount _ looksCacheCount+1 }; IF looks = TiogaLooks.noLooks THEN RETURN; loc _ initloc _ BITXOR[LOOPHOLE[looks, TiogaLooksOps.LooksBytes].byte0, BITXOR[LOOPHOLE[looks, TiogaLooksOps.LooksBytes].byte1, BITXOR[LOOPHOLE[looks, TiogaLooksOps.LooksBytes].byte2, Hash[ref]]]] MOD looksCacheSize; IF FindInLooksCache[] THEN RETURN; frame _ GetFrame[ref, styleName _ ref.name[style], kind]; input _ ref^; -- save the input value of the record FOR c: CHARACTER IN TiogaLooks.Look DO IF looks[c] THEN [] _ ExecuteName[frame, lookNames[c]] ENDLOOP; FreeFrame[frame, styleName, kind]; frame _ NIL; PutInLooksCache[] }; looksCacheInfo: REF LooksCacheInfoRecord _ NEW[LooksCacheInfoRecord]; LooksCacheInfoRecord: TYPE = RECORD [ looksCacheCount: CARDINAL _ 0, looksCacheLooks: REF LooksCacheLooks, looksCacheInputs: REF LooksCacheBodies, looksCacheResults: REF LooksCacheBodies, looksCacheProbes, looksCacheHits: INT _ 0 ]; looksCacheSize: CARDINAL = 16; -- should be a power of 2 looksCacheMax: CARDINAL = (looksCacheSize*4)/5; -- don't fill too full LooksCacheLooks: TYPE = ARRAY [0..looksCacheSize) OF TiogaLooks.Looks; LooksCacheBodies: TYPE = ARRAY [0..looksCacheSize) OF StyleBody; InitLooksCacheInfo: PROC = { OPEN looksCacheInfo; looksCacheLooks _ NEW[LooksCacheLooks]; looksCacheInputs _ NEW[LooksCacheBodies]; looksCacheResults _ NEW[LooksCacheBodies] }; lookNames: ARRAY TiogaLooks.Look OF Name; FlushLooksCache: ENTRY PROC [init: BOOLEAN _ FALSE] = { ENABLE UNWIND => NULL; ClearLooksCache[] }; ClearLooksCache: PROC [init: BOOLEAN _ FALSE] = { OPEN looksCacheInfo; IF ~init AND looksCacheCount = 0 THEN RETURN; looksCacheCount _ 0; FOR i: CARDINAL IN [0..looksCacheSize) DO looksCacheLooks[i] _ TiogaLooks.noLooks; ENDLOOP }; nullObject: NameSymbolTable.Object = NameSymbolTable.NullObject[]; ApplyObject: PUBLIC PROC [ref: Ref, object: NameSymbolTable.Object, kind: OfStyle _ screen] = { OPEN objectCacheInfo; BITXOR: PROC[CARDINAL, CARDINAL] RETURNS[CARDINAL] = LOOPHOLE[Inline.BITXOR]; objects: REF ObjectCacheObjects _ objectCacheObjects; inputs: REF ObjectCacheBodies _ objectCacheInputs; input: StyleBody; initloc, loc: CARDINAL; initDepth, finalDepth: CARDINAL; obj: Object _ LOOPHOLE[object]; frame: Frame _ NIL; styleName: Name; FindInObjectCache: ENTRY PROC RETURNS [BOOLEAN] = { ENABLE UNWIND => NULL; objectCacheProbes _ objectCacheProbes+1; DO -- search cache SELECT objects[loc] FROM object => IF inputs[loc] = ref^ THEN { ref^ _ objectCacheResults[loc]; objectCacheHits _ objectCacheHits+1; RETURN [TRUE] }; nullObject => RETURN [FALSE]; -- this is an unused entry ENDCASE; SELECT (loc _ loc+1) FROM objectCacheSize => IF (loc _ 0)=initloc THEN RETURN [FALSE]; initloc => RETURN [FALSE]; ENDCASE; ENDLOOP }; PutInObjectCache: ENTRY PROC = { ENABLE UNWIND => NULL; IF objectCacheCount = objectCacheMax THEN ClearObjectCache[]; loc _ initloc; DO -- search cache for place to put the entry SELECT objects[loc] FROM object => IF inputs[loc] = input THEN RETURN; -- already in cache nullObject => EXIT; -- this is an unused entry ENDCASE; SELECT (loc _ loc+1) FROM objectCacheSize => IF (loc _ 0)=initloc THEN ERROR; -- cache full initloc => ERROR; -- cache full ENDCASE; ENDLOOP; objectCacheCount _ objectCacheCount+1; inputs[loc] _ input; objectCacheResults[loc] _ ref^; objects[loc] _ object }; HashObject: PROC RETURNS [CARDINAL] = { ob: RECORD [ a, b, c, d: CARDINAL ] _ LOOPHOLE[object]; RETURN [ob.b] }; IF object = nullObject THEN RETURN; loc _ initloc _ BITXOR[HashObject[], Hash[ref]] MOD objectCacheSize; IF FindInObjectCache[] THEN RETURN; frame _ GetFrame[ref, styleName _ ref.name[style], kind]; input _ ref^; -- save the input value of the record TRUSTED { initDepth _ JaMOps.CountStack[frame.opstk]; JaMOps.Execute[frame, CVX[obj]]; IF (finalDepth _ JaMOps.CountStack[frame.opstk]) # initDepth THEN { PushObject[frame, obj]; PushText[frame, "Failed to leave stack at same depth after execution."]; StyleError[frame, 2] } ELSE PutInObjectCache[]}; FreeFrame[frame, styleName, kind]; frame _ NIL }; objectCacheInfo: REF ObjectCacheInfoRecord _ NEW[ObjectCacheInfoRecord]; ObjectCacheInfoRecord: TYPE = RECORD [ objectCacheCount: CARDINAL, objectCacheObjects: REF ObjectCacheObjects, objectCacheInputs: REF ObjectCacheBodies, objectCacheResults: REF ObjectCacheBodies, objectCacheProbes, objectCacheHits: INT _ 0 ]; objectCacheSize: CARDINAL = 16; -- should be a power of 2 objectCacheMax: CARDINAL = (objectCacheSize*4)/5; -- don't fill too full ObjectCacheObjects: TYPE = ARRAY [0..objectCacheSize) OF NameSymbolTable.Object; ObjectCacheBodies: TYPE = ARRAY [0..objectCacheSize) OF StyleBody; InitObjectCacheInfo: PROC = { OPEN objectCacheInfo; objectCacheObjects _ NEW[ObjectCacheObjects]; objectCacheInputs _ NEW[ObjectCacheBodies]; objectCacheResults _ NEW[ObjectCacheBodies] }; FlushObjectCache: ENTRY PROC [init: BOOLEAN _ FALSE] = { ENABLE UNWIND => NULL; ClearObjectCache[] }; ClearObjectCache: PROC [init: BOOLEAN _ FALSE] = { OPEN objectCacheInfo; IF ~init AND objectCacheCount = 0 THEN RETURN; objectCacheCount _ 0; FOR i: CARDINAL IN [0..objectCacheSize) DO objectCacheObjects[i] _ nullObject; ENDLOOP }; FlushCaches: PUBLIC ENTRY PROC = { ENABLE UNWIND => NULL; ClearCaches[FALSE] }; ClearCaches: PROC [init: BOOLEAN] = { ClearApplyAllCache[init]; ClearRuleCache[init]; ClearLooksCache[init]; ClearObjectCache[init] }; executingName: PUBLIC Name; ExecuteName: PROC [frame: Frame, name: Name] RETURNS [ok: BOOLEAN] = TRUSTED { initDepth: CARDINAL _ JaMOps.CountStack[frame.opstk]; finalDepth: CARDINAL; nameObj: Object; [ok, ] _ JaMOps.TryToLoad[frame, nameObj _ NameToObject[name]]; IF ~ok THEN RETURN; executingName _ name; JaMOps.Execute[frame, CVX[nameObj]]; executingName _ NameSymbolTable.nullName; IF (finalDepth _ JaMOps.CountStack[frame.opstk]) # initDepth THEN { PushText[frame, "failed to leave stack at same depth after execution."]; PushName[frame, name]; StyleError[frame, 2] }}; StyleError: PUBLIC PROC [frame: Frame, num: INTEGER] = TRUSTED { PushInteger[frame, num]; JaMOps.Execute[frame, CVX[NameToObject[styleerror]]] }; StyleNameForNode: PUBLIC PROC [path: TiogaNode.Path] RETURNS [name: Name] = { s: Ref _ Alloc[]; ApplyAll[s, path]; name _ GetStyleName[s]; Free[s] }; InitLookNames: PROC = TRUSTED { txt: STRING _ [6]; txt[0] _ 'l; txt[1] _ txt[2] _ 'o; txt[3] _ 'k; txt[4] _ '.; txt.length _ 6; FOR c: CHARACTER IN TiogaLooks.Look DO txt[5] _ c; lookNames[c] _ MakeName[LOOPHOLE[LONG[txt], REF READONLY TEXT]]; ENDLOOP}; StartApply: PUBLIC PROCEDURE = BEGIN changeSet: EditNotify.ChangeSet; frame: Frame _ NIL; frame _ JaMOps.defaultFrame; changeSet[ChangingProp] _ TRUE; changeSet[ChangingFormat] _ TRUE; changeSet[MovingNodes] _ TRUE; changeSet[MovingGroup] _ TRUE; changeSet[NodeNesting] _ TRUE; changeSet[InsertingNode] _ TRUE; EditNotify.AddNotifyProc[Notify, after, high, changeSet]; defaultStyle _ Create[]; defaultName _ MakeName["default"]; rootName _ MakeName["root"]; InitLookNames[]; InitApplyCacheRecord[]; InitRuleCacheInfo[]; InitLooksCacheInfo[]; InitObjectCacheInfo[]; ClearCaches[TRUE]; SetDefaultStyle["Cedar"]; END; END. ~NodeStyleApplyImpl.Mesa written by Bill Paxton, January 1981 Last changed by Paxton, JuneAugust 2, 1983 10:11 am Last Edited by: Maxwell, January 6, 1983 9:50 am Apply operations when clearing, go all the way to applyCacheSize rather than stopping at applyCacheDepth Search for paths that end with this node and remove them. if change invalidates one node only, remove that node else clear entire cache called after the edit has taken place ***** Execute makes sure that same stack depth after execute ***** Miscellaneous does an ApplyAll and then returns the style name Initialization names are "look.a", "look.b", "look.c", etc. Êü˜Jšœ™Jšœ$™$Jšœ3™3J™0J˜šÏk ˜ J˜J˜ J˜J˜ J˜ Jšœ ˜ Jšœ˜Jšœ ˜ J˜ J˜ J˜J˜J˜J˜—šœ ˜!Jšœ`˜gJšœ˜#—Jš˜Jšœ˜J˜Jšœ™J˜JšœœÏc3˜MJ˜J˜šÏnœœœ=˜RJ˜#J˜—šŸ œœ1œ œ˜^Jšœœ˜Jšœ˜J˜ Jšœ œœœ˜;J˜6Jšœœœ ˜Jšœ#˜#Jšœœœ œ ˜BJ˜&J˜#J˜'Jšœ ˜J˜—Jšœœœ˜=šœœœ˜!Jšœœž˜2Jšœœ˜)Jšœœ˜%Jšœ3œ˜=—Jšœœž ˜>Jšœœœœ˜DJšœœœœ ˜BJ˜šŸœœœ˜3Jšœœ˜+Jšœœ˜)J˜—šŸœœœ˜CJ˜—š Ÿœ œœœœ˜AJšœœœ˜J˜J˜—šŸœœœœ˜AJšœœ#˜-JšœW™WJš œœœœ œ˜PJ˜J˜—šŸœ œœ˜HJ™9Jšœ˜Jšœœœ˜Jšœœ#˜-šœœœœ˜*šœœž˜2šœœœ˜(Jšœœ˜'—Jšœœ˜—Jšœ˜ —J˜—šŸœœœ0˜OJšœ œ œœ˜BJšœœœ˜J˜ Jšœœ#˜-Jšœœž1˜MJ˜&š œœ œœ˜4šœœ"˜>Jšœ#œž ˜5J˜"J˜&J˜Jšœœ˜—Jšœ˜—Jšœœ˜J˜—šŸœœœ)œ˜VJšœ˜Jšœœœ˜Jšœœ#˜-Jšœœœ˜'Jšœ˜J˜ Jš œœœœ œ˜VJ˜J˜—Jšœ œ˜*Jšœ œ˜,J˜š Ÿœœ œœœ˜AJšœ5™5Jšœ™J™%š Ÿœœœœœ˜FJšœœ˜#Jšœ2œœœ˜GJšœ5œœœ˜JJšœœ˜—šŸœœœ˜.Jšœœ˜0Jšœ%˜)—Jšœ œ˜Jšœœœ˜CJ˜/šœœž˜J˜šŸœœœ˜/Jšœœ˜%Jšœœ˜'Jšœœ˜*J˜—š Ÿœœœœœ˜6Jšœœœ˜J˜J˜—š Ÿœœœœœ˜DJšœœ!˜+Jšœœœœ˜,J˜šœœœ˜(Jšœ%œ˜/—J˜—šŸœœ œœ˜-Jšœœœœœœœœ˜Mšœœ˜šœœ˜!šœœœ˜0šœ˜šœ˜Jšœœ˜$J˜——————šŸ œœœ7˜NJšœ˜Jšœœœœœœœœ˜MJšœœ#˜+Jšœœ%˜0Jšœœ˜J˜Jšœœ˜J˜J˜š Ÿœœœœœ˜2Jšœœœ˜J˜&šœž˜šœ ˜šœ œœ˜%J˜J˜"Jšœœ˜—Jšœœœž˜@Jšœ˜—šœ˜Jš œœœœœ˜;Jšœ œœ˜Jšœ˜—Jšœ˜ J˜——šŸœœœ˜Jšœœœ˜Jšœ!œ˜:J˜šœž˜šœ ˜Jšœ œœœž˜@Jšœœž˜6Jšœ˜—šœ˜Jšœœœœž ˜@Jšœ œž ˜Jšœ˜—Jšœ˜—J˜J˜J˜J˜&—J˜Jšœœœ˜*šœ˜šœœ(˜7šœœ(˜7šœœ(˜7Jšœ œ˜ ————Jšœœœ˜"J˜9Jšœž%˜3šœ œœ˜&Jšœ œ&˜6Jšœ˜—Jšœ+œ˜/J˜J˜—Jšœœœ˜Ešœœœ˜%Jšœœ˜Jšœœ˜%Jšœœ˜'Jšœœ˜(Jšœ"œ˜,—Jšœœž˜8Jšœœž˜FJšœœœœ˜FJšœœœœ ˜@J˜šŸœœœ˜1Jšœœ˜'Jšœœ˜)Jšœœ˜,J˜—Jšœ œœ˜*J˜š Ÿœœœœœ˜7Jšœœœ˜J˜J˜—š Ÿœœœœœ˜FJšœœœœ˜-J˜šœœœ˜)Jšœ)œ˜3—J˜—J˜BJ˜šŸ œœœG˜_Jšœ˜Jšœœœœœœœœ˜MJšœ œ)˜5Jšœœ'˜2J˜Jšœœ˜Jšœœ˜ Jšœœ ˜Jšœœ˜J˜J˜š Ÿœœœœœ˜3Jšœœœ˜J˜(šœž˜šœ˜šœ œœ˜&J˜J˜$Jšœœ˜—Jšœœœž˜8Jšœ˜—šœ˜Jš œœœœœ˜