# (c) Copyright 2005 Hewlett-Packard Development Company, LP
# All rights reserved.
# $Id: assembler.n3,v 1.15 2008/01/31 12:30:55 chris-dollin Exp $

@prefix rdf:        <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs:       <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl:        <http://www.w3.org/2002/07/owl#> .

@prefix ja:         <http://jena.hpl.hp.com/2005/11/Assembler#> .

@prefix lm:         <http://jena.hpl.hp.com/2004/08/location-mapping#> .
@prefix dc:         <http://purl.org/dc/elements/1.1/> .

@prefix :           <#> .

<>  rdfs:comment     "Vocabulary for describing Jena models" ;
    dc:creator       "Chris Dollin" ;
    dc:creator       "the Jena team" ;
    dc:subject       "" ;
    dc:publisher     "HP" ;
    dc:title         "Jena Model Spec" ;
    dc:description   "Vocabulary for describing Jena models" ;
    dc:date          "2005-11-15" ;
    dc:format        "RDF" ;
    dc:identifier    :
    .

#
# Alias for owl:imports
#

ja:imports a rdf:Property
    ; rdfs:label "Assembler.imports"
    ; rdfs:comment
        """property whose object is another JA description to
        be loaded into this one; equivalent to owl:imports."""
    .

#
# Assembler object: those things that can be specified and created
#

ja:Object a rdfs:Class
    ; rdfs:label "Assembler.Object"
    ; rdfs:comment "the class of Assembler objects"
    .

#
# Assembler model base type.
#

ja:Model a rdfs:Class
    ; rdfs:subClassOf ja:Object
    ; rdfs:subClassOf ja:Loadable
	; rdfs:subClassOf ja:ContentItem
    ; rdfs:label "Assembler.Model"
    ; rdfs:comment "the class of Assembler model objects"
    .

#
# every Model can be given a ReificationMode
#

ja:reificationMode a rdf:Property
    ; rdfs:label "Assembler.reificationMode"
    ; rdfs:comment "property to attach a ReificationMode to a Model"
    ; rdfs:domain ja:Model
    ; rdfs:range ja:ReificationMode
    .

#
# every model can has some content specified by a Content object.
#

ja:content a rdf:Property
    ; rdfs:label "Assembler.content"
    ; rdfs:comment
        """specifies that the subject Loadable is to be loaded with
        all the contents specified by the object Content.
        """
    ; rdfs:domain ja:Loadable
    ; rdfs:range ja:Content
    .

ja:initialContent a rdf:Property
    ; rdfs:label "Assembler.initialContent"
    ; rdfs:comment
        """specifies that the subject Loadable is to be loaded with
        all the contents specified by the object Load when it is first
        created - ie not when eg an existing database model is opened.
        """
    ; rdfs:domain ja:Loadable
    ; rdfs:range ja:Content
    .

ja:Loadable a rdfs:Class
    ; rdfs:subClassOf ja:Object
    ; rdfs:label "Assembler.Loadable"
    ; rdfs:comment "a Loadable object, namely a Model or a Load"
    .

ja:HasFileManager a rdfs:Class
	; rdfs:subClassOf ja:Object
	; rdfs:label "Assembler.HasFileManager"
	; rdfs:comment "an object that may have a fileManager property"
	.

ja:Content a rdfs:Class
    ; rdfs:subClassOf ja:HasFileManager
    ; rdfs:label "Assembler.Content"
    ; rdfs:comment "content to be loaded into a Loadable"
    .

#
# there are two kinds of Load. A ContentGroup collects together
# other Loads, specified with ja:content.
#

ja:ContentGroup a rdfs:Class
    ; rdfs:subClassOf ja:Content, ja:Loadable
    .

#
# the other kind of Content is a ContentItem, which is either a
# URL or a literal string with an optional language name.
#

ja:ContentItem a rdfs:Class
    ; rdfs:subClassOf ja:Content
    ; rdfs:subClassOf [owl:onProperty ja:fileManager; owl:maxCardinality 1]
    ; rdfs:label "Assembler.ContentItem"
    ; rdfs:comment "a single loadable model item"
    .

ja:externalContent a rdf:Property
    ; rdfs:label "Assembler.externalContent"
    ; rdfs:comment
        """the subject Load is to be loaded from
        the object URL"""
    ; rdfs:domain ja:ContentItem
    .

