Changeset 89
- Timestamp:
- 06/30/13 17:05:31 (12 years ago)
- Location:
- cpp/gdk
- Files:
-
- 2 added
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
cpp/gdk/Makefile
r69 r89 18 18 all: $(TARGETS) 19 19 20 CXXOPTS= -DGDK_WITHOUT_FRAMS -D EASYMAPDEBUG -g -Wno-parentheses -Wno-overloaded-virtual -Wno-format20 CXXOPTS= -DGDK_WITHOUT_FRAMS -DNEURO_IMPL_FILES=\"neuroimplfiles.h\" -DNEURO_CLS_FACTORY=\"neurocls-factory.h\" -DNEURO_CLS_LIBRARY=\"neurocls-library.h\" -DGEN_CONFIG_FILE=\"gen-config.h\" -DEASYMAPDEBUG -g -Wno-parentheses -Wno-overloaded-virtual -Wno-format 21 21 # -DEASYMAPDEBUG is required for convtest 22 22 … … 28 28 GDKOBJS=list.o advlist.o param.o sstring.o 3d.o model.o modelparts.o errmanager.o \ 29 29 neurolibrary.o geno.o genoconv.o extvalue.o framsg.o callbacks.o syntparam.o \ 30 multirange.o multimap.o paramtabobj.o defgenoconv.o sstringutils.o paramobj.o \30 multirange.o multimap.o paramtabobj.o defgenoconv.o sstringutils.o paramobj.o rndutil.o \ 31 31 $(CONVMODULES) 32 32 … … 54 54 g++ $(NEUROTESTOBJS) -L. -lgdk -o $@ 55 55 56 LOADERTESTOBJS=genotypeloader.o loadertest.o virtfile.o multiparamload.o stdiofile-autoinit.o stdiofile.o 56 LOADERTESTOBJS=genotypeloader.o loadertest.o virtfile.o multiparamload.o stdiofile-autoinit.o stdiofile.o nonstd_stdio.cpp 57 57 58 58 loadertest: libgdk.a $(LOADERTESTOBJS) -
cpp/gdk/defassign-f0_joint.h
r80 r89 1 1 2 2 3 … … 42 43 43 44 44 45 -
cpp/gdk/defassign-f0_neuro.h
r80 r89 1 1 2 2 3 … … 34 35 35 36 36 37 -
cpp/gdk/defassign-f0_neuroconn.h
r80 r89 1 1 2 2 3 … … 33 34 34 35 35 36 -
cpp/gdk/defassign-f0_part.h
r80 r89 1 1 2 2 3 … … 41 42 42 43 43 44 -
cpp/gdk/f0.def
r80 r89 156 156 ENDNEUROCLASS 157 157 158 NEUROCLASS(VectorEye,VEye,Vector Eye [EXPERIMENTAL!],Refer to publications to learn more about this neuron.,1,1,1)159 SYMBOL(`11,7,100,50,90,50,90,40,70,40,80,50,70,60,90,60,90,50,14,70,50,65,40,60,35,45,30,30,30,15,35,10,40,5,50,10,60,15,65,30,70,45,70,60,65,65,60,70,50,8,38,67,28,62,23,52,28,42,38,37,48,42,53,52,48,62,38,67,4,33,52,38,47,43,52,38,57,33,52,5,70,50,60,40,45,35,30,35,15,40,5,50,1,53,33,58,22,1,62,36,68,26,1,45,30,47,19,1,35,30,35,19,1,27,31,24,20,1,18,34,12,24')160 NEUROPROP(tx,0,0,target.x,f,,,,target.x)161 NEUROPROP(ty,0,0,target.y,f,,,,target.y)162 NEUROPROP(tz,0,0,target.z,f,,,,target.z)163 NEUROPROP(ts,0,0,target shape,s,0,-1,0,targetShape)164 NEUROPROP(p,0,0,perspective,f,0.1,10.0,1.0,perspz)165 NEUROPROP(s,0,0,scale,f,0.1,100.0,1.0,perspscale)166 NEUROPROP(h,0,0,show hidden lines,d,0,1,0,showhidden)167 NEUROPROP(o,0,0,`output lines count (each line needs four channels)',d,0,99,0,outputcount)168 NEUROPROP(d,0,0,debug,d,0,1,0,showdebug)169 ENDNEUROCLASS170 171 NEUROCLASS(VisualMotorNeuron,VMotor,Visual-Motor Cortex [EXPERIMENTAL!],`Must be connected to the VEye and properly set up. Refer to publications to learn more about this neuron.',-1,1,0)172 NEUROPROP(noIF,0,0,number of basic features,d,,,,noIF)173 NEUROPROP(noDim,0,0,number of degrees of freedom,d,,,,noDim)174 NEUROPROP(params,0,0,parameters,s,,,,params)175 ENDNEUROCLASS176 177 158 NEUROCLASS(Sticky,Sti,Sticky [EXPERIMENTAL!],,1,0,1) 178 159 VISUALHINTS(EffectorClass) -
cpp/gdk/f0classes.h
r80 r89 1 2 #define FIELDSTRUCT Model 3 ParamEntry f0_model_paramtab[]= 4 { 5 {"Properties",2,2,"m" }, 6 {"Visual",}, 7 {"se",0,1024,"startenergy","f",FIELD(startenergy),}, 8 {"Vstyle",1,0,"vis_style","s 0 -1 ",FIELD(vis_style),}, 9 {0,0,0,} 10 }; 11 ParamEntry f0_model_xtra_paramtab[]= 12 { 13 {"Extra properties",1,0,"m"}, 14 {0,0,0,} 15 }; 16 #undef FIELDSTRUCT 1 17 2 18 … … 178 194 179 195 180 181 -
cpp/gdk/f0def.xml
r80 r89 144 144 </NEUROCLASS> 145 145 146 <NEUROCLASS ID="VEye" NAME="Vector Eye [EXPERIMENTAL!]" DESCRIPTION="Refer to publications to learn more about this neuron." INPUTS="1" OUTPUT="1" LOCATION="1" SYMBOL="11,7,100,50,90,50,90,40,70,40,80,50,70,60,90,60,90,50,14,70,50,65,40,60,35,45,30,30,30,15,35,10,40,5,50,10,60,15,65,30,70,45,70,60,65,65,60,70,50,8,38,67,28,62,23,52,28,42,38,37,48,42,53,52,48,62,38,67,4,33,52,38,47,43,52,38,57,33,52,5,70,50,60,40,45,35,30,35,15,40,5,50,1,53,33,58,22,1,62,36,68,26,1,45,30,47,19,1,35,30,35,19,1,27,31,24,20,1,18,34,12,24" >147 148 <NEUROPROP ID="tx" NAME="target.x" TYPE="f" MIN="" MAX="" DEF="" />149 <NEUROPROP ID="ty" NAME="target.y" TYPE="f" MIN="" MAX="" DEF="" />150 <NEUROPROP ID="tz" NAME="target.z" TYPE="f" MIN="" MAX="" DEF="" />151 <NEUROPROP ID="ts" NAME="target shape" TYPE="s" MIN="0" MAX="-1" DEF="0" />152 <NEUROPROP ID="p" NAME="perspective" TYPE="f" MIN="0.1" MAX="10.0" DEF="1.0" />153 <NEUROPROP ID="s" NAME="scale" TYPE="f" MIN="0.1" MAX="100.0" DEF="1.0" />154 <NEUROPROP ID="h" NAME="show hidden lines" TYPE="d" MIN="0" MAX="1" DEF="0" />155 <NEUROPROP ID="o" NAME="output lines count (each line needs four channels)" TYPE="d" MIN="0" MAX="99" DEF="0" />156 <NEUROPROP ID="d" NAME="debug" TYPE="d" MIN="0" MAX="1" DEF="0" />157 </NEUROCLASS>158 159 <NEUROCLASS ID="VMotor" NAME="Visual-Motor Cortex [EXPERIMENTAL!]" DESCRIPTION="Must be connected to the VEye and properly set up. Refer to publications to learn more about this neuron." INPUTS="-1" OUTPUT="1" LOCATION="0" >160 <NEUROPROP ID="noIF" NAME="number of basic features" TYPE="d" MIN="" MAX="" DEF="" />161 <NEUROPROP ID="noDim" NAME="number of degrees of freedom" TYPE="d" MIN="" MAX="" DEF="" />162 <NEUROPROP ID="params" NAME="parameters" TYPE="s" MIN="" MAX="" DEF="" />163 </NEUROCLASS>164 165 146 <NEUROCLASS ID="Sti" NAME="Sticky [EXPERIMENTAL!]" DESCRIPTION="" INPUTS="1" OUTPUT="0" LOCATION="1" VISUALHINTS="16" > 166 147 -
cpp/gdk/gen-config.h
r82 r89 1 1 // This file is a part of the Framsticks GDK library. See LICENSE.txt for details. 2 2 // Refer to http://www.framsticks.com/ for further information. 3 4 3 5 4 /** … … 8 7 USE_GENCONV_xxx - configure converters 9 8 USE_GENMAN_xxx - configure genman 10 */11 9 12 #define BASIC_GENETICS //excludes f0-fuzzy and f8 (which is not stable for incorrect genotypes) 10 */ 13 11 14 12 #define USE_GENCONV_F10 15 #define USE_GENCONV_F20 16 #define USE_GENCONV_F32 17 #define USE_GENCONV_F4013 //#define USE_GENCONV_F21 14 //#define USE_GENCONV_F30 15 //#define USE_GENCONV_F40 18 16 //#define USE_GENCONV_F41_TEST 19 17 //#define USE_GENCONV_F50 20 //#define USE_GENCONV_F6021 #define USE_GENCONV_F7022 #ifndef BASIC_GENETICS23 #define USE_GENCONV_F8124 #endif25 #define USE_GENCONV_F9026 18 27 #define USE_GENMAN_F0 28 #ifndef BASIC_GENETICS 29 #define USE_GENMAN_F0FUZZY 30 #endif 31 #define USE_GENMAN_F1 32 #define USE_GENMAN_F2 33 #define USE_GENMAN_F3 34 #define USE_GENMAN_F4 19 //#define USE_GENMAN_F0 20 //#define USE_GENMAN_F1 21 //#define USE_GENMAN_F2 22 //#define USE_GENMAN_F3 23 //#define USE_GENMAN_F4 35 24 //#define USE_GENMAN_F5 36 //#define USE_GENMAN_F637 #define USE_GENMAN_F738 #ifndef BASIC_GENETICS39 #define USE_GENMAN_F840 #endif41 #define USE_GENMAN_F942 -
cpp/gdk/model.cpp
r82 r89 8 8 #include "multimap.h" 9 9 #include "errmanager.h" 10 11 #define FIELDSTRUCT Model12 ParamEntry f0_model_paramtab[]=13 {14 {"Model",1,2,"m",},15 {"se",2,0,"startenergy","f",FIELD(startenergy),},16 {"Vstyle",2,0,"vis_style","s",FIELD(vis_style),},17 {0,0,0,},18 };19 #undef FIELDSTRUCT20 10 21 11 Model::Model() -
cpp/gdk/model.def
r80 r89 3 3 class:id=m,name="Model" 4 4 prop:id=se,name="starting energy",group="x",flags=1024,type="f -999999 999999 0 " 5 6 class:id=m,name="Model" 7 8 9 prop:id=se,name="startenergy",group="Properties",flags=1024,type="f " 10 prop:id=Vstyle,name="vis_style",group="Visual",flags=0,type="s 0 -1 " 11 5 12 6 13 class:id=p,name="Part" … … 22 29 prop:id=i,name="info",group="Other properties",flags=0,type="s " 23 30 prop:id=Vstyle,name="vis_style",group="Visual",flags=0,type="s 0 -1 part" 31 prop:id=vs,xtra=1,name="visual thickness",group="Visual",flags=0,type="f 0.05 0.7 0.2" 32 prop:id=vr,xtra=1,name="red component",group="Visual",flags=0,type="f 0.0 1.0 0.5" 33 prop:id=vg,xtra=1,name="green component",group="Visual",flags=1024,type="f 0.0 1.0 0.5" 34 prop:id=vb,xtra=1,name="blue component",group="Visual",flags=1024,type="f 0.0 1.0 0.5" 24 35 25 36 … … 42 53 prop:id=i,name="info",group="Other properties",flags=0,type="s " 43 54 prop:id=Vstyle,name="vis_style",group="Visual",flags=0,type="s 0 -1 joint" 55 prop:id=vr,xtra=1,name="red component",group="Visual",flags=0,type="f 0.0 1.0 0.5" 56 prop:id=vg,xtra=1,name="green component",group="Visual",flags=1024,type="f 0.0 1.0 0.5" 57 prop:id=vb,xtra=1,name="blue component",group="Visual",flags=1024,type="f 0.0 1.0 0.5" 44 58 45 59 … … 52 66 prop:id=p,name="part ref#",group="Connections",flags=0,type="d -1 999999 -1" 53 67 prop:id=j,name="joint ref#",group="Connections",flags=0,type="d -1 999999 -1" 54 prop:id=d,name="item details",group="Other",flags=0,type="s "68 prop:id=d,name="item details",group="Other",flags=0,type="s N" 55 69 prop:id=i,name="info",group="Other",flags=0,type="s " 56 70 prop:id=Vstyle,name="vis_style",group="Visual",flags=0,type="s 0 -1 neuro" … … 59 73 prop:id=getInputNeuroIndex,name="get input neuron index",group="Connections",flags=1+2,type="p d(d) " 60 74 prop:id=getInputWeight,name="get input weight",group="Connections",flags=1+2,type="p f(d) " 75 prop:id=classObject,name="neuron class",group="Connections",flags=1+2,type="o NeuroClass " 61 76 62 77 … … 101 116 102 117 103 neuro: id=*,name="Constant",info="Constant value",inputs=0,output=1,location=0 ,vhints=1 ,symbol=" 3,6,100,50,90,50,90,40,70,40,70,60,90,60,90,50,1,85,50,75,50,1,80,45,80,55"118 neuro: id=*,name="Constant",info="Constant value",inputs=0,output=1,location=0 ,vhints=1 ,symbol="4,4,26,27,26,73,73,73,73,27,26,27,1,73,50,100,50,1,56,68,46,68,2,41,47,51,32,51,68" 104 119 105 120 … … 119 134 120 135 121 neuro: id=D,name="Differentiate",info="Calculate the difference between the current and previous input value. Multiple inputs are aggregated with respect to their weights",inputs=-1,output=1,location=0 136 neuro: id=D,name="Differentiate",info="Calculate the difference between the current and previous input value. Multiple inputs are aggregated with respect to their weights",inputs=-1,output=1,location=0 ,symbol="3,3,25,0,25,100,75,50,25,0,1,75,50,100,50,3,44,42,51,57,36,57,44,42" 122 137 123 138 124 neuro: id=Fuzzy,name="Fuzzy system [EXPERIMENTAL!]",info="Refer to publications to learn about this neuron",inputs=-1,output=1,location=0 ,symbol="5,2,30,65,37,37,44,65,3,37,65,44,37,51,37,58,65,2,51,65,58,37,65,65,6,100,50,70,50,70,25,25,10,25,90,70,75,70,50,1,70,65,25,65" 139 140 neuro: id=Fuzzy,name="Fuzzy system [EXPERIMENTAL!]",info="Refer to publications to learn more about this neuron.",inputs=-1,output=1,location=0 ,symbol="5,2,30,65,37,37,44,65,3,37,65,44,37,51,37,58,65,2,51,65,58,37,65,65,6,100,50,70,50,70,25,25,10,25,90,70,75,70,50,1,70,65,25,65" 125 141 126 142 prop:id=ns,name="number of fuzzy sets",type="d 1 " … … 130 146 131 147 132 neuro: id=VEye,name="Vector Eye [EXPERIMENTAL!]",info="",inputs=1,output=1,location=1 ,symbol="11,7,100,50,90,50,90,40,70,40,80,50,70,60,90,60,90,50,14,70,50,65,40,60,35,45,30,30,30,15,35,10,40,5,50,10,60,15,65,30,70,45,70,60,65,65,60,70,50,8,38,67,28,62,23,52,28,42,38,37,48,42,53,52,48,62,38,67,4,33,52,38,47,43,52,38,57,33,52,5,70,50,60,40,45,35,30,35,15,40,5,50,1,53,33,58,22,1,62,36,68,26,1,45,30,47,19,1,35,30,35,19,1,27,31,24,20,1,18,34,12,24" 133 134 prop:id=tx,name="target.x",type="f " 135 prop:id=ty,name="target.y",type="f " 136 prop:id=tz,name="target.z",type="f " 137 prop:id=ts,name="target shape",type="s 0 -1 0" 138 prop:id=p,name="perspective",type="f 0.1 10.0 1.0" 139 prop:id=s,name="scale",type="f 0.1 100.0 1.0" 140 prop:id=h,name="show hidden lines",type="d 0 1 0" 141 prop:id=o,name="output lines count (each line needs four channels)",type="d 0 99 0" 142 prop:id=d,name="debug",type="d 0 1 0" 143 144 145 neuro: id=VMotor,name="Visual-Motor Cortex [EXPERIMENTAL!]",info="Must be connected to the VEye and properly set up.",inputs=-1,output=1,location=0 146 prop:id=noIF,name="number of basic features",type="d " 147 prop:id=noDim,name="number of degrees of freedom",type="d " 148 prop:id=params,name="parameters",type="s " 149 150 151 neuro: id=Sti,name="Sticky [EXPERIMENTAL!]",info="",inputs=1,output=0,location=1 ,vhints=32 148 neuro: id=Sti,name="Sticky [EXPERIMENTAL!]",info="",inputs=1,output=0,location=1 ,vhints=16 152 149 153 150 154 151 155 neuro: id=LMu,name="L engthmuscle [EXPERIMENTAL!]",info="",inputs=1,output=0,location=2 ,vhints=16152 neuro: id=LMu,name="Linear muscle [EXPERIMENTAL!]",info="",inputs=1,output=0,location=2 ,vhints=16 156 153 157 154 prop:id=p,name="power",type="f 0.01 1.0 1.0" … … 166 163 167 164 168 neuro: id=Ch,name="Channelize",info="Combines all input signals into a single multichannel output; Note: ChSel and ChMux are the only neurons which support multiple channels. Other neurons discard everything except the first channel.",inputs=-1,output=1,location=0 165 neuro: id=Ch,name="Channelize",info="Combines all input signals into a single multichannel output; Note: ChSel and ChMux are the only neurons which support multiple channels. Other neurons discard everything except the first channel.",inputs=-1,output=1,location=0 ,symbol="10,4,25,0,25,100,75,70,75,30,25,0,1,75,50,100,50,1,70,50,55,50,1,30,80,55,50,1,30,20,55,50,1,30,35,55,50,1,30,45,55,50,1,30,55,55,50,1,61,53,65,47,1,30,65,55,50" 169 166 170 167 171 neuro: id=ChMux,name="Channel multiplexer",info="Outputs the selected channel from the second (multichannel) input. The first input is used as the selector value (-1=select first channel, .., 1=last channel)",inputs=2,output=1,location=0 168 169 neuro: id=ChMux,name="Channel multiplexer",info="Outputs the selected channel from the second (multichannel) input. The first input is used as the selector value (-1=select first channel, .., 1=last channel)",inputs=2,output=1,location=0 ,symbol="7,4,25,0,25,100,75,70,75,30,25,0,1,75,50,100,50,1,70,50,55,50,3,50,55,55,50,50,45,50,55,3,30,67,45,67,45,50,50,50,1,35,70,39,64,2,30,33,53,33,53,48" 172 170 173 171 174 neuro: id=ChSel,name="Channel selector",info="Outputs a single channel (selected by the \"ch\" parameter) from multichannel input",inputs=1,output=1,location=0 172 173 neuro: id=ChSel,name="Channel selector",info="Outputs a single channel (selected by the \"ch\" parameter) from multichannel input",inputs=1,output=1,location=0 ,symbol="6,4,25,0,25,100,75,70,75,30,25,0,1,75,50,100,50,1,70,50,55,50,3,50,55,55,50,50,45,50,55,1,30,50,50,50,1,35,53,39,47" 174 175 175 prop:id=ch,name="channel",type="d " 176 176 … … 185 185 186 186 187 187 188 # EOF -
cpp/gdk/neurocls-factory.h
r80 r89 84 84 #undef FIELDSTRUCT 85 85 86 #define FIELDSTRUCT NI_VectorEye87 ParamEntry NI_VectorEye_tab []={88 {"Vector Eye [EXPERIMENTAL!]",1, 9 ,"VEye",},89 {"tx",0,0,"target.x","f ",FIELD(target.x),},90 {"ty",0,0,"target.y","f ",FIELD(target.y),},91 {"tz",0,0,"target.z","f ",FIELD(target.z),},92 {"ts",0,0,"target shape","s 0 -1 0",FIELD(targetShape),},93 {"p",0,0,"perspective","f 0.1 10.0 1.0",FIELD(perspz),},94 {"s",0,0,"scale","f 0.1 100.0 1.0",FIELD(perspscale),},95 {"h",0,0,"show hidden lines","d 0 1 0",FIELD(showhidden),},96 {"o",0,0,"output lines count (each line needs four channels)","d 0 99 0",FIELD(outputcount),},97 {"d",0,0,"debug","d 0 1 0",FIELD(showdebug),},98 {0,0,0,},};99 #undef FIELDSTRUCT100 101 #define FIELDSTRUCT NI_VisualMotorNeuron102 ParamEntry NI_VisualMotorNeuron_tab []={103 {"Visual-Motor Cortex [EXPERIMENTAL!]",1, 3 ,"VMotor",},104 {"noIF",0,0,"number of basic features","d ",FIELD(noIF),},105 {"noDim",0,0,"number of degrees of freedom","d ",FIELD(noDim),},106 {"params",0,0,"parameters","s ",FIELD(params),},107 {0,0,0,},};108 #undef FIELDSTRUCT109 110 86 #define FIELDSTRUCT NI_Sticky 111 87 ParamEntry NI_Sticky_tab []={ … … 178 154 setImplementation("D",new NI_Diff); \ 179 155 setImplementation("Fuzzy",new NI_FuzzyNeuro); \ 180 setImplementation("VEye",new NI_VectorEye); \181 setImplementation("VMotor",new NI_VisualMotorNeuron); \182 156 setImplementation("Sti",new NI_Sticky); \ 183 157 setImplementation("LMu",new NI_LinearMuscle); \ -
cpp/gdk/neurocls-library.h
r80 r89 109 109 addClass(new NeuroClass(NI_FuzzyNeuro_tab,"Refer to publications to learn more about this neuron.",-1,1,0, FuzzyNeuro_xy,0,0)); 110 110 111 static int VectorEye_xy[]={122,11,7,100,50,90,50,90,40,70,40,80,50,70,60,90,60,90,50,14,70,50,65,40,60,35,45,30,30,30,15,35,10,40,5,50,10,60,15,65,30,70,45,70,60,65,65,60,70,50,8,38,67,28,62,23,52,28,42,38,37,48,42,53,52,48,62,38,67,4,33,52,38,47,43,52,38,57,33,52,5,70,50,60,40,45,35,30,35,15,40,5,50,1,53,33,58,22,1,62,36,68,26,1,45,30,47,19,1,35,30,35,19,1,27,31,24,20,1,18,34,12,24};112 static ParamEntry NI_VectorEye_tab[]={113 {"Vector Eye [EXPERIMENTAL!]",1, 9 ,"VEye",},114 115 {"tx",0,0,"target.x","f ",},116 {"ty",0,0,"target.y","f ",},117 {"tz",0,0,"target.z","f ",},118 {"ts",0,0,"target shape","s 0 -1 0",},119 {"p",0,0,"perspective","f 0.1 10.0 1.0",},120 {"s",0,0,"scale","f 0.1 100.0 1.0",},121 {"h",0,0,"show hidden lines","d 0 1 0",},122 {"o",0,0,"output lines count (each line needs four channels)","d 0 99 0",},123 {"d",0,0,"debug","d 0 1 0",},124 125 {0,0,0,},};126 addClass(new NeuroClass(NI_VectorEye_tab,"Refer to publications to learn more about this neuron.",1,1,1, VectorEye_xy,0,0));127 128 129 static ParamEntry NI_VisualMotorNeuron_tab[]={130 {"Visual-Motor Cortex [EXPERIMENTAL!]",1, 3 ,"VMotor",},131 {"noIF",0,0,"number of basic features","d ",},132 {"noDim",0,0,"number of degrees of freedom","d ",},133 {"params",0,0,"parameters","s ",},134 135 {0,0,0,},};136 addClass(new NeuroClass(NI_VisualMotorNeuron_tab,"Must be connected to the VEye and properly set up. Refer to publications to learn more about this neuron.",-1,1,0, 0,0));137 138 111 139 112 static ParamEntry NI_Sticky_tab[]={
Note: See TracChangeset
for help on using the changeset viewer.