################################################################## # ## Experimental Funk Jimmy Haze 01-2004 # ################################################################## """ _'Experimental Funk' is a script i made for my own use (and for you) for easy experimenting with funky formulae. _ In this version are nine (9) preset's to play with. _ Most functions are copied from the following scripts : _ Potatoide ( look at JMS website for potatoide stuff ) _ Load/Save from Twistgen.py ( Zaug ) _ UV-Torus.py """ ################################################################## #///////////////////////////////////////////////////////////////// ################################################################## # Set path to default directory ###============================================================= defaultdir = "c:/blender/Jim script/Funkysettings/funk 01.txt" ###============================================================= # Start script= Alt-P ################################################################## #\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ################################################################## import Blender from Blender import * from Blender.Draw import * from Blender.BGL import * from math import * from whrandom import * ################## # file save/load ################################################ ##################/////////////////////////////////////////////// # curversion = 0 filename = Create(defaultdir) message = "" # ### def writeln(f,x): f.write(str(x)) f.write("\n") def readint(f): return int(f.readline()) def readfloat(f): return float(f.readline()) def readstr(f): s = (f.readline()) return s[0:len(s)-1] # ### def do_file(save): fname = filename.val global filename, message global xstring, ystring, zstring global si1, co2, co1, si2,co3, si3 global uA, uB, uC, uD, uE, uF, uG, uH global iresol, jresol, imi, ima, jmi, jma # if save: message = "funk saved." else: message = "funk loaded." if save: try: f = open(fname,'w') except: message = "unable to save file." return else: try: f = open(fname,'r') except: message = "file not found." return if save: writeln(f,curversion) else: version = readint(f) if version != curversion: message = "wrong file version" ### if save: writeln(f,iresol.val) else: iresol.val = readint(f) if save: writeln(f,jresol.val) else: jresol.val = readint(f) # if save: writeln(f,imi.val) else: imi.val = readfloat(f) if save: writeln(f,ima.val) else: ima.val = readfloat(f) if save: writeln(f,jmi.val) else: jmi.val = readfloat(f) if save: writeln(f,jma.val) else: jma.val = readfloat(f) # if save: writeln(f,si1.val) else: si1.val = readstr(f) if save: writeln(f,co2.val) else: co2.val = readstr(f) if save: writeln(f,co1.val) else: co1.val = readstr(f) if save: writeln(f,si2.val) else: si2.val = readstr(f) if save: writeln(f,co3.val) else: co3.val = readstr(f) if save: writeln(f,si3.val) else: si3.val = readstr(f) if save: writeln(f,xstring.val) else: xstring.val = readstr(f) if save: writeln(f,ystring.val) else: ystring.val = readstr(f) if save: writeln(f,zstring.val) else: zstring.val = readstr(f) # if save: writeln(f,uA.val) else: uA.val = readfloat(f) if save: writeln(f,uB.val) else: uB.val = readfloat(f) if save: writeln(f,uC.val) else: uC.val = readfloat(f) if save: writeln(f,uD.val) else: uD.val = readfloat(f) if save: writeln(f,uE.val) else: uE.val = readfloat(f) if save: writeln(f,uF.val) else: uF.val = readfloat(f) if save: writeln(f,uG.val) else: uG.val = readfloat(f) if save: writeln(f,uH.val) else: uH.val = readfloat(f) # f.close() Register(draw,event,bevent) # ############################################################### # initialize #///////////////////////////////////////////////// ############## # mesh # # iresol = Create(16) jresol = Create(16) imi = Create(0.0) ima = Create(1.0) jmi = Create(0.0) jma = Create(1.0) # user strings # # si3 = Create("A*sin(B*i)") co3 = Create("j*s3") si1 = Create("sin(j*pi*2/(jres-1)) ") co2 = Create("cos(-pi/2+i*pi/(ires-1)) ") co1 = Create("cos(j*pi*2/(jres-1))") si2 = Create("sin(-pi/2+i*pi/(ires-1))") xstring = Create("s1*c2 ") ystring = Create("c1*c2 ") zstring = Create("s2 ") # user value's # # uA = Create(0.2) uB = Create(0.1) uC = Create(0.0) uD = Create(0.0) uE = Create(0) uF = Create(0) uG = Create(0) uH = Create(0) # toggle # # Pt = Create(0) St = Create(0) Tt = Create(0) tip = Create(0) smooth = Create(0) ################## #pre-settings ############################################### ##################////////////////////////////////////////////// # Plane # def plane(): global xstring, ystring, zstring global si1, co2, co1, si2,co3, si3 global uA, uB, uC, uD, uE, uF, uG, uH global iresol, jresol, imi, ima, jmi, jma # iresol = Create(16) jresol = Create(16) imi = Create(0.0) ima = Create(1.0) jmi = Create(0.0) jma = Create(1.0) co3 = Create("0.0") si3 = Create("0.0") si1 = Create("i-ires/2") co2 = Create("j-jres/2") co1 = Create("0.0") si2 = Create("0.0") xstring = Create("A*s1") ystring = Create("B*c2") zstring = Create("0.25*random()") uA = Create(0.5) uB = Create(0.5) uC = Create(0.0) uD = Create(0.0) uE = Create(0) uF = Create(0) uG = Create(0) uH = Create(0) # ############ def pfunk1(): global xstring, ystring, zstring global si1, co2, co1, si2,co3, si3 global uA, uB, uC, uD, uE, uF, uG, uH global iresol, jresol, imi, ima, jmi, jma # iresol = Create(24) jresol = Create(24) imi = Create(0.0) ima = Create(1.0) jmi = Create(0.0) jma = Create(1.0) co3 = Create("0.0") si3 = Create("0.0") si1 = Create("0.0") co2 = Create("0.0") co1 = Create("sqrt((i-ires/2)**2+(j-jres/2)**2)") si2 = Create("sin(c1*A)*C*sqrt(c1*2.0)*exp(-c1/B)*C") xstring = Create("i-ires/2") ystring = Create("j-jres/2") zstring = Create("D*s2") uA = Create(2.0) uB = Create(2.0) uC = Create(2.0) uD = Create(1.0) uE = Create(0) uF = Create(0) uG = Create(0) uH = Create(0) # ############ def pfunk2(): global xstring, ystring, zstring global si1, co2, co1, si2,co3, si3 global uA, uB, uC, uD, uE, uF, uG, uH global iresol, jresol, imi, ima, jmi, jma # iresol = Create(24) jresol = Create(24) imi = Create(-6.0) ima = Create(0.5) jmi = Create(-6.0) jma = Create(0.5) co3 = Create("0.0") si3 = Create("0.0") si1 = Create("sin(i)*cos(j)") co2 = Create("0.0") co1 = Create("0.0") si2 = Create("0.0") xstring = Create("A*i+s1") ystring = Create("A*j") zstring = Create("B*s1") uA = Create(1.0) uB = Create(0.5) uC = Create(1.0) uD = Create(0.0) uE = Create(0) uF = Create(0) uG = Create(0) uH = Create(0) # ################## # Sphere (from Potatoide) # def sphere(): global xstring, ystring, zstring global si1, co2, co1, si2,co3, si3 global uA, uB, uC, uD, uE, uF, uG, uH global iresol, jresol, imi, ima, jmi, jma # iresol = Create(16) jresol = Create(16) imi = Create(0.0) ima = Create(1.0) jmi = Create(0.0) jma = Create(1.0) si3 = Create("0.0") co3 = Create("0.0") si1 = Create("sin(j*pi*2/(jres-1)) ") co2 = Create("cos(-pi/2+i*pi/(ires-1)) ") co1 = Create("cos(j*pi*2/(jres-1))") si2 = Create("sin(-pi/2+i*pi/(ires-1))") xstring = Create("s1*c2") ystring = Create("c1*c2") zstring = Create("s2") uA = Create(0.2) uB = Create(0.1) uC = Create(0.0) uD = Create(0.0) uE = Create(0) uF = Create(0) uG = Create(0) uH = Create(0) # ############ def sfunk1(): global xstring, ystring, zstring global si1, co2, co1, si2,co3, si3 global uA, uB, uC, uD, uE, uF, uG, uH global iresol, jresol, imi, ima, jmi, jma # iresol = Create(32) jresol = Create(32) imi = Create(0.0) ima = Create(1.0) jmi = Create(0.0) jma = Create(1.0) co3 = Create("0.0") si3 = Create("0.0") si1 = Create("A*sin(i*B)*cos(j*B)") co2 = Create("exp(-s1/2)") co1 = Create("0.0") si2 = Create("0.0") xstring=Create("E*sin(j*pi*2/(jres-1))*c2*cos(-pi/2+i*pi/(ires-1))") ystring=Create("F*cos(j*pi*2/(jres-1))*c2*cos(-pi/2+i*pi/(ires-1))") zstring=Create("G*sin(-pi/2+i*pi/(ires-1))*c2") uA = Create(0.2) uB = Create(0.8) uC = Create(0.0) uD = Create(0.0) uE = Create(2) uF = Create(2) uG = Create(2) uH = Create(0) # ############ def sfunk2(): global xstring, ystring, zstring global si1, co2, co1, si2,co3, si3 global uA, uB, uC, uD, uE, uF, uG, uH global iresol, jresol, imi, ima, jmi, jma # iresol = Create(32) jresol = Create(32) imi = Create(0.0) ima = Create(1.0) jmi = Create(0.0) jma = Create(1.0) co3 = Create("0.0") si3 = Create("0.0") si1 = Create("sin(A*i)") co2 = Create("s1*cos(A*j)") co1 = Create("cos(E*c2)") si2 = Create("0.0") xstring=Create("B*sin(j*pi*2/(jres-1))*cos(-pi/2+i*pi/(ires-1))*c1") ystring=Create("B*cos(j*pi*2/(jres-1))*cos(-pi/2+i*pi/(ires-1))*c1") zstring=Create("B*sin(-pi/2+i*pi/(ires-1))*c1") uA = Create(0.4) uB = Create(2.0) uC = Create(0.0) uD = Create(0.0) uE = Create(3) uF = Create(0) uG = Create(0) uH = Create(0) # ################## # Torus # def torus(): global xstring, ystring, zstring global si1, co2, co1, si2,co3, si3 global uA, uB, uC, uD, uE, uF, uG, uH global iresol, jresol, imi, ima, jmi, jma # iresol = Create(32) jresol = Create(16) imi = Create(0.0) ima = Create(1.0) jmi = Create(0.0) jma = Create(0.5) ##uv_torus.py regular torus## # #si1 = Create("i*(2*pi)/(ires-1)") #co2 = Create("j*(2*pi)/(jres/2-1)") #co1 = Create("0.0") #si2 = Create("0.0") #xstring = Create("(A+B*cos(c2))*cos(s1)") #ystring = Create("(A+B*cos(c2))*sin(s1)") #zstring = Create("B*sin(c2)") ##uv_torus.py _ lightflowtorus2 # co3 = Create("0.0") si3 = Create("0.0") si1 = Create("i*(2*pi)/(ires-1)") co2 = Create("j*(2*pi)/(jres/2-1)") co1 = Create("0.0") si2 = Create("1.0+cos(s1*E)*C") xstring = Create("(A + B*cos(c2)*s2) * cos(s1)") ystring = Create("(A + B*cos(c2)*s2) * sin(s1)") zstring = Create("B *sin(c2)*s2") uA = Create(4.0) uB = Create(1.0) uC = Create(0.4) uD = Create(0.0) uE = Create(3) uF = Create(0) uG = Create(0) uH = Create(0) # ############ def tfunk1(): global xstring, ystring, zstring global si1, co2, co1, si2,co3, si3 global uA, uB, uC, uD, uE, uF, uG, uH global iresol, jresol, imi, ima, jmi, jma # iresol = Create(32) jresol = Create(16) imi = Create(0.0) ima = Create(1.0) jmi = Create(0.0) jma = Create(0.5) ##uv_torus.py _ lightflowtorus1 # co3 = Create("0.0") si3 = Create("0.0") si1 = Create("i*(2*pi)/(ires-1)") co2 = Create("j*(2*pi)/(jres/2-1)") co1 = Create("0.0") si2 = Create("0.0") xstring = Create("(A+B*cos(c2)*1.0+sin(s1*E)*C)*cos(s1)") ystring = Create("(A+B*cos(c2)*1.0+sin(s1*E)*C)*sin(s1)") zstring = Create("B*sin(c2)*1.0+cos(s1*E)*C") uA = Create(4.0) uB = Create(1.0) uC = Create(1.0) uD = Create(0.0) uE = Create(3) uF = Create(0) uG = Create(0) uH = Create(0) # ############ def tfunk2(): global xstring, ystring, zstring global si1, co2, co1, si2,co3, si3 global uA, uB, uC, uD, uE, uF, uG, uH global iresol, jresol, imi, ima, jmi, jma # iresol = Create(64) jresol = Create(16) imi = Create(0.0) ima = Create(1.0) jmi = Create(0.0) jma = Create(0.5) ##twist # co3 = Create("0.0") si3 = Create("0.0") si1 = Create("i*(2*pi)/(ires-1)") co2 = Create("j*(2*pi)/(jres/2-1)") co1 = Create("0.0") si2 = Create("0.0") xstring = Create("(A+B*cos(c2)*1.0+sin(s1*C)*D)*cos(s1*E)") ystring = Create("(A+B*cos(c2)*1.0+sin(s1*C)*D)*sin(s1*E)") zstring = Create("B*sin(c2)*1.0+cos(s1*C)*D") uA = Create(6.0) uB = Create(1.0) uC = Create(5.0) uD = Create(2.0) uE = Create(3) uF = Create(0) uG = Create(0) uH = Create(0) # ################## # resets # def clearnumber(): global uA, uB, uC, uD, uE, uF, uG, uH # uA = Create(0.0) uB = Create(0.0) uC = Create(0.0) uD = Create(0.0) uE = Create(0) uF = Create(0) uG = Create(0) uH = Create(0) ################## # def clearminmax(): global imi, ima, jmi, jma # imi = Create(0.0) ima = Create(1.0) jmi = Create(0.0) jma = Create(1.0) # if Tt.val == 1: imi = Create(0.0) ima = Create(1.0) jmi = Create(0.0) jma = Create(0.5) ################## # def clearstringsc(): global si1, co2, co1, si2 # si1 = Create("0.0") co2 = Create("0.0") co1 = Create("0.0") si2 = Create("0.0") ################## # def clearstringsc3(): global co3, si3 # co3 = Create("0.0") si3 = Create("0.0") ################## # def clearstringxyz(): global xstring, ystring, zstring # xstring = Create("0.0") ystring = Create("0.0") zstring = Create("0.0") ############ # Function #################################################### ############/////////////////////////////////////////////////// # def Crea(): global xstring, ystring, zstring global si1, co2, co1, si2,co3, si3 global uA, uB, uC, uD, uE, uF, uG, uH, smooth global iresol, jresol, imi, ima, jmi, jma # me=NMesh.GetRaw() # i = 0.0 j = 0.0 x = 0.0 y = 0.0 z = 0.0 u = 0.0 v = 0.0 # ires = iresol.val+1 jres = jresol.val+1 # iloc = imi.val # imin # jloc = jmi.val # jmin # isiz = ima.val # imax # jsiz = jma.val # jmax # # A = uA.val B = uB.val C = uC.val D = uD.val E = uE.val F = uF.val G = uG.val H = uH.val # si1func = si1.val co2func = co2.val co1func = co1.val si2func = si2.val co3func = co3.val si3func = si3.val xfunc = xstring.val yfunc = ystring.val zfunc = zstring.val # ######################### # ##### for i in range(0, ires, 1): # i = i*isiz +iloc # for j in range(0, jres, 1): # j = j*jsiz +jloc # s3 = eval(si3func) c3 = eval(co3func) s1 = eval(si1func) c2 = eval(co2func) c1 = eval(co1func) s2 = eval(si2func) x = eval(xfunc) y = eval(yfunc) z = eval(zfunc) # # ve=NMesh.Vert(x,y,z) me.verts.append(ve) # ######## # for i in range(0, ires-1): for j in range(0, jres-1): # a=j+i*jres # f=NMesh.Face() f.v.append(me.verts[a]) f.v.append(me.verts[a+jres]) f.v.append(me.verts[a+jres+1]) f.v.append(me.verts[a+1]) # if smooth.val: f.smooth = 1 # me.faces.append(f) # ######### NMesh.PutRaw(me, " Efunk mesh", 1) Blender.Redraw() # ### def aply_1(): global message message = "funk created" # # ### def aply_0(): global message message = "" # ####### # GUI ######################################################### #######//////////////////////////////////////////////////////// # def draw(): global xstring, ystring, zstring global si1, co2, co1, si2,co3, si3 global uA, uB, uC, uD, uE, uF, uG, uH global iresol, jresol, imi, ima, jmi, jma global filename, smooth, tip, Pt, St, Tt ##, FType # BGL.glClearColor(0.55, 0.55, 0.55, 1) BGL.glColor3f(1,1,1) BGL.glClear(BGL.GL_COLOR_BUFFER_BIT) # glColor3f(1.0, 1.0, 1.0) glRasterPos2i(130,505) Text(message) ############## #tooltips ### switch = "Tooltips=Off" ttip = "" ttL = "" ttS = "" ttP = "" tts1 = "" ttc2 = "" ttc1 = "" tts2 = "" ttx = "" tty = "" ttz = "" ttA = "" ttB = "" ttC = "" ttD = "" ttE = "" ttF = "" ttG = "" ttH = "" ttil = "" ttjl = "" ttis = "" ttjs = "" ttir = "" ttjr = "" ttup = "" ttclr= "" ttpre= "" ttsph= "" ttto2= "" ttexit="" pyinfo1="" pyinfo2="" # # ############## if tip.val == 1: # switch = "Tooltips=On" ttip = "Tooltips" ttL = "Load .txt file (only .txt 'saved' with this script" ttS = "Save .txt (.txt is good for editing and sharing files" ttP = "Set path to funk file directory" tts1 = "Write formula : i = x , j = y " ttc2 = "Write formula :Look at preset examles " ttc1 = "Write formula :Write A,B,C.... ,and use button value's" tts2 = "Write formula, from math import*" ttx = "usable in formula strings: s1,c2,c1,s2, A,B,C,D,E,F,G,H" tty = "usable: i,j, x,y,z, ires,jres,isiz,jsiz,iloc,jloc" ttz = "Write formula : Look at preset examples" ttA = "Write A,B,C,D in formula, and use button value's" ttB = "User floating point value's" ttC = "User value's" ttD = "A,B,C,D are floating point value's 0.0, 0.25, 1.0" ttE = "User integer value's" ttF = "Write E,F,G,H in formule, and use button value's" ttG = "E,F,G,H are integer value's 1,2,3,..." ttH = "User value's" ttil = "iloc = i-location ('iloc,jloc' need better code)" ttjl = "jloc = j-location" ttis = "isiz = i-size ('isiz,jsiz' need better code)" ttjs = "jsiz = j-size" ttir = "ires = mesh i-resolution" ttjr = "jres = mesh j-resolution" ttclr = "Set to 0.0" ttpre = "Preset examples" ttsph = "y = c1*(1-c2) = Potatoide" ttto2 = "Knot / Twist" ttup = "Create" ttexit="Quit" # pyinfo1="Experimental funk.py : Jimmy Hazevoet , 01/2004" pyinfo2="Sellect a preset and hit 'Redraw Mesh'" # # # glColor3f(0.0, 0.0, 0.0) glRasterPos2i(20,455) Text(pyinfo1) glRasterPos2d(11, 7) Text(pyinfo2) # ########################## # buttons # Button("Load .txt",18,10,500,75,20,ttL) Button("Save .txt",19,235,500,75,20,ttS) filename=String("path=",20,10,470,300,25,filename.val,100,ttP) si3=String("s3 = ",4,10,430,147.5,20,si3.val,100,tts1) co3=String("c3 = ",4,165,430,147.5,20,co3.val,100,ttc2) si1=String("s1 = ",4,10,400,300,20,si1.val,100,tts1) co2=String("c2 = ",4,10,375,300,20,co2.val,100,ttc2) co1=String("c1 = ",4,10,350,300,20,co1.val,100,ttc1) si2=String("s2 = ",4,10,325,300,20,si2.val,100,tts2) xstring=String("x = ",4,10,295,300,20,xstring.val,100,ttx) ystring=String("y = ",4,10,270,300,20,ystring.val,100,tty) zstring=String("z = ",4,10,245,300,20,zstring.val,100,ttz) uA=Number("A=",2,10,210,75,25,uA.val,-100.0,100.0,ttA) uB=Number("B=",2,85,210,75,25,uB.val,-100.0,100.0,ttB) uC=Number("C=",2,160,210,75,25,uC.val,-100.0,100.0,ttC) uD=Number("D=",2,235,210,75,25,uD.val,-100.0,100.0,ttD) uE=Number("E=",2,10,180,75,25,uE.val,-100.0,100.0,ttE) uF=Number("F=",2,85,180,75,25,uF.val,-100.0,100.0,ttF) uG=Number("G=",2,160,180,75,25,uG.val,-100.0,100.0,ttG) uH=Number("H=",2,235,180,75,25,uH.val,-100.0,100.0,ttH) imi=Number("iloc = ",2,10,155,150,15,imi.val,-100.0,100.0,ttil) jmi=Number("jloc = ",2,160,155,150,15,jmi.val,-100.0,100.0,ttjl) ima=Number("isiz = ",2,10,135,150,15,ima.val,-10.0,10.0,ttis) jma=Number("jsiz = ",2,160,135,150,15,jma.val,-10.0,10.0,ttjs) iresol=Number("ires = ",2,10,105,150,25,iresol.val,2,256,ttir) jresol=Number("jres = ",2,160,105,150,25,jresol.val,2,256,ttjr) Button("Clear x,y,z strings",10,160,80,150,15,ttclr) Button("Clear,s1,c2,c1,s2",9,160,65,75,15,ttclr) Button("Clear s3,c3",29,235,65,75,15,ttclr) Button("Clear numbr",11,160,50,75,15,ttclr) Button("Clear,iloc,jsiz",8,235,50,75,15),ttclr smooth=Toggle("Set Smooth",3,160,35,75,15,smooth.val) tip=Toggle(switch,12,235,35,75,15,tip.val, ttip) # Pt=Toggle("P-funk",31,10,20,75,15,Pt.val,ttpre) St=Toggle("S-funk",32,85,20,75,15,St.val,ttpre) Tt=Toggle("T-funk",33,160,20,75,15,Tt.val,ttpre) if Pt.val == 1: Button("P-funk",15,10,5,75,15) Button("P-funk 1",5,85,5,75,15) Button("P-funk 2",25,160,5,75,15) if St.val == 1: Button("S-funk",16,10,5,75,15,ttsph) Button("S-funk 1",6,85,5,75,15) Button("S-funk 2",26,160,5,75,15) if Tt.val == 1: Button("T-funk ",17,10,5,75,15) Button("T-funk 1",7,85,5,75,15) Button("T-funk 2",27,160,5,75,15,ttto2) # # # Button("Redraw Mesh",3,10,35,150,60,ttup) Button("Exit",1,235,5,75,30,ttexit) ########################################### # ### def event(evt, val): if (evt == QKEY and not val): Exit() ### def bevent(evt): if (evt == 1): Exit() # elif (evt == 2): aply_0() Draw() elif (evt == 4): aply_0() Draw() elif (evt == 3): aply_1() Crea() Redraw() elif (evt == 15): aply_0() plane() Draw() elif (evt == 16): aply_0() sphere() Draw() elif (evt == 17): aply_0() torus() Draw() elif (evt == 5): aply_0() pfunk1() Draw() elif (evt == 6): aply_0() sfunk1() Draw() elif (evt == 7): aply_0() tfunk1() Draw() elif (evt == 25): aply_0() pfunk2() Draw() elif (evt == 26): aply_0() sfunk2() Draw() elif (evt == 27): aply_0() tfunk2() Draw() elif (evt == 8): aply_0() clearminmax() Draw() elif (evt == 9): aply_0() clearstringsc() Draw() elif (evt == 29): aply_0() clearstringsc3() Draw() elif (evt == 10): aply_0() clearstringxyz() Draw() elif (evt == 11): aply_0() clearnumber() Draw() elif (evt == 12): Draw() elif (evt == 31): aply_0() if Pt.val == 1: St.val = 0 Tt.val = 0 Draw() elif (evt == 32): aply_0() if St.val == 1: Pt.val = 0 Tt.val = 0 Draw() elif (evt == 33): aply_0() if Tt.val == 1: Pt.val = 0 St.val = 0 Draw() # # elif (evt == 18): do_file(0) Draw() elif (evt == 19): do_file(1) Draw() elif (evt == 21): new = 1 Draw() # # # Crea() Register(draw, event, bevent) # #\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ###########################################################