ja:literalContent a rdf:Property
    ; rdfs:label "Assembler.literalContent"
    ; rdfs:comment
        """the subject Load is to be loaded from the
        object String"""
    ; rdfs:domain ja:ContentItem
    .

ja:contentEncoding a rdf:Property
    ; rdfs:label "Assembler.contentEncoding"
    ; rdfs:comment
        """specifies the name of the encoding language (N3, RDF/XML, etc)
        for the associated file or string. Overrides any guess that might
        otherwise be made. Guesses when omitted: starts with '<' means
        RDF/XML, starts with '@' or '#' means N3, otherwise NTRIPLE"""
    ; rdfs:domain ja:ContentItem
    .

#
# default models [typically memory models]
#

ja:DefaultModel a rdfs:Class
    ; rdfs:subClassOf ja:Model
    ; rdfs:label "Assembler.DefaultModel"
    ; rdfs:comment "the default model description"
    .

#
# memory models
#

ja:MemoryModel a rdfs:Class
    ; rdfs:subClassOf ja:Model
    ; rdfs:label "Assembler.MemoryModel"
    ; rdfs:comment "description of a memory model"
    .

#
# named models [for file & database models]
#

ja:NamedModel a rdfs:Class
    ; rdfs:subClassOf ja:Model
    ; rdfs:subClassOf [owl:onProperty ja:modelName; owl:cardinality 1]
    ; rdfs:label "Assembler.NamedModel"
    ; rdfs:comment
        """shared superclass for FileModel and RDBModel,
        accepting the modelName property"""
    .

ja:modelName a rdf:Property
    ; rdfs:label "Assembler.modelName"
    ; rdfs:comment
        """property specifying that the subject NamedModel shall
        have the object String as its name. If the object is a URI
        node, it has the spelling of the URI as its name."""
    ; rdfs:domain ja:NamedModel
    .

#
# file models
#

ja:FileModel a rdfs:Class
    ; rdfs:subClassOf ja:NamedModel
    ; rdfs:subClassOf [owl:onProperty ja:fileEncoding; owl:maxCardinality 1]
    ; rdfs:subClassOf [owl:onProperty ja:directory; owl:maxCardinality 1]
    ; rdfs:subClassOf [owl:onProperty ja:mapName; owl:maxCardinality 1]
    ; rdfs:label "Assembler.FileModel"
    ; rdfs:comment
        """a FileModel is a file-backed NamedModel implemented as a
        MemoryModel with the name given by the modelName and in the
        directory given by fromDirectory."""
    .

ja:directory a rdf:Property
    ; rdfs:label "directory"
    ; rdfs:comment
        """property of a FileModel giving the directory in which the
        modelName is to be resolved. Query: is the current behaviour
        of FileModels to be preserved?"""
    ; rdfs:domain ja:FileModel
    .

ja:mapName a rdf:Property
	; rdfs:label "Assembler.mapName"
	; rdfs:domain ja:FileModel
	; rdfs:comment
		"""property of a FileModel specifying whether the modelName should
		be escaped by replacing _, /, and : by __, _S, _C before being used,
		to allow URIs as model names without implying nested directory
		strucure. If ommitted or not ja:true, no translation is done."""
	.

ja:fileEncoding a rdf:Property
    ; rdfs:domain ja:FileModel
    ; rdfs:label "Assemble.fileEncoding"
    ; rdfs:comment """FileModel property to give language encoding"""
    .
	
#
# database models
#

ja:RDBModel a rdfs:Class
    ; rdfs:subClassOf ja:NamedModel
    ; rdfs:subClassOf [owl:onProperty ja:connection; owl:cardinality 1]
    ; rdfs:subClassOf ja:Connectable
    ; owl:equivalentClass [owl:intersectionOf (ja:Connectable ja:NamedModel)]
    ; rdfs:label "Assembler.RDBModel"
    ; rdfs:comment
        """a Model from a Jena relational database, specified by a
        Connection and with a given name."""
    .

ja:Connectable a rdfs:Class
    ; rdfs:subClassOf ja:Object
    ; rdfs:label "Assembler.Connectable"
    ; rdfs:comment
        """The class of Objects which can be the subject of a ja:connection
        property."""
    .

