MapGuide RFC 37 - New Provider Capabilities schema
This page contains an change request (RFC) for the MapGuide Open Source project. More MapGuide RFCs can be found on the RFCs page.
Status
RFC Template Version | 1.0 |
Submission Date | Sept 21, 2007 |
Last Modified | Jack Lee Timestamp |
Author | Jack Lee |
RFC Status | adopted |
Implementation Status | under development |
Proposed Milestone | 2.0 |
Assigned PSC guide(s) | Tom |
Voting History | Sept 21, 2007 |
+1 | Tom, Jason, Paul, Bruce, Andy, Bob |
+0 | |
-0 | |
-1 | |
Abstain | Haris |
Overview
This change adds a new version of the Provider Capabilities schema. In order to get a response that matches the new schema, you must use Version=2.0.0 in the GETPROVIDERCAPABILITIES request.
Motivation
Some provider capabilities is missing from the current schema.
Proposed Solution
In order to get a response that matches the new schema described below, you must use Version=2.0.0 in the GETPROVIDERCAPABILITIES request.
Add a new file, FdoProviderCapabilities-1.1.0.xsd to the Common/Schema folder. This file contains the following new capabilities:
- SupportsAutoIdGeneration(Schema Capability)
- SupportsDataStoreScopeUniqueIdGeneration(Schema Capability)
- SupportedAutoGeneratedTypes(Schema Capability)
- SupportsSchemaModification(Schema Capability)
- SupportsSelectExpressions(Command Capability)
- SupportsSelectFunctions(Command Capability)
- SupportsSelectDistinct(Command Capability)
- SupportsSelectOrdering(Command Capability)
- SupportsSelectGrouping(Command Capability)
- CategoryType(Expression Capability)
- SignatureDefinitionCollection(Expression Capability) instead of ArgumentDefinitionList
The new Provider Capabilities schema is shown below.
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:element name="FeatureProviderCapabilities" type="FdoProviderCapabilities"/> <xs:complexType name="FdoProviderCapabilities"> <xs:sequence> <xs:element name="Provider"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="Name" type="xs:string" use="required"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> <xs:element name="Connection" minOccurs="0"> <xs:complexType> <xs:sequence> <xs:element name="ThreadCapability"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="SingleThreaded"/> <xs:enumeration value="PerConnectionThreaded"/> <xs:enumeration value="PerCommandThreaded"/> <xs:enumeration value="MultiThreaded"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="SpatialContextExtent"> <xs:annotation> <xs:documentation>Static or Dynamic. Could be enumeration here.</xs:documentation> </xs:annotation> <xs:complexType> <xs:sequence> <xs:element name="Type" maxOccurs="unbounded"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="Static"/> <xs:enumeration value="Dynamic"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="SupportsLocking" type="xs:boolean"/> <xs:element name="SupportsTimeout" type="xs:boolean"/> <xs:element name="SupportsTransactions" type="xs:boolean"/> <xs:element name="SupportsLongTransactions" type="xs:boolean"/> <xs:element name="SupportsSQL" type="xs:boolean"/> <xs:element name="SupportsConfiguration" type="xs:boolean"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="Schema" minOccurs="0"> <xs:complexType> <xs:sequence> <xs:element name="Class"> <xs:complexType> <xs:sequence> <xs:element name="Type" maxOccurs="unbounded"> <xs:annotation> <xs:documentation>Class or FeatureClass enum value here</xs:documentation> </xs:annotation> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="Class"/> <xs:enumeration value="FeatureClass"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="Data"> <xs:complexType> <xs:sequence> <xs:element name="Type" maxOccurs="unbounded"> <xs:annotation> <xs:documentation>Enum of data types Boolean, Byte, DateTime, Decimal, Double, Int16, Int32, Int64, Single, String, BLOB, CLOB, UniqueID </xs:documentation> </xs:annotation> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="Boolean"/> <xs:enumeration value="Byte"/> <xs:enumeration value="DateTime"/> <xs:enumeration value="Decimal"/> <xs:enumeration value="Double"/> <xs:enumeration value="Int16"/> <xs:enumeration value="Int32"/> <xs:enumeration value="Int64"/> <xs:enumeration value="Single"/> <xs:enumeration value="String"/> <xs:enumeration value="BLOB"/> <xs:enumeration value="CLOB"/> <xs:enumeration value="UniqueID"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="SupportsInheritance" type="xs:boolean"/> <xs:element name="SupportsMultipleSchemas" type="xs:boolean"/> <xs:element name="SupportsObjectProperties" type="xs:boolean"/> <xs:element name="SupportsAssociationProperties" type="xs:boolean"/> <xs:element name="SupportsSchemaOverrides" type="xs:boolean"/> <xs:element name="SupportsNetworkModel" type="xs:boolean"/> <xs:element name="SupportsAutoIdGeneration" type="xs:boolean"/> <xs:element name="SupportsDataStoreScopeUniqueIdGeneration" type="xs:boolean"/> <xs:element name="SupportedAutoGeneratedTypes" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="Type" minOccurs="0"> <xs:annotation> <xs:documentation>Enum of data types Boolean, Byte, DateTime, Decimal, Double, Int16, Int32, Int64, Single, String, BLOB, CLOB, UniqueID </xs:documentation> </xs:annotation> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="Boolean"/> <xs:enumeration value="Byte"/> <xs:enumeration value="DateTime"/> <xs:enumeration value="Decimal"/> <xs:enumeration value="Double"/> <xs:enumeration value="Int16"/> <xs:enumeration value="Int32"/> <xs:enumeration value="Int64"/> <xs:enumeration value="Single"/> <xs:enumeration value="String"/> <xs:enumeration value="BLOB"/> <xs:enumeration value="CLOB"/> <xs:enumeration value="UniqueID"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="SupportsSchemaModification" type="xs:boolean"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="Command" minOccurs="0"> <xs:complexType> <xs:sequence> <xs:element name="SupportedCommands"> <xs:complexType> <xs:sequence> <xs:element name="Name" maxOccurs="unbounded"> <xs:annotation> <xs:documentation> Following is the possible list of commands Select,Insert,Delete,Update,DescribeSchema,DescribeSchemaMapping, ApplySchema,DestroySchema,ActivateSpatialContext,CreateSpatialContext,DestroySpatialContext,GetSpatialContexts, CreateMeasureUnit,DestroyMeasureUnit,GetMeasureUnits,SQLCommand,AcquireLock,GetLockInfo,GetLockedObjects,GetLockOwners,ReleaseLock, ActivateLongTransaction,DeactivateLongTransaction,CommitLongTransaction,CreateLongTransaction,GetLongTransactions,FreezeLongTransaction,RollbackLongTransaction, ActivateLongTransactionCheckpoint,CreateLongTransactionCheckpoint,GetLongTransactionCheckpoints,RollbackLongTransactionCheckpoint, ChangeLongTransactionPrivileges,GetLongTransactionPrivileges,ChangeLongTransactionSet,GetLongTransactionsInSet,NetworkShortestPath,NetworkAllPaths, NetworkReachableNodes,FirstProviderCommand,NetworkNearestNeighbors,NetworkWithinCost,NetworkTSP,ActivateTopologyArea,DeactivateTopologyArea, ActivateTopologyInCommandResult,DeactivateTopologyInCommandResults,SelectAggregates,CreateDataStore,DestroyDataStore,ListDataStores,FirstProviderCommand </xs:documentation> </xs:annotation> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="Select"/> <xs:enumeration value="Insert"/> <xs:enumeration value="Delete"/> <xs:enumeration value="Update"/> <xs:enumeration value="DescribeSchema"/> <xs:enumeration value="DescribeSchemaMapping"/> <xs:enumeration value="ApplySchema"/> <xs:enumeration value="DestroySchema"/> <xs:enumeration value="ActivateSpatialContext"/> <xs:enumeration value="CreateSpatialContext"/> <xs:enumeration value="DestroySpatialContext"/> <xs:enumeration value="GetSpatialContexts"/> <xs:enumeration value="CreateMeasureUnit"/> <xs:enumeration value="DestroyMeasureUnit"/> <xs:enumeration value="GetMeasureUnits"/> <xs:enumeration value="SQLCommand"/> <xs:enumeration value="AcquireLock"/> <xs:enumeration value="GetLockInfo"/> <xs:enumeration value="GetLockedObjects"/> <xs:enumeration value="GetLockOwners"/> <xs:enumeration value="ReleaseLock"/> <xs:enumeration value="ActivateLongTransaction"/> <xs:enumeration value="DeactivateLongTransaction"/> <xs:enumeration value="CommitLongTransaction"/> <xs:enumeration value="CreateLongTransaction"/> <xs:enumeration value="GetLongTransactions"/> <xs:enumeration value="FreezeLongTransaction"/> <xs:enumeration value="RollbackLongTransaction"/> <xs:enumeration value="ActivateLongTransactionCheckpoint"/> <xs:enumeration value="CreateLongTransactionCheckpoint"/> <xs:enumeration value="GetLongTransactionCheckpoints"/> <xs:enumeration value="RollbackLongTransactionCheckpoint"/> <xs:enumeration value="ChangeLongTransactionPrivileges"/> <xs:enumeration value="GetLongTransactionPrivileges"/> <xs:enumeration value="ChangeLongTransactionSet"/> <xs:enumeration value="GetLongTransactionsInSet"/> <xs:enumeration value="NetworkShortestPath"/> <xs:enumeration value="NetworkAllPaths"/> <xs:enumeration value="NetworkReachableNodes"/> <xs:enumeration value="NetworkReachingNodes"/> <xs:enumeration value="NetworkNearestNeighbors"/> <xs:enumeration value="NetworkWithinCost"/> <xs:enumeration value="NetworkTSP"/> <xs:enumeration value="ActivateTopologyArea"/> <xs:enumeration value="DeactivateTopologyArea"/> <xs:enumeration value="ActivateTopologyInCommandResult"/> <xs:enumeration value="DeactivateTopologyInCommandResults"/> <xs:enumeration value="SelectAggregates"/> <xs:enumeration value="CreateDataStore"/> <xs:enumeration value="DestroyDataStore"/> <xs:enumeration value="ListDataStores"/> <xs:enumeration value="FirstProviderCommand"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="SupportsParameters" type="xs:boolean"/> <xs:element name="SupportsTimeout" type="xs:boolean"/> <xs:element name="SupportsSelectExpressions" type="xs:boolean"/> <xs:element name="SupportsSelectFunctions" type="xs:boolean"/> <xs:element name="SupportsSelectDistinct" type="xs:boolean"/> <xs:element name="SupportsSelectOrdering" type="xs:boolean"/> <xs:element name="SupportsSelectGrouping" type="xs:boolean"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="Filter" minOccurs="0"> <xs:complexType> <xs:sequence> <xs:element name="Condition" minOccurs="0"> <xs:complexType> <xs:sequence> <xs:element name="Type" maxOccurs="unbounded"> <xs:annotation> <xs:documentation>List of ConditionType is as follows: Comparison,Like,In,Null,Spatial,Distance</xs:documentation> </xs:annotation> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="Comparison"/> <xs:enumeration value="Like"/> <xs:enumeration value="In"/> <xs:enumeration value="Null"/> <xs:enumeration value="Spatial"/> <xs:enumeration value="Distance"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="Spatial" minOccurs="0"> <xs:complexType> <xs:sequence> <xs:element name="Operation" maxOccurs="unbounded"> <xs:annotation> <xs:documentation>List of spatial operations : Contains,Crosses, Disjoint,Equals, Intersects,Overlaps,Touches,Within, CoveredBy,Inside</xs:documentation> </xs:annotation> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="Contains"/> <xs:enumeration value="Crosses"/> <xs:enumeration value="Disjoint"/> <xs:enumeration value="Equals"/> <xs:enumeration value="Intersects"/> <xs:enumeration value="Overlaps"/> <xs:enumeration value="Touches"/> <xs:enumeration value="Within"/> <xs:enumeration value="CoveredBy"/> <xs:enumeration value="Inside"/> <xs:enumeration value="EnvelopeIntersects"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="Distance" minOccurs="0"> <xs:complexType> <xs:sequence> <xs:element name="Operation" maxOccurs="unbounded"> <xs:annotation> <xs:documentation>List of distance operations : Beyond, Within</xs:documentation> </xs:annotation> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="Beyond"/> <xs:enumeration value="Within"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="SupportsGeodesicDistance" type="xs:boolean"/> <xs:element name="SupportsNonLiteralGeometricOperations" type="xs:boolean"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="Expression" minOccurs="0"> <xs:complexType> <xs:sequence> <xs:element name="Type"> <xs:complexType> <xs:sequence> <xs:element name="Name" maxOccurs="unbounded"> <xs:annotation> <xs:documentation>List of Expression types are Basic, Function, Parameter</xs:documentation> </xs:annotation> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="Basic"/> <xs:enumeration value="Function"/> <xs:enumeration value="Parameter"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="FunctionDefinitionList" minOccurs="0"> <xs:complexType> <xs:sequence> <xs:element name="FunctionDefinition" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="Name" type="xs:string"/> <xs:element name="Description" type="xs:string" minOccurs="0"/> <xs:element name="CategoryType"> <xs:annotation> <xs:documentation>Enum of category types Aggregate, Conversion, Custom, Date, Geometry, Math, Numeric, String, Unspecified </xs:documentation> </xs:annotation> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="Aggregate"/> <xs:enumeration value="Conversion"/> <xs:enumeration value="Custom"/> <xs:enumeration value="Date"/> <xs:enumeration value="Geometry"/> <xs:enumeration value="Math"/> <xs:enumeration value="Numeric"/> <xs:enumeration value="String"/> <xs:enumeration value="Unspecified"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="IsAggregate" type="xs:boolean"/> <xs:element name="SignatureDefinitionCollection" minOccurs="0"> <xs:complexType> <xs:sequence> <xs:element name="SignatureDefinition" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="PropertyType" minOccurs="0"> <xs:annotation> <xs:documentation>Enum of property types Data, Geometry, Object, Decimal, Raster </xs:documentation> </xs:annotation> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="Data"/> <xs:enumeration value="Geometry"/> <xs:enumeration value="Object"/> <xs:enumeration value="Association"/> <xs:enumeration value="Raster"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="DataType" minOccurs="0"> <xs:annotation> <xs:documentation>Enum of data types Boolean, Byte, DateTime, Decimal, Double, Int16, Int32, Int64, Single, String, BLOB, CLOB, UniqueID </xs:documentation> </xs:annotation> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="Boolean"/> <xs:enumeration value="Byte"/> <xs:enumeration value="DateTime"/> <xs:enumeration value="Decimal"/> <xs:enumeration value="Double"/> <xs:enumeration value="Int16"/> <xs:enumeration value="Int32"/> <xs:enumeration value="Int64"/> <xs:enumeration value="Single"/> <xs:enumeration value="String"/> <xs:enumeration value="BLOB"/> <xs:enumeration value="CLOB"/> <xs:enumeration value="UniqueID"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="ArgumentDefinitionList" minOccurs="0"> <xs:complexType> <xs:sequence> <xs:element name="Name" type="xs:string"/> <xs:element name="Description" type="xs:string" minOccurs="0"/> <xs:element name="ArgumentDefinition" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="Name" type="xs:string"/> <xs:element name="Description" type="xs:string" minOccurs="0"/> <xs:element name="PropertyType"> <xs:annotation> <xs:documentation>Enum of property types Data, Geometry, Object, Decimal, Raster </xs:documentation> </xs:annotation> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="Data"/> <xs:enumeration value="Geometry"/> <xs:enumeration value="Object"/> <xs:enumeration value="Association"/> <xs:enumeration value="Raster"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="DataType" minOccurs="0"> <xs:annotation> <xs:documentation>Enum of data types Boolean, Byte, DateTime, Decimal, Double, Int16, Int32, Int64, Single, String, BLOB, CLOB, UniqueID </xs:documentation> </xs:annotation> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="Boolean"/> <xs:enumeration value="Byte"/> <xs:enumeration value="DateTime"/> <xs:enumeration value="Decimal"/> <xs:enumeration value="Double"/> <xs:enumeration value="Int16"/> <xs:enumeration value="Int32"/> <xs:enumeration value="Int64"/> <xs:enumeration value="Single"/> <xs:enumeration value="String"/> <xs:enumeration value="BLOB"/> <xs:enumeration value="CLOB"/> <xs:enumeration value="UniqueID"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="PropertyValueConstraintList" minOccurs="0"> <xs:complexType> <xs:sequence> <xs:element name="Value" type="xs:string" maxOccurs="unbounded"> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="PropertyType"> <xs:annotation> <xs:documentation>Enum of property types Data, Geometry, Object, Decimal, Raster </xs:documentation> </xs:annotation> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="Data"/> <xs:enumeration value="Geometry"/> <xs:enumeration value="Object"/> <xs:enumeration value="Association"/> <xs:enumeration value="Raster"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="DataType" minOccurs="0"> <xs:annotation> <xs:documentation>Enum of data types Boolean, Byte, DateTime, Decimal, Double, Int16, Int32, Int64, Single, String, BLOB, CLOB, UniqueID </xs:documentation> </xs:annotation> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="Boolean"/> <xs:enumeration value="Byte"/> <xs:enumeration value="DateTime"/> <xs:enumeration value="Decimal"/> <xs:enumeration value="Double"/> <xs:enumeration value="Int16"/> <xs:enumeration value="Int32"/> <xs:enumeration value="Int64"/> <xs:enumeration value="Single"/> <xs:enumeration value="String"/> <xs:enumeration value="BLOB"/> <xs:enumeration value="CLOB"/> <xs:enumeration value="UniqueID"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="Raster"> <xs:complexType> <xs:sequence> <xs:element name="SupportsRaster" type="xs:boolean"/> <xs:element name="SupportsStitching" type="xs:boolean"/> <xs:element name="SupportsSubsampling" type="xs:boolean"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="Topology" minOccurs="0"> <xs:complexType> <xs:sequence> <xs:element name="SupportsTopology" type="xs:boolean"/> <xs:element name="SupportsTopologicalHierarchy" type="xs:boolean"/> <xs:element name="BreaksCurveCrossingsAutomatically" type="xs:boolean"/> <xs:element name="ActivatesTopologyByArea" type="xs:boolean"/> <xs:element name="ConstrainsFeatureMovements" type="xs:boolean"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="Geometry" minOccurs="0"> <xs:complexType> <xs:sequence> <xs:element name="Types"> <xs:complexType> <xs:sequence> <xs:element name="Type" maxOccurs="unbounded"> <xs:annotation> <xs:documentation>Enum of geometry types None, Point, LineString, Polygon, MultiPoint, MultiLineString, MultiPolygon, MultiGeometry, CurveString, CurvePolygon, MultiCurveString, MultiCurvePolygon</xs:documentation> </xs:annotation> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="None"/> <xs:enumeration value="Point"/> <xs:enumeration value="LineString"/> <xs:enumeration value="Polygon"/> <xs:enumeration value="MultiPoint"/> <xs:enumeration value="MultiLineString"/> <xs:enumeration value="MultiPolygon"/> <xs:enumeration value="MultiGeometry"/> <xs:enumeration value="CurveString"/> <xs:enumeration value="CurvePolygon"/> <xs:enumeration value="MultiCurveString"/> <xs:enumeration value="MultiCurvePolygon"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="Components"> <xs:complexType> <xs:sequence> <xs:element name="Type" maxOccurs="unbounded"> <xs:annotation> <xs:documentation>Enum of geometry component types LinearRing, ArcSegment, LinearSegment, CurveRing</xs:documentation> </xs:annotation> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="LinearRing"/> <xs:enumeration value="ArcSegment"/> <xs:enumeration value="LinearSegment"/> <xs:enumeration value="CurveRing"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="Dimensionality" type="xs:integer"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:schema>
Implications
None.
Test Plan
Verify the new capabilities are returned by the request.
Funding/Resources
Supplied by Autodesk.