DIRECTORY ImagerDither, Process, Real, RealFns, Xl, XlColorAccess, XlRGBColorMaps, XlPredefinedAtoms; XlColorAccessImpl: CEDAR MONITOR IMPORTS Process, Real, RealFns, Xl, XlRGBColorMaps EXPORTS XlColorAccess = BEGIN OPEN XlColorAccess; myKey: REF = NEW[INT]; --property key used on screen FindVisualType: PUBLIC PROC [screen: Xl.Screen, depth: BYTE, class: Xl.VisualClass] RETURNS [Xl.VisualType ฌ NIL] = { FOR dl: Xl.ScreenDepthL ฌ screen.screenDepthL, dl.rest WHILE dl#NIL DO IF dl.first.depth=depth THEN { FOR vtl: LIST OF READONLY Xl.VisualType ฌ dl.first.visuals, vtl.rest WHILE vtl#NIL DO IF vtl.first.class=class THEN RETURN [vtl.first]; ENDLOOP; RETURN; }; ENDLOOP; }; RealColorValToXColorVal: PUBLIC PROC [r: REAL, invGamma: REAL ฌ 0.4545454] RETURNS [v: Xl.RGBVal] = { GCorrect: PROC [r: REAL, invGamma: REAL] RETURNS [REAL] = INLINE { RETURN [RealFns.Power[r, invGamma]]; }; s: INT ~ Real.Round[GCorrect[r, invGamma]*65535.0]; SELECT s FROM <= 0 => v ฌ 0; >= 65535 => v ฌ 65535; ENDCASE => v ฌ s; }; DeGCorrect: PROC [r: REAL, gamma: REAL ฌ 2.2] RETURNS [REAL] = INLINE { RETURN [RealFns.Power[r, gamma]]; }; Idx2Byte: PUBLIC PROC [val, max: CARD, gamma: REAL ฌ 2.2] RETURNS [BYTE] = { float: REAL ฌ val; float ฌ float / max; float ฌ DeGCorrect[float, gamma]; RETURN [ToByte[float]]; }; detailsForSynchronous: Xl.Details ฌ NEW[Xl.DetailsRec ฌ [synchronous: TRUE]]; ToByte: PROC [r: REAL] RETURNS [BYTE] = { s: INT = Real.Round[r*255]; SELECT s FROM <= 0 => RETURN [0]; >= 255 => RETURN [255]; ENDCASE; RETURN [s]; }; RampColors: PROC [eachColor: PROC [r, g, b: REAL], reds: NAT ฌ 5, greens: NAT ฌ 6, blues: NAT ฌ 4] = { limit: NAT ฌ reds*greens*blues-1; ColorAndInverted: PROC [r, g, b: REAL] ~ INLINE { eachColor[r, g, b]; eachColor[1.0-r, 1.0-g, 1.0-b]; }; FOR b: NAT IN [0..blues) DO FOR g: NAT IN [0..greens) DO FOR r: NAT IN [0..reds) DO a: NAT ~ (r*greens+g)*blues+b; IF a0 THEN --exclude black and white eachColor[r/(reds-1.0), g/(greens-1.0), b/(blues-1.0)]; ENDLOOP; ENDLOOP; ENDLOOP; ColorAndInverted[0.25, 0.25, 0.25]; -- quarter-grey eachColor[0.5, 0.5, 0.5]; -- half-grey ColorAndInverted[0.1, 0.3, 0.85]; -- Distinct/Blue }; TryWithStandardColorMap: PROC [screen: Xl.Screen, vt: Xl.VisualType, blackPixel, whitePixel: Xl.Pixel, gamma: REAL ฌ 2.2, invGamma: REAL ฌ 0.4545454] RETURNS [entries: ImagerDither.MapEntries ฌ NIL]= { SearchMaps: PROC [maps: LIST OF XlRGBColorMaps.StandardColorMap, vt: Xl.VisualType, mustMatch: Xl.ColorMap ฌ Xl.nullColorMap] RETURNS [XlRGBColorMaps.StandardColorMap ฌ NIL] = { FOR list: LIST OF XlRGBColorMaps.StandardColorMap ฌ maps, list.rest WHILE list#NIL DO IF list.first.visualId=vt.visual THEN { IF mustMatch=Xl.nullColorMap OR mustMatch=list.first.colormap THEN RETURN [list.first] }; ENDLOOP }; TryMap: PROC [mapKey: Xl.XAtom] RETURNS [map: XlRGBColorMaps.StandardColorMap ฌ NIL] = { maps: LIST OF XlRGBColorMaps.StandardColorMap ฌ XlRGBColorMaps.GetRGBColorMaps[c: screen.connection, w: screen.root, mapKey: mapKey]; map ฌ SearchMaps[maps, vt, screen.defaultColorMap]; <> }; colorMapSize: CARD ฌ MIN[vt.colorMapEntries, 256]; map: XlRGBColorMaps.StandardColorMap ฌ NIL; map ฌ TryMap[XlPredefinedAtoms.rgbDefaultMap]; IF map=NIL THEN map ฌ TryMap[XlPredefinedAtoms.rgbBestMap]; IF map#NIL THEN { addingFailed: BOOL ฌ FALSE; TryAdding: PROC [r, g, b: REAL] = { IF ~addingFailed THEN { rgb: Xl.RGBRec; pixel: CARD32; rgb.red ฌ RealColorValToXColorVal[r, invGamma]; rgb.green ฌ RealColorValToXColorVal[g, invGamma]; rgb.blue ฌ RealColorValToXColorVal[b, invGamma]; pixel ฌ Xl.AllocColor[c: screen.connection, colorMap: map.colormap, color: rgb ! Xl.XError => GOTO Oops].pixel; IF pixel {addingFailed ฌ TRUE} }; FOR b: NAT IN [0..map.blueMax] DO FOR g: NAT IN [0..map.greenMax] DO FOR r: NAT IN [0..map.redMax] DO pixel: CARD ฌ (r*map.redMult + g*map.greenMult + b*map.blueMult + map.basePixel) MOD 256; IF pixel { pixelsToFree: LIST OF CARD32 ฌ NIL; WHILE entries#NIL DO IF entries.first.mapIndex#blackPixel AND entries.first.mapIndex#whitePixel THEN pixelsToFree ฌ CONS[entries.first.mapIndex, pixelsToFree]; entries ฌ entries.rest ENDLOOP; Xl.FreeColors[c, colorMap, pixelsToFree, 0, detailsForSynchronous ! Xl.XError => CONTINUE]; Xl.UngrabServer[c ! Xl.XError => CONTINUE]; GOTO oops; }; EachColor: PROC [r, g, b: REAL] ~ { rgb: Xl.RGBRec; pixel: CARD32; rgb.red ฌ RealColorValToXColorVal[r, invGamma]; rgb.green ฌ RealColorValToXColorVal[g, invGamma]; rgb.blue ฌ RealColorValToXColorVal[b, invGamma]; pixel ฌ Xl.AllocColor[c: c, colorMap: colorMap, color: rgb].pixel; --may raise Xl.XError which is caught IF pixel<=255 THEN entries ฌ CONS[[pixel, ToByte[r], ToByte[g], ToByte[b]], entries]; }; Xl.GrabServer[c]; RampColors[EachColor, reds, greens, blues]; Xl.UngrabServer[c]; entries ฌ CONS[[blackPixel, 0, 0, 0], entries]; entries ฌ CONS[[whitePixel, 255, 255, 255], entries]; END; RETURN [entries]; EXITS oops => RETURN [NIL]; }; AllocateForNewColormap: PROC [c: Xl.Connection, colorMap: Xl.ColorMap, blackPixel, whitePixel: Xl.Pixel, invGamma: REAL, reds: NAT ฌ 5, greens: NAT ฌ 6, blues: NAT ฌ 4, pixelCount: CARD32 ฌ 256] RETURNS [ImagerDither.MapEntries] = { entries: ImagerDither.MapEntries ฌ NIL; storeColorItems: LIST OF Xl.ColorItem ฌ NIL; nextFreePixel: NAT ฌ 0; --private to NextPixel NextPixel: PROC [] RETURNS [this: NAT] = { this ฌ nextFreePixel; WHILE (this=blackPixel OR this=whitePixel) DO this ฌ this+1 ENDLOOP; nextFreePixel ฌ this+1; }; EachColor: PROC [r, g, b: REAL] ~ { rgb: Xl.RGBRec; pixel: CARD32 ฌ NextPixel[]; IF pixel GOTO finished].pixels; IF pixels#NIL THEN { FOR k: NAT IN [0..pixels.leng) DO lastAlloc ฌ pixels[k]; used[lastAlloc] ฌ TRUE; IF HasOpponent[lastAlloc] THEN found ฌ TRUE; ENDLOOP; }; IF found THEN EXIT; ENDLOOP; EXITS finished => {}; }; ReturnEm: PROC [] = { pixelsToFree: LIST OF CARD32 ฌ NIL; used[blackPixel] ฌ FALSE; used[whitePixel] ฌ FALSE; used[screen.blackPixel] ฌ FALSE; used[screen.whitePixel] ฌ FALSE; FOR i: NAT IN [0..255] DO IF used[i] THEN pixelsToFree ฌ CONS[i, pixelsToFree]; ENDLOOP; IF pixelsToFree#NIL THEN Xl.FreeColors[c, colormap, pixelsToFree, 0]; Xl.UngrabServer[c]; }; blackPixel ฌ screen.blackPixel; used[blackPixel] ฌ TRUE; whitePixel ฌ screen.whitePixel; used[whitePixel] ฌ TRUE; IF HasOpponent[blackPixel] THEN RETURN [blackPixel, whitePixel]; GrabEm[]; IF found AND lastAlloc blackPixel ฌ lastAlloc; Opponent[lastAlloc]=screen.blackPixel => whitePixel ฌ lastAlloc; ENDCASE => {whitePixel ฌ lastAlloc; blackPixel ฌ Opponent[lastAlloc]}; }; }; ReturnEm[]; IF blackPixel#screen.blackPixel THEN Xl.StoreColors[c, colormap, LIST[[blackPixel, TRUE, TRUE, TRUE, [0, 0, 0]]]]; IF whitePixel#screen.whitePixel THEN Xl.StoreColors[c, colormap, LIST[[whitePixel, TRUE, TRUE, TRUE, [65535, 65535, 65535]]]]; }; Access: PUBLIC PROC [screen: Xl.Screen, depth: BYTE, class: Xl.VisualClass] RETURNS [cd: ColorData _ NIL] = { Action: TYPE = {use, wait, define}; Protected: ENTRY PROC [vt: Xl.VisualType] RETURNS [Action] = { WITH Xl.GetVisualTypeProp[vt, myKey] SELECT FROM d: ColorData => {cd _ d; RETURN [use]}; a: ATOM => RETURN [wait]; ENDCASE => { Xl.PutVisualTypeProp[vt, myKey, $makingProgress]; RETURN [define]; }; }; a: Action; vt: Xl.VisualType ~ FindVisualType[screen, depth, class]; IF vt=NIL THEN RETURN [NIL]; a ฌ Protected[vt]; IF a=wait THEN { FOR i: INT ฌ 0, i+1 WHILE i<50 AND a=wait DO Process.PauseMsec[100]; a ฌ Protected[vt]; ENDLOOP; }; SELECT a FROM use => { RETURN [cd]; }; define => { cd _ ColorDataInit[screen, vt]; RETURN [cd]; }; wait => { cd _ ColorDataInit[screen, vt]; RETURN [cd]; }; ENDCASE => ERROR; }; NewCD: PROC [screen: Xl.Screen] RETURNS [REF ColorDataRec] = { cd: REF ColorDataRec ~ NEW[ColorDataRec]; cd.hasColors ฌ cd.hasPrivateColormap ฌ FALSE; cd.colormap ฌ screen.defaultColorMap; cd.pseudoBlackPixel ฌ screen.blackPixel; cd.pseudoWhitePixel ฌ screen.whitePixel; RETURN [cd]; }; ColorDataInit: PROC [screen: Xl.Screen, vt: Xl.VisualType] RETURNS [cd: REF ColorDataRec] = { cd _ NewCD[screen]; IF vt#NIL THEN { invGamma: REAL ฌ 0.4545454; gamma: REAL ฌ 2.2; cd.hasPrivateColormap ฌ FALSE; [cd.pseudoBlackPixel, cd.pseudoWhitePixel] ฌ FindBlackAndWhite[screen, vt]; cd.entries ฌ TryWithStandardColorMap[screen, vt, cd.pseudoBlackPixel, cd.pseudoWhitePixel, gamma, invGamma]; IF cd.entries=NIL THEN { SELECT TRUE FROM vt.colorMapEntries>255 => { cd.entries ฌ AllocateForDefaultColormap[screen.connection, cd.colormap, cd.pseudoBlackPixel, cd.pseudoWhitePixel, invGamma, 5, 6, 4]; IF cd.entries=NIL THEN { cd.entries ฌ AllocateForDefaultColormap[screen.connection, cd.colormap, cd.pseudoBlackPixel, cd.pseudoWhitePixel, invGamma, 4, 5, 4]; IF cd.entries=NIL THEN { cd.entries ฌ AllocateForDefaultColormap[screen.connection, cd.colormap, cd.pseudoBlackPixel, cd.pseudoWhitePixel, invGamma, 4, 4, 4]; IF cd.entries=NIL THEN { cd.entries ฌ AllocateForDefaultColormap[screen.connection, cd.colormap, cd.pseudoBlackPixel, cd.pseudoWhitePixel, invGamma, 4, 4, 3]; IF cd.entries=NIL THEN { cd.hasPrivateColormap ฌ TRUE; cd.colormap ฌ Xl.CreateColorMap[c: screen.connection, visual: vt.visual, window: screen.root, allocAll: TRUE]; cd.entries ฌ AllocateForNewColormap[screen.connection, cd.colormap, cd.pseudoBlackPixel, cd.pseudoWhitePixel, invGamma, 5, 6, 4, vt.colorMapEntries]; }; }; }; }; }; vt.colorMapEntries>15 => { cd.entries ฌ AllocateForDefaultColormap[screen.connection, cd.colormap, cd.pseudoBlackPixel, cd.pseudoWhitePixel, invGamma, 2, 3, 2]; IF cd.entries=NIL THEN { cd.entries ฌ AllocateForDefaultColormap[screen.connection, cd.colormap, cd.pseudoBlackPixel, cd.pseudoWhitePixel, invGamma, 2, 2, 2]; IF cd.entries=NIL THEN { cd.hasPrivateColormap ฌ TRUE; cd.colormap ฌ Xl.CreateColorMap[c: screen.connection, visual: vt.visual, window: screen.root, allocAll: TRUE]; cd.entries ฌ AllocateForNewColormap[screen.connection, cd.colormap, cd.pseudoBlackPixel, cd.pseudoWhitePixel, invGamma, 2, 3, 2, vt.colorMapEntries]; }; }; }; ENDCASE => { cd.hasColors ฌ FALSE; Xl.PutScreenProp[screen, myKey, cd]; RETURN }; }; cd.hasColors ฌ TRUE; }; Xl.PutScreenProp[screen, myKey, cd]; }; END.  XlColorAccessImpl.mesa Copyright ำ 1990, 1991, 1993 by Xerox Corporation. All rights reserved. Created by Christian Jacobi, December 5, 1990 11:38:48 am PST Christian Jacobi, October 25, 1993 12:08 pm PDT has black and white excluded --Regular colors --Special colors Tries whether a "standard" color map is defined. If so uses it. Might add a few entries to the color map Tries to add a particular color to the color map; noop if failes Tries to allocate colors into default color map; retrurns entries, or NIL if failed --Free the colors again; there was no space. Make sure no entries are returned --returns next pixel, but leaves blackPixel and whitePixel alone --For black and white reuse same pixel values as in the default color map to hide fact of exchanging color maps Finds and allocates suitable pixel for blackPixel, whitePixel; suitable means ImagerBackdoor.invert is implemented correctly. --Accesses the data sort of atomically; calls creation if necessary. --timed out --Actually creates the data vt.colorMapEntries>3 => { }; ส!๒•NewlineDelimiter –(cedarcode) style˜™Icodešœ ฯeœ<™HKšœ=™=K™/K™—šฯk ˜ K˜[—K˜šฯnœžœž˜ Kšžœ+˜2Kšžœ˜—Kšžœžœ˜K˜Kšœžœžœžœฯc˜4K˜š Ÿœžœžœžœžœžœ˜ušžœ4žœžœž˜Fšžœžœ˜š žœžœžœžœ,žœžœž˜UKšžœžœžœ ˜1Kšžœ˜—Kšžœ˜K˜—Kšžœ˜—Kšœ˜K˜—š Ÿœžœžœžœ žœžœ˜ešŸœžœžœ žœžœžœžœ˜BKšžœ˜$K˜—Kšœžœ-˜3šžœž˜ Kšœ˜Kšœ˜Kšžœ ˜—K˜K˜—šŸ œžœžœ žœžœžœžœ˜GKšžœ˜!K˜K˜—šŸœžœžœ žœžœžœžœ˜LJšœžœ˜J˜J˜!Kšžœ˜K˜K˜—Kšœ$žœžœ˜MK˜š Ÿœžœžœžœžœ˜)Kšœžœ˜šžœž˜ Kšœžœ˜Kšœ žœ˜Kšžœ˜—Kšžœ˜ K˜K˜—• CharPropsึ#Postfix0.0 1.0 1.0 textColorPostfix0.333 1.0 1.0 textColorPostfix0.667 1.0 1.0 textColor Postfix0.0 1.0 1.0 textColorPostfix0.333 1.0 1.0 textColorPostfix0.667 1.0 1.0 textColoršŸ œžœ žœฯbœกœกœžœกะbkกœกขกœกขกœ˜fKšœ™K–l Postfix0.0 1.0 1.0 textColorPostfix0.333 1.0 1.0 textColorPostfix0.667 1.0 1.0 textColorš œžœกœกœกœ˜!–lPostfix0.0 1.0 1.0 textColorPostfix0.333 1.0 1.0 textColorPostfix0.667 1.0 1.0 textColoršŸœžœกœกœกœžœžœ˜1K–l Postfix0.0 1.0 1.0 textColorPostfix0.333 1.0 1.0 textColorPostfix0.667 1.0 1.0 textColoršœ กœกœกœ˜K–l Postfix0.0 1.0 1.0 textColorPostfix0.333 1.0 1.0 textColorPostfix0.667 1.0 1.0 textColoršœ กœกœกœ˜Kšœ˜—Kšœ™–JPostfix0.667 1.0 1.0 textColor Postfix0.667 1.0 1.0 textColorš žœกœžœžœกœž˜–JPostfix0.333 1.0 1.0 textColor Postfix0.333 1.0 1.0 textColorš žœกœžœžœกœž˜–FPostfix0.0 1.0 1.0 textColor Postfix0.0 1.0 1.0 textColorš žœกœžœžœกœž˜K–ด Postfix0.0 1.0 1.0 textColorPostfix0.333 1.0 1.0 textColorPostfix0.333 1.0 1.0 textColorPostfix0.667 1.0 1.0 textColorPostfix0.667 1.0 1.0 textColorš œžœกœกœกœกœกœ˜šžœ žœžœ ˜1K–l Postfix0.0 1.0 1.0 textColorPostfix0.333 1.0 1.0 textColor Postfix0.667 1.0 1.0 textColoršœ ก œกœก œ˜7—Kšžœ˜—Kšžœ˜—Kšžœ˜—Kšœ™K–lPostfix0.0 1.0 1.0 textColorPostfix0.333 1.0 1.0 textColorPostfix0.667 1.0 1.0 textColoršœ$ ˜3K–l Postfix0.0 1.0 1.0 textColorPostfix0.333 1.0 1.0 textColorPostfix0.667 1.0 1.0 textColoršœ  ˜*K–lPostfix0.0 1.0 1.0 textColorPostfix0.333 1.0 1.0 textColorPostfix0.667 1.0 1.0 textColoršœ& ˜6K˜—K˜š ŸœžœQžœžœžœ%žœ˜ษK™@K™(š Ÿ œžœžœžœ_žœ$žœ˜ฑš žœžœžœ3žœžœž˜Ušžœžœ˜'šžœžœžœ˜CKšžœ ˜—K˜—Jšž˜—J˜—šŸœžœžœ)žœ˜XKšœžœžœy˜†Kšœ7ฯiuœ˜ฎK˜—Kšœžœžœ˜3Kšœ'žœ˜+K˜.Kšžœžœžœ,˜;šžœžœžœ˜Kšœžœžœ˜–lPostfix0.0 1.0 1.0 textColorPostfix0.333 1.0 1.0 textColorPostfix0.667 1.0 1.0 textColor š Ÿ œžœกœกœกœžœ˜#K™Ašžœžœ˜Kšœžœ˜K–FPostfix0.0 1.0 1.0 textColorPostfix0.0 1.0 1.0 textColor ˜0K–JPostfix0.333 1.0 1.0 textColorPostfix0.333 1.0 1.0 textColor ˜2K–JPostfix0.667 1.0 1.0 textColorPostfix0.667 1.0 1.0 textColor ˜0Kšœ^žœ ˜ošžœžœ˜šžœ.žœž˜?Kšžœžœžœ ˜EKšžœ˜—K–l Postfix0.0 1.0 1.0 textColor Postfix0.333 1.0 1.0 textColor Postfix0.667 1.0 1.0 textColor š œ žœ ก œก œก œ ˜BK˜—K˜—Kšžœžœ˜#K˜—–&Postfix0.667 1.0 1.0 textColoršžœžœžœž˜!šžœžœžœž˜"–$Postfix0.0 1.0 1.0 textColoršžœžœžœž˜ KšœžœFžœ˜Yšžœžœ˜Kšœžœ"˜+Kšœžœ$˜/Kšœžœ#˜-Kšœ žœ%˜3K˜—Kšžœ˜—Kšžœ˜—Kšžœ˜—Kšœ žœ!˜/Kšœ žœ'˜5Kšœ ;˜UK–l Postfix0.0 1.0 1.0 textColorPostfix0.333 1.0 1.0 textColorPostfix0.667 1.0 1.0 textColoršœ ˜.Kšœ ˜#Kšœ ˜ Kšœ ˜#K˜—K˜—K˜–l|Postfix0.0 1.0 1.0 textColorPostfix0.333 1.0 1.0 textColorPostfix0.667 1.0 1.0 textColor'šŸœžœWžœกขกœกขกœกขกœžœ˜าK™TKšœ#žœ˜'šž˜šžœ˜KšœN™NKš œžœžœžœžœ˜#šžœ žœžœ˜šžœ#žœ#žœ˜PKšœžœ(˜;—K˜Kšžœ˜—KšœQžœ˜[Kšœ!žœ˜+Kšžœ˜ K˜—–lPostfix0.0 1.0 1.0 textColorPostfix0.333 1.0 1.0 textColorPostfix0.667 1.0 1.0 textColor š Ÿ œžœกœกœกœžœ˜#Kšœžœ˜K–FPostfix0.0 1.0 1.0 textColorPostfix0.0 1.0 1.0 textColor šœกœกœ ˜0K–JPostfix0.333 1.0 1.0 textColorPostfix0.333 1.0 1.0 textColor šœกœกœ ˜2K–JPostfix0.667 1.0 1.0 textColorPostfix0.667 1.0 1.0 textColor šœกœกœ ˜0KšœCะbc% ˜iK–l* Postfix0.0 1.0 1.0 textColor Postfix0.333 1.0 1.0 textColor Postfix0.667 1.0 1.0 textColor š žœ žœ žœ ก œก œก œ ˜UKšœ˜—K˜K–lPostfix0.0 1.0 1.0 textColorPostfix0.333 1.0 1.0 textColorPostfix0.667 1.0 1.0 textColoršœกœกœกœ˜+Kšœ˜Kšœ žœ!˜/Kšœ žœ'˜5Kšžœ˜—Kšžœ ˜Kšžœ žœžœ˜Kšœ˜K˜—–lxPostfix0.0 1.0 1.0 textColorPostfix0.333 1.0 1.0 textColorPostfix0.667 1.0 1.0 textColorAšŸœžœWžœกขกœกขกœกขกœžœžœ˜่Kšœ#žœ˜'Kšœžœžœžœ˜,Kšœžœ ˜.šŸ œžœžœžœ˜*Kšœ@™@Kšœ˜Kšžœžœžœžœ˜DKšœ˜Kšœ˜—–lPostfix0.0 1.0 1.0 textColorPostfix0.333 1.0 1.0 textColorPostfix0.667 1.0 1.0 textColor š Ÿ œžœกœกœกœžœ˜#K˜Kšœžœ˜šžœžœ˜K–FPostfix0.0 1.0 1.0 textColorPostfix0.0 1.0 1.0 textColor šœกœกœ ˜0K–JPostfix0.333 1.0 1.0 textColorPostfix0.333 1.0 1.0 textColor šœกœกœ ˜2K–JPostfix0.667 1.0 1.0 textColorPostfix0.667 1.0 1.0 textColor šœกœกœ ˜0K–l&Postfix0.0 1.0 1.0 textColorPostfix0.333 1.0 1.0 textColorPostfix0.667 1.0 1.0 textColor$šœžœกœžœกœžœกœžœ˜lK–l Postfix0.0 1.0 1.0 textColor Postfix0.333 1.0 1.0 textColor Postfix0.667 1.0 1.0 textColor š œ žœ ก œก œก œ ˜BK˜—Kšœ˜—K–lPostfix0.0 1.0 1.0 textColorPostfix0.333 1.0 1.0 textColorPostfix0.667 1.0 1.0 textColoršœกœกœกœ˜+šž˜Kšœo™oKšœ-žœ žœ žœ˜lKšœ-žœ žœ žœ˜`Kšœžœ˜+Kšœžœ˜+Kšžœ˜—Kšœ žœ!˜/Kšœ žœ'˜5K˜AKšžœ ˜Kšœ˜K˜—šŸœžœ(žœ'˜mK™~š Ÿœžœžœžœžœ˜7Kšžœ˜K˜—š Ÿ œžœžœžœžœ˜:Kšžœ˜K˜—Kšœžœžœ˜3K˜/K˜%Kš œžœžœ žœžœžœžœ˜1Kšœ žœžœžœ˜!Kšœžœžœ˜šŸœžœ˜K˜šžœžœžœž˜"Kšœžœ˜Kšœ/žœžœ˜Zšžœžœžœ˜šžœžœžœž˜!Kšœ˜Kšœžœ˜Kšžœžœ žœ˜,Kšžœ˜—K˜—Kšžœžœžœ˜Kšžœ˜—Kšžœ˜Kšœ˜—šŸœžœ˜Kš œžœžœžœžœ˜#Kšœžœ˜Kšœžœ˜Kšœžœ˜ Kšœžœ˜ šžœžœžœ ž˜Kšžœ žœžœ˜5Kšžœ˜—Kšžœžœžœ-˜EKšœ˜Kšœ˜—Kšœ3žœ˜8Kšœ3žœ˜8Kšžœžœžœ˜@Kšœ ˜ šžœžœžœ˜*šžœžœ 8˜Xšžœžœž˜Kšœ@˜@Kšœ@˜@Kšžœ@˜G—K˜—K˜—K˜ šžœžœ˜%Kš œžœžœžœžœ˜M—šžœž˜$Kš œžœžœžœžœ˜Y—Kšœ˜—K˜š Ÿœžœžœžœžœžœ˜mK™DKšœžœ˜#šŸ œžœžœžœ ˜>šžœ!žœž˜0Kšœžœ˜'Kšœžœžœ˜šžœ˜ K˜1Kšžœ ˜Kšœ˜——K˜—Kšœ ˜ K˜9Kš žœžœžœžœžœ˜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šœ˜šžœžœžœ˜Kšœ žœ ˜Kšœžœ˜Kšœžœ˜K˜KK˜lšžœ žœžœ˜šžœ˜˜K–l{Postfix0.0 1.0 1.0 textColorPostfix0.333 1.0 1.0 textColorPostfix0.667 1.0 1.0 textColoršœ|กœกœกœ˜…šžœ žœžœ˜K–l{Postfix0.0 1.0 1.0 textColorPostfix0.333 1.0 1.0 textColorPostfix0.667 1.0 1.0 textColoršœ|กœกœกœ˜…šžœ žœžœ˜K–l{Postfix0.0 1.0 1.0 textColorPostfix0.333 1.0 1.0 textColorPostfix0.667 1.0 1.0 textColoršœ|กœกœกœ˜…šžœ žœžœ˜K–l{Postfix0.0 1.0 1.0 textColorPostfix0.333 1.0 1.0 textColorPostfix0.667 1.0 1.0 textColoršœ|กœกœกœ˜…šžœ žœžœ˜Kšœžœ˜Kšœhžœ˜nK–lwPostfix0.0 1.0 1.0 textColorPostfix0.333 1.0 1.0 textColorPostfix0.667 1.0 1.0 textColoršœxกœกœกœ˜•K˜—K˜—K˜—K˜—K˜—˜K–${Postfix0.0 1.0 1.0 textColor ˜…šžœ žœžœ˜K–${Postfix0.0 1.0 1.0 textColor ˜…šžœ žœžœ˜Kšœžœ˜Kšœhžœ˜nK–$wPostfix0.0 1.0 1.0 textColor˜•K˜—K˜—K˜—™K™—šžœ˜ Kšœžœ˜K˜%Kšž˜K˜——K˜—Kšœžœ˜Kšœ˜—Kšœ$˜$Kšœ˜K˜—Kšžœ˜K˜—…—36YH