ja:connection a rdf:Property
    ; rdfs:label "Assembler.connection"
    ; rdfs:comment
        """property specifying that the subject RDBModel is built
        using the connection specified by the object."""
    ; rdfs:domain ja:Connectable
    ; rdfs:range ja:Connection
    .

ja:ModelSource a rdfs:Class
    ; rdfs:subClassOf ja:Connectable
    ; rdfs:label "Assembler.ModelSource"
    ; rdfs:comment "Source of models by name for an OntModelSpec"
    .

ja:RDBModelSource a rdfs:Class
    ; rdfs:subClassOf ja:ModelSource
    ; rdfs:subClassOf ja:Connectable
    ; rdfs:label "Assembler.RDBModelSource"
    ; rdfs:comment "A ModelSource backed by an RDB"
    .

#
# inference models
#

ja:InfModel a rdfs:Class
    ; rdfs:subClassOf ja:Model
    ; rdfs:subClassOf [owl:onProperty ja:baseModel; owl:maxCardinality 1]
    ; rdfs:subClassOf [owl:onProperty ja:reasoner; owl:maxCardinality 1]
    ; rdfs:label "Assembler.InfModel"
    ; rdfs:comment
        """class of inference models given by applying a reasoner to a base model
        (which might be implictly the a default model)"""
    .

ja:reasoner a rdf:Property
    ; rdfs:label "Assembler.reasoner"
    ; rdfs:comment
        """property of an inference model that specifies the reasoner
        to use."""
    ; rdfs:domain ja:InfModel
    ; rdfs:range ja:ReasonerFactory
    .

ja:baseModel a rdf:Property
    ; rdfs:label "Assembler.baseModel"
    ; rdfs:comment
        """optional property of an inference model that specifies the
        base model over which inference is done."""
    ; rdfs:domain ja:InfModel
    ; rdfs:range ja:Model
    .

#
# reasoner factories; see also properties of HasRules.
#

ja:ReasonerFactory a rdfs:Class
    ; rdfs:subClassOf ja:HasRules
    ; rdfs:subClassOf [owl:onProperty ja:ReasonerURL; owl:maxCardinality 1]
    ; rdfs:label "Assembler.ReasonerFactory"
    ; rdfs:comment
        """class of ReasonerFactory objects, allowing arbitrary reasoner
        properties to be attached."""
    .

ja:reasonerURL a rdf:Property
    ; rdfs:label "Assembler.reasonerURL"
    ; rdfs:comment
        """property of a ReasonerFactory specifying the URL of the reasoner
        in the reasoner registry; only one such property per reasoner."""
    ; rdfs:domain ja:ReasonerFactory
    .

ja:reasonerClass a rdf:Property
    ; rdfs:label "Assembler.reasonerClass"
    ; rdfs:comment "property of a ReasonerFactory giving the class name"
    ; rdfs:domain ja:ReasonerFactory
    .

ja:reasonerFactory a rdf:Property
	; rdfs:label "Assembler.reasonerFactory"
	; rdfs:comment "property of an OntModelSpec giving the reasoner for the spec"
	; rdfs:range ja:ReasonerFactory
	; rdfs:domain ja:OntModelSpec
	.

ja:schema a rdf:Property
    ; rdfs:label "Assembler.schemaURL"
    ; rdfs:comment
        """property of a Reasoner specifying schema Models to be loaded.
        Multiple schemas can be given; they are unioned
        together before being supplied to the reasoner."""
    ; rdfs:domain ja:ReasonerFactory
    ; rdfs:range ja:Model
    .

#
# rulesets
#

ja:HasRules a rdfs:Class
    ; rdfs:subClassOf ja:Object
    ; rdfs:label "Assembler.HasRules"
    ; rdfs:comment
        """the class of things that can have rules attached,
        viz, Reasoners and RuleSets."""
    .

ja:RuleSet a rdfs:Class
    ; rdfs:subClassOf ja:HasRules
    ; rdfs:label "Assembler.RuleSet"
    ; rdfs:comment
        """class of sets of rules (for a Jena rule engine) specified
        within the Assembler file. A RuleSet may refer to rules by
        their URL, by their containing RuleSets, or by including them
        as string literals."""
    .

ja:rules a rdf:Property
    ; rdfs:label "Assembler.rules"
    ; rdfs:comment
        """property of a GenericRuleReasoner or RuleSet which specifies
        rules given witin rulesets within the Assembler RDF. Multiple
        such properties can be given."""
    ; rdfs:domain ja:HasRules
    ; rdfs:range ja:RuleSet
    .

ja:rulesFrom a rdf:Property
    ; rdfs:label "Assembler.rulesFrom"
    ; rdfs:comment
        """property of a RuleSet which identifies rules by their URL.
        The target resource is loaded and parsed as a rule string."""
    ; rdfs:domain ja:HasRules
    .

ja:rule a rdf:Property
    ; rdfs:label "Assembler.rule"
    ; rdfs:comment
        """property of a RuleSet specifying a rule (or rules) as a
        literal string."""
    ; rdfs:domain ja:HasRules
    .

#
#
#

ja:LocationMapper a rdfs:Class
    ; rdfs:subClassOf ja:Object
    ; rdfs:subClassOf [owl:onProperty lm:mapping; owl:maxCardinality 1]
    ; rdfs:label "Assembler.LocationMapper"
    ; rdfs:comment "class of LocationMapper specificiations"
    .

lm:mapping a rdf:Property
    ; rdfs:domain ja:LocationMapper
    ; rdfs:label "LocationMapper.mapping"
    ; rdfs:comment
        """LocationMapper property which identifies location mappings and
        which we have stolen to identify ja:LocationMapper specifications."""
    .

ja:FileManager a rdfs:Class
    ; rdfs:subClassOf ja:Object
    ; rdfs:subClassOf [owl:onProperty ja:locationMapper; owl:maxCardinality 1]
    ; rdfs:label "Assembler.FileManager"
    ; rdfs:comment "class of FileManager specifications"
    .

ja:locationMapper a rdf:Property
    ; rdfs:domain ja:FileManager
    ; rdfs:range ja:LocationMapper
    ; rdfs:label "Assembler.locationMapper"
    ; rdfs:comment "FileManager property which identifies its LocationMapper."
    .

ja:DocumentManager a rdfs:Class
	; rdfs:subClassOf ja:HasFileManager
    ; rdfs:subClassOf [owl:onProperty ja:fileManager; owl:maxCardinality 1]
    ; rdfs:subClassOf [owl:onProperty ja:policyPath; owl:maxCardinality 1]
    ; rdfs:label "Assembler.DocumentManager"
    ; rdfs:comment "class of OntDocumentManager specificiations"
    .

ja:fileManager a rdf:Property
    ; rdfs:domain ja:HasFileManager
    ; rdfs:range ja:FileManager
    ; rdfs:label "Assembler.fileManager"
    ; rdfs:comment
        """property of a DocumentManager whose value is its FileManager"""
    .

ja:policyPath a rdf:Property
    ; rdfs:domain ja:DocumentManager
    ; rdfs:label "Assembler.policyPath"
    ; rdfs:comment
        """property of a DocumentManager whose value is its metadata policy path"""
    .

#
# ontology models. every ontology model is an inference model.
#

ja:OntModel a rdfs:Class
    ; rdfs:subClassOf ja:InfModel, ja:UnionModel
    ; rdfs:label "Assembler.OntModel"
    ; rdfs:comment "the class of OntModel specifications"
    .

ja:OntModelSpec a rdfs:Class
    ; rdfs:subClassOf ja:Object
    ; rdfs:subClassOf [owl:onProperty ja:ontLanguage; owl:maxCardinality 1]
    ; rdfs:subClassOf [owl:onProperty ja:documentManager; owl:maxCardinality 1]
    ; rdfs:subClassOf [owl:onProperty ja:importSource; owl:maxCardinality 1]
    ; rdfs:subClassOf [owl:onProperty ja:reasonerFactory; owl:maxCardinality 1]
    ; rdfs:subClassOf [owl:onProperty ja:like; owl:maxCardinality 1]
    ; rdfs:label "Assembler.OntModelSpec"
    ; rdfs:comment "class of OntModelSpec objects for OntModel construction"
    .

ja:ontModelSpec a rdf:Property
    ; rdfs:label "Assembler.ontModelSpec"
    ; rdfs:comment "property of an OntModel giving its OntModelSpec"
    ; rdfs:domain ja:OntModel
    ; rdfs:range ja:OntModelSpec
    .

ja:likeBuiltinSpec a rdf:Property
    ; rdfs:label "Assembler.likeBuiltinSpec"
    ; rdfs:comment "property of an OntModelSpec giving an internal spec it's like"
    ; rdfs:domain ja:OntModelSpec
    .

ja:ontLanguage a rdf:Property
    ; rdfs:label "Assembler.ontLanguage"
    ; rdfs:comment
        """property of an OntModelSpec that specifies the ontology
        language."""
    ; rdfs:domain ja:OntModelSpec
    .

ja:documentManager a rdf:Property
    ; rdfs:label "Assembler.docManager"
    ; rdfs:comment
        """property of an OntModelSpec that specifies the
        document manager of the model. If omitted, the model has
        the default document manager."""
    ; rdfs:domain ja:OntModelSpec
    .

ja:importSource a rdf:Property
    ; rdfs:label "Assembler.importSource"
    ; rdfs:comment
        """property of an OntModelSpec that specifies the importSource
        of the model. If omitted, the model has a default MemoryModelMaker. """
    ; rdfs:domain ja:OntModelSpec
    .

#
# union models
#

ja:UnionModel a rdfs:Class
    ; rdfs:subClassOf ja:Model
    ; rdfs:subClassOf [owl:onProperty ja:rootModel; owl:maxCardinality 1]
    ; rdfs:label "Assembler.Union"
    ; rdfs:comment "class of Union models"
    .

ja:subModel a rdf:Property
    ; rdfs:label "Assembler.subModel"
    ; rdfs:comment
        """property of a UnionModel that specifies one of its non-root sub-models.
        Arbitrarily many sub-models can be supplied."""
    ; rdfs:domain ja:UnionModel
    ; rdfs:range ja:Model
    .

ja:rootModel a rdf:Property
    ; rdfs:domain ja:UnionModel
    ; rdfs:range ja:Model
    ; rdfs:label "Assembler.rootModel"
    ; rdfs:comment
        """property of a UnionModel that specifies its mutable base model"""
    .

#
# connections
#

ja:Connection a rdfs:Class
    ; rdfs:subClassOf [owl:onProperty ja:dbURL; owl:maxCardinality 1]
    ; rdfs:subClassOf [owl:onProperty ja:dbURLProperty; owl:maxCardinality 1]
    ; rdfs:subClassOf [owl:onProperty ja:dbUser; owl:maxCardinality 1]
    ; rdfs:subClassOf [owl:onProperty ja:dbUserProperty; owl:maxCardinality 1]
    ; rdfs:subClassOf [owl:onProperty ja:dbPassword; owl:maxCardinality 1]
    ; rdfs:subClassOf [owl:onProperty ja:dbPasswordProperty; owl:maxCardinality 1]
    ; rdfs:subClassOf [owl:onProperty ja:dbType; owl:maxCardinality 1]
    ; rdfs:subClassOf [owl:onProperty ja:dbTypeProperty; owl:maxCardinality 1]
    ; rdfs:subClassOf [owl:onProperty ja:dbClass; owl:maxCardinality 1]
    ; rdfs:subClassOf [owl:onProperty ja:dbClassProperty; owl:maxCardinality 1]
    ; rdfs:subClassOf ja:Object
    ; rdfs:label "Assembler.Connection"
    ; rdfs:comment
        "class of RDB Connection objects for JDBC database connections."
    .

ja:dbURL a rdf:Property
    ; rdfs:label "Assembler.dbURL"
    ; rdfs:comment
        """property of a Connection that specifies as a URI Resource
        the URL of the database to connect to."""
    ; rdfs:domain ja:Connection
    .

ja:dbUser a rdf:Property
    ; rdfs:label "Assembler.dbUser"
    ; rdfs:comment
        """property of a database connection that specifies as a string
        the name of the database user for which the connection is to be made."""
    ; rdfs:domain ja:Connection
    .

ja:dbPassword a rdf:Property
    ; rdfs:label "Assembler.dbPassword"
    ; rdfs:comment
        """property of a database connection that specifies as a string the
        password used to authorise the connection."""
    ; rdfs:domain ja:Connection
    .

ja:dbType a rdf:Property
    ; rdfs:label "Assembler.dbType"
    ; rdfs:comment
        """property of a database connection that specifies as a string the
        type of the database to connect to."""
    ; rdfs:domain ja:Connection
    .

ja:dbURLProperty a rdf:Property
    ; rdfs:label "Assembler.dbURLProperty"
    ; rdfs:comment
        """property of a Connection that specifies the name of a Java
		system property containing the URL of the database to connect to."""
    ; rdfs:domain ja:Connection
    .

ja:dbUserProperty a rdf:Property
    ; rdfs:label "Assembler.dbUserProperty"
    ; rdfs:comment
        """property of a database connection that specifies the name of
		a Java system property containing the name of the database user
        for which the connection is to be made."""
    ; rdfs:domain ja:Connection
    .

ja:dbPasswordProperty a rdf:Property
    ; rdfs:label "Assembler.dbPasswordProperty"
    ; rdfs:comment
        """property of a database connection that specifies the name of
		a Java system property the password used to authorise the connection."""
    ; rdfs:domain ja:Connection
    .

ja:dbTypeProperty a rdf:Property
    ; rdfs:label "Assembler.dbTypeProperty"
    ; rdfs:comment
        """property of a database connection that specifies the name of a
		Java system property containing the type of the database to connect to."""
    ; rdfs:domain ja:Connection
    .

ja:dbClass a rdf:Property
    ; rdfs:label "Assembler.dbClass"
    ; rdfs:comment
        """property of a database connection that specifies as a string the
        name of a Java class to be loaded before connection is attemped."""
    ; rdfs:domain ja:Connection
    .

ja:dbClassProperty a rdf:Property
    ; rdfs:label "Assembler.dbClass"
    ; rdfs:comment
        """property of a database connection that specifies as a string the
        name a Java system property containing the name of a Java class to be
        loaded before connection is attemped."""
    ; rdfs:domain ja:Connection
    .

#
# reification modes
#

ja:ReificationMode a rdfs:Class
    ; rdfs:label "Assembler.ReificationMode"
    ; rdfs:comment "the class of reification modes"
    .

ja:standard a ja:ReificationMode
    ; rdfs:label "Standard"
    ; rdfs:comment "reification mode Standard - all reification triples visible"
    .

ja:minimal a ja:ReificationMode
    ; rdfs:label "Minimal"
    ; rdfs:comment "reification mode Minimal - no reification triples visible"
    .

ja:convenient a ja:ReificationMode
    ; rdfs:label "Convenient"
    ; rdfs:comment "reification mode Convenient"
    .

#
# prefix mappings
#

ja:PrefixMapping a rdfs:Class
    ; rdfs:subClassOf ja:Object
    ; rdfs:label "Assembler.PrefixMapping"
    ; rdfs:comment
        """class encoding a Jena prefix mapping"""
    .

ja:prefixMapping a rdf:Property
    ; rdfs:label "Assembler.prefixMapping"
    ; rdfs:comment
        """property used to attach a PrefixMapping to a Model"""
    ; rdfs:domain ja:Model
    ; rdfs:range ja:PrefixMapping
    .

ja:includes a rdf:Property
    ; rdfs:label "Assembler.includes"
    ; rdfs:comment """property to allow one prefix mapping to include another"""
    ; rdfs:domain ja:PrefixMapping
    ; rdfs:range ja:PrefixMapping
    .

ja:SinglePrefixMapping a rdfs:Class
    ; rdfs:subClassOf ja:PrefixMapping
    ; rdfs:subClassOf [owl:onProperty ja:prefix; owl:cardinality 1]
    ; rdfs:subClassOf [owl:onProperty ja:namespace; owl:cardinality 1]
    ; rdfs:label "Assembler.SinglePrefixMapping"
    ; rdfs:comment """class encoding a single prefix mapping maplet"""
    .

ja:prefix a rdf:Property
    ; rdfs:label "Assembler.prefix"
    ; rdfs:comment """property for specifing the prefix of a SimplePrefixMapping"""
    ; rdfs:domain ja:SinglePrefixMapping
    .

ja:namespace a rdf:Property
    ; rdfs:label "Assembler.namespace"
    ; rdfs:comment """property for specifying the URL of a SimplePrefixMapping"""
    ; rdfs:domain ja:SinglePrefixMapping
    .

# Local Variables:
# tab-width: 4
# indent-tabs-mode: nil
# End:
