<?xml version="1.0" encoding="UTF-8"?><database name="amf" schema="public" type="PostgreSQL - 15.3 (Debian 15.3-1.pgdg110+1)">
   <tables>
      <table name="__EFMigrationsHistory" numRows="32" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="null" digits="0" id="0" name="MigrationId" nullable="false" remarks="" size="150" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="ProductVersion" nullable="false" remarks="" size="32" type="varchar" typeCode="12"/>
         <primaryKey column="MigrationId" sequenceNumberInPK="1"/>
         <index name="PK___EFMigrationsHistory" unique="true">
            <column ascending="true" name="MigrationId"/>
         </index>
      </table>
      <table name="attachments" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_attachments_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="name" nullable="false" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="feature_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_attachments_features_feature_id" implied="false" onDeleteCascade="true" schema="public" table="features"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="4" name="mime_type" nullable="false" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="5" name="data" nullable="false" remarks="" size="2147483647" type="bytea" typeCode="-2"/>
         <column autoUpdated="false" defaultValue="0" digits="0" id="6" name="type" nullable="false" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="7" name="thumbnail" nullable="true" remarks="" size="2147483647" type="bytea" typeCode="-2"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="8" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="9" name="created_by" nullable="true" remarks="User who create the record. Null if System." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="10" name="updated_at" nullable="true" remarks="DateTime the record was last updated." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="11" name="updated_by" nullable="true" remarks="User who last updated the record." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="12" name="is_system" nullable="false" remarks="A system-generated record. Default = false" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="13" name="description" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_attachments" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_attachments_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_attachments_feature_id" unique="false">
            <column ascending="true" name="feature_id"/>
         </index>
         <index name="IX_attachments_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_attachments_is_system" unique="false">
            <column ascending="true" name="is_system"/>
         </index>
         <index name="IX_attachments_name" unique="false">
            <column ascending="true" name="name"/>
         </index>
         <index name="IX_attachments_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
         <index name="IX_attachments_type" unique="false">
            <column ascending="true" name="type"/>
         </index>
      </table>
      <table name="attributes" numRows="28" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_attributes_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="name" nullable="false" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="element_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_attributes_elements_element_id" implied="false" onDeleteCascade="true" schema="public" table="elements"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="4" name="constraint_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_attributes_constraints_constraint_id" implied="false" onDeleteCascade="false" schema="public" table="constraints"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="5" name="display_name" nullable="true" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="6" name="index" nullable="true" remarks="Display index (only positive numbers)" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="7" name="data_index" nullable="true" remarks="Index used for specific external structures (only positive numbers)" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="8" name="category_name" nullable="true" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="0" digits="0" id="9" name="data_type" nullable="false" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="0" digits="0" id="10" name="data_context" nullable="false" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="11" name="expression" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="12" name="format" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="13" name="default_value" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="14" name="is_hidden" nullable="false" remarks="" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="15" name="is_readonly" nullable="false" remarks="" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="16" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="17" name="created_by" nullable="true" remarks="User who create the record. Null if System." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="18" name="updated_at" nullable="true" remarks="DateTime the record was last updated." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="19" name="updated_by" nullable="true" remarks="User who last updated the record." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="20" name="is_system" nullable="false" remarks="A system-generated record. Default = false" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="21" name="description" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_attributes" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_attributes_constraint_id" unique="false">
            <column ascending="true" name="constraint_id"/>
         </index>
         <index name="IX_attributes_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_attributes_data_context" unique="false">
            <column ascending="true" name="data_context"/>
         </index>
         <index name="IX_attributes_data_type" unique="false">
            <column ascending="true" name="data_type"/>
         </index>
         <index name="IX_attributes_element_id" unique="false">
            <column ascending="true" name="element_id"/>
         </index>
         <index name="IX_attributes_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_attributes_is_system" unique="false">
            <column ascending="true" name="is_system"/>
         </index>
         <index name="IX_attributes_name" unique="false">
            <column ascending="true" name="name"/>
         </index>
         <index name="IX_attributes_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
      </table>
      <table name="baselayers" numRows="6" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_baselayers_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="name" nullable="false" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="map_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_baselayers_maps_map_id" implied="false" onDeleteCascade="true" schema="public" table="maps"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="4" name="basemap_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_baselayers_basemaps_basemap_id" implied="false" onDeleteCascade="true" schema="public" table="basemaps"/>
         </column>
         <column autoUpdated="false" defaultValue="false" digits="0" id="5" name="is_selected" nullable="false" remarks="" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="6" name="index" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="7" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="8" name="created_by" nullable="true" remarks="User who create the record. Null if System." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="9" name="updated_at" nullable="true" remarks="DateTime the record was last updated." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="10" name="updated_by" nullable="true" remarks="User who last updated the record." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="11" name="is_system" nullable="false" remarks="A system-generated record. Default = false" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="12" name="description" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_baselayers" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_baselayers_basemap_id" unique="false">
            <column ascending="true" name="basemap_id"/>
         </index>
         <index name="IX_baselayers_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_baselayers_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_baselayers_is_system" unique="false">
            <column ascending="true" name="is_system"/>
         </index>
         <index name="IX_baselayers_map_id" unique="false">
            <column ascending="true" name="map_id"/>
         </index>
         <index name="IX_baselayers_name" unique="false">
            <column ascending="true" name="name"/>
         </index>
         <index name="IX_baselayers_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
      </table>
      <table name="basemaps" numRows="25" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111">
            <child column="basemap_id" foreignKey="FK_baselayers_basemaps_basemap_id" implied="false" onDeleteCascade="true" schema="public" table="baselayers"/>
            <child column="parent_id" foreignKey="FK_basemaps_basemaps_parent_id" implied="false" onDeleteCascade="true" schema="public" table="basemaps"/>
            <child column="basemap_id" foreignKey="FK_layers_basemaps_basemap_id" implied="false" onDeleteCascade="false" schema="public" table="layers"/>
            <child column="basemap_id" foreignKey="FK_maps_basemaps_basemap_id" implied="false" onDeleteCascade="false" schema="public" table="maps"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_basemaps_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="name" nullable="false" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="service" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="4" name="url" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="5" name="layers" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="6" name="styles" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="7" name="format" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="8" name="version" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="9" name="min_scale" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="10" name="max_scale" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="11" name="is_composite" nullable="false" remarks="" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="12" name="is_transparent" nullable="false" remarks="" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="13" name="is_tiled" nullable="false" remarks="" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="14" name="is_light" nullable="false" remarks="" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="15" name="parent_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_basemaps_basemaps_parent_id" implied="false" onDeleteCascade="true" schema="public" table="basemaps"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="16" name="index" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="17" name="thumbnail" nullable="true" remarks="" size="2147483647" type="bytea" typeCode="-2"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="18" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="19" name="created_by" nullable="true" remarks="User who create the record. Null if System." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="20" name="updated_at" nullable="true" remarks="DateTime the record was last updated." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="21" name="updated_by" nullable="true" remarks="User who last updated the record." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="22" name="is_system" nullable="false" remarks="A system-generated record. Default = false" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="23" name="description" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_basemaps" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_basemaps_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_basemaps_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_basemaps_is_system" unique="false">
            <column ascending="true" name="is_system"/>
         </index>
         <index name="IX_basemaps_name" unique="false">
            <column ascending="true" name="name"/>
         </index>
         <index name="IX_basemaps_parent_id" unique="false">
            <column ascending="true" name="parent_id"/>
         </index>
         <index name="IX_basemaps_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
      </table>
      <table name="constraints" numRows="1" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111">
            <child column="constraint_id" foreignKey="FK_attributes_constraints_constraint_id" implied="false" onDeleteCascade="false" schema="public" table="attributes"/>
            <child column="constraint_id" foreignKey="FK_constraints_members_constraints_constraint_id" implied="false" onDeleteCascade="true" schema="public" table="constraints_members"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_constraints_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="schema_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_constraints_schemas_schema_id" implied="false" onDeleteCascade="true" schema="public" table="schemas"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="name" nullable="false" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="4" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="5" name="created_by" nullable="true" remarks="User who create the record. Null if System." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="6" name="updated_at" nullable="true" remarks="DateTime the record was last updated." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="7" name="updated_by" nullable="true" remarks="User who last updated the record." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="8" name="is_system" nullable="false" remarks="A system-generated record. Default = false" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="9" name="description" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="10" name="column_name" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="11" name="table_name" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="0" digits="0" id="12" name="type" nullable="false" remarks="Type of the constraint. Options: 0 - List (Default, when constraint members get specified by &quot;constraints_members&quot; table), 1 - Table (when constraint members get specified by TableName and ColumnName properties), 2 - Range (reserved for future use)." size="10" type="int4" typeCode="4"/>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_constraints" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_constraints_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_constraints_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_constraints_is_system" unique="false">
            <column ascending="true" name="is_system"/>
         </index>
         <index name="IX_constraints_name" unique="false">
            <column ascending="true" name="name"/>
         </index>
         <index name="IX_constraints_schema_id" unique="false">
            <column ascending="true" name="schema_id"/>
         </index>
         <index name="IX_constraints_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
      </table>
      <table name="constraints_members" numRows="6" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_constraints_members_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="constraint_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_constraints_members_constraints_constraint_id" implied="false" onDeleteCascade="true" schema="public" table="constraints"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="key" nullable="false" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="4" name="value" nullable="false" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="5" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_constraints_members" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_constraints_members_constraint_id" unique="false">
            <column ascending="true" name="constraint_id"/>
         </index>
         <index name="IX_constraints_members_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_constraints_members_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_constraints_members_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
      </table>
      <table name="domains" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111">
            <child column="parent_id" foreignKey="FK_domains_domains_parent_id" implied="false" onDeleteCascade="true" schema="public" table="domains"/>
            <child column="domain_id" foreignKey="FK_domains_elements_domains_domain_id" implied="false" onDeleteCascade="true" schema="public" table="domains_elements"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_domains_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="name" nullable="false" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="schema_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_domains_schemas_schema_id" implied="false" onDeleteCascade="true" schema="public" table="schemas"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="4" name="display_name" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="5" name="parent_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_domains_domains_parent_id" implied="false" onDeleteCascade="true" schema="public" table="domains"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="6" name="index" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="7" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="8" name="created_by" nullable="true" remarks="User who create the record. Null if System." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="9" name="updated_at" nullable="true" remarks="DateTime the record was last updated." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="10" name="updated_by" nullable="true" remarks="User who last updated the record." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="11" name="is_system" nullable="false" remarks="A system-generated record. Default = false" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="12" name="description" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_domains" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_domains_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_domains_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_domains_is_system" unique="false">
            <column ascending="true" name="is_system"/>
         </index>
         <index name="IX_domains_name" unique="false">
            <column ascending="true" name="name"/>
         </index>
         <index name="IX_domains_parent_id" unique="false">
            <column ascending="true" name="parent_id"/>
         </index>
         <index name="IX_domains_schema_id" unique="false">
            <column ascending="true" name="schema_id"/>
         </index>
         <index name="IX_domains_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
      </table>
      <table name="domains_elements" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="null" digits="0" id="0" name="domain_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_domains_elements_domains_domain_id" implied="false" onDeleteCascade="true" schema="public" table="domains"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="element_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_domains_elements_elements_element_id" implied="false" onDeleteCascade="true" schema="public" table="elements"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="tenant_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_domains_elements_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <primaryKey column="domain_id" sequenceNumberInPK="1"/>
         <primaryKey column="element_id" sequenceNumberInPK="2"/>
         <index name="PK_domains_elements" unique="true">
            <column ascending="true" name="domain_id"/>
            <column ascending="true" name="element_id"/>
         </index>
         <index name="IX_domains_elements_element_id" unique="false">
            <column ascending="true" name="element_id"/>
         </index>
         <index name="IX_domains_elements_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
      </table>
      <table name="elements" numRows="17" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111">
            <child column="element_id" foreignKey="FK_attributes_elements_element_id" implied="false" onDeleteCascade="true" schema="public" table="attributes"/>
            <child column="element_id" foreignKey="FK_domains_elements_elements_element_id" implied="false" onDeleteCascade="true" schema="public" table="domains_elements"/>
            <child column="parent_id" foreignKey="FK_elements_elements_parent_id" implied="false" onDeleteCascade="true" schema="public" table="elements"/>
            <child column="element_id" foreignKey="FK_features_elements_element_id" implied="false" onDeleteCascade="true" schema="public" table="features"/>
            <child column="element_id" foreignKey="FK_layers_elements_element_id" implied="false" onDeleteCascade="false" schema="public" table="layers"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_elements_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="schema_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_elements_schemas_schema_id" implied="false" onDeleteCascade="true" schema="public" table="schemas"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="name" nullable="false" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="4" name="display_name" nullable="true" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="5" name="class_id" nullable="true" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="6" name="parent_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_elements_elements_parent_id" implied="false" onDeleteCascade="true" schema="public" table="elements"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="7" name="index" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="0" digits="0" id="8" name="geometry_type" nullable="false" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="9" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="10" name="created_by" nullable="true" remarks="User who create the record. Null if System." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="11" name="updated_at" nullable="true" remarks="DateTime the record was last updated." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="12" name="updated_by" nullable="true" remarks="User who last updated the record." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="13" name="is_system" nullable="false" remarks="A system-generated record. Default = false" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="14" name="description" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_elements" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_elements_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_elements_geometry_type" unique="false">
            <column ascending="true" name="geometry_type"/>
         </index>
         <index name="IX_elements_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_elements_is_system" unique="false">
            <column ascending="true" name="is_system"/>
         </index>
         <index name="IX_elements_name" unique="false">
            <column ascending="true" name="name"/>
         </index>
         <index name="IX_elements_parent_id" unique="false">
            <column ascending="true" name="parent_id"/>
         </index>
         <index name="IX_elements_schema_id" unique="false">
            <column ascending="true" name="schema_id"/>
         </index>
         <index name="IX_elements_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
      </table>
      <table name="features" numRows="3887" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111">
            <child column="feature_id" foreignKey="FK_attachments_features_feature_id" implied="false" onDeleteCascade="true" schema="public" table="attachments"/>
            <child column="parent_id" foreignKey="FK_features_features_parent_id" implied="false" onDeleteCascade="true" schema="public" table="features"/>
            <child column="feature_id" foreignKey="FK_features_locks_features_feature_id" implied="false" onDeleteCascade="true" schema="public" table="features_locks"/>
            <child column="feature_id" foreignKey="FK_features_versions_features_feature_id" implied="false" onDeleteCascade="true" schema="public" table="features_versions"/>
            <child column="feature_id" foreignKey="FK_sms_hiboo_equipment_features_feature_id" implied="false" onDeleteCascade="false" schema="public" table="sms_hiboo_equipment"/>
            <child column="feature_id" foreignKey="FK_sms_loader_daily_zone_features_feature_id" implied="false" onDeleteCascade="false" schema="public" table="sms_loader_daily_zone"/>
            <child column="feature_id" foreignKey="FK_sms_loader_move_features_feature_id" implied="false" onDeleteCascade="false" schema="public" table="sms_loader_move"/>
            <child column="feature_id" foreignKey="FK_sms_machine_features_feature_id" implied="false" onDeleteCascade="false" schema="public" table="sms_machine"/>
            <child column="feature_id" foreignKey="FK_sms_scraper_cycle_features_feature_id" implied="false" onDeleteCascade="false" schema="public" table="sms_scraper_cycle"/>
            <child column="feature_id" foreignKey="FK_sms_scraper_daily_zone_features_feature_id" implied="false" onDeleteCascade="false" schema="public" table="sms_scraper_daily_zone"/>
            <child column="feature_id" foreignKey="FK_sms_scraper_move_features_feature_id" implied="false" onDeleteCascade="false" schema="public" table="sms_scraper_move"/>
            <child column="feature_id" foreignKey="FK_sms_truck_cycle_features_feature_id" implied="false" onDeleteCascade="false" schema="public" table="sms_truck_cycle"/>
            <child column="feature_id" foreignKey="FK_sms_truck_daily_zone_features_feature_id" implied="false" onDeleteCascade="false" schema="public" table="sms_truck_daily_zone"/>
            <child column="feature_id" foreignKey="FK_sms_truck_move_features_feature_id" implied="false" onDeleteCascade="false" schema="public" table="sms_truck_move"/>
            <child column="feature_id" foreignKey="FK_sms_zone_features_feature_id" implied="false" onDeleteCascade="false" schema="public" table="sms_zone"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_features_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="parent_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_features_features_parent_id" implied="false" onDeleteCascade="true" schema="public" table="features"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="element_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_features_elements_element_id" implied="false" onDeleteCascade="true" schema="public" table="elements"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="4" name="geometry" nullable="true" remarks="" size="2147483647" type="geometry" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="5" name="properties" nullable="true" remarks="" size="2147483647" type="jsonb" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="6" name="valid_from" nullable="false" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="7" name="valid_to" nullable="true" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="8" name="deleted_at" nullable="true" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="9" name="deleted_by" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="10" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="11" name="created_by" nullable="true" remarks="User who create the record. Null if System." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="12" name="updated_at" nullable="true" remarks="DateTime the record was last updated." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="13" name="updated_by" nullable="true" remarks="User who last updated the record." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="14" name="is_system" nullable="false" remarks="A system-generated record. Default = false" size="1" type="bool" typeCode="-7"/>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_features" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_features_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_features_element_id" unique="false">
            <column ascending="true" name="element_id"/>
         </index>
         <index name="IX_features_geometry" unique="false">
            <column ascending="true" name="geometry"/>
         </index>
         <index name="IX_features_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_features_is_system" unique="false">
            <column ascending="true" name="is_system"/>
         </index>
         <index name="IX_features_parent_id" unique="false">
            <column ascending="true" name="parent_id"/>
         </index>
         <index name="IX_features_properties" unique="false">
            <column ascending="true" name="properties"/>
         </index>
         <index name="IX_features_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
         <index name="IX_features_valid_from" unique="false">
            <column ascending="true" name="valid_from"/>
         </index>
         <index name="IX_features_valid_to" unique="false">
            <column ascending="true" name="valid_to"/>
         </index>
      </table>
      <table name="features_locks" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="null" digits="0" id="0" name="feature_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_features_locks_features_feature_id" implied="false" onDeleteCascade="true" schema="public" table="features"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_features_locks_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="2" name="created_at" nullable="false" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="created_by" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_features_locks_users_created_by" implied="false" onDeleteCascade="true" schema="public" table="users"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="6" id="4" name="expires_at" nullable="true" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="5" name="description" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <primaryKey column="feature_id" sequenceNumberInPK="1"/>
         <index name="PK_features_locks" unique="true">
            <column ascending="true" name="feature_id"/>
         </index>
         <index name="IX_features_locks_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_features_locks_created_by" unique="false">
            <column ascending="true" name="created_by"/>
         </index>
         <index name="IX_features_locks_feature_id" unique="true">
            <column ascending="true" name="feature_id"/>
         </index>
         <index name="IX_features_locks_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
      </table>
      <table name="features_versions" numRows="8616866" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="feature_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_features_versions_features_feature_id" implied="false" onDeleteCascade="true" schema="public" table="features"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_features_versions_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="geometry" nullable="true" remarks="" size="2147483647" type="geometry" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="4" name="properties" nullable="true" remarks="" size="2147483647" type="jsonb" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="5" name="valid_from" nullable="false" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="6" name="valid_to" nullable="false" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="7" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_features_versions" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_features_versions_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_features_versions_feature_id" unique="false">
            <column ascending="true" name="feature_id"/>
         </index>
         <index name="IX_features_versions_geometry" unique="false">
            <column ascending="true" name="geometry"/>
         </index>
         <index name="IX_features_versions_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_features_versions_properties" unique="false">
            <column ascending="true" name="properties"/>
         </index>
         <index name="IX_features_versions_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
         <index name="IX_features_versions_valid_from" unique="false">
            <column ascending="true" name="valid_from"/>
         </index>
         <index name="IX_features_versions_valid_to" unique="false">
            <column ascending="true" name="valid_to"/>
         </index>
      </table>
      <table name="geography_columns" numRows="0" remarks="" schema="public" type="VIEW" viewSql=" SELECT current_database() AS f_table_catalog,&#10;    n.nspname AS f_table_schema,&#10;    c.relname AS f_table_name,&#10;    a.attname AS f_geography_column,&#10;    postgis_typmod_dims(a.atttypmod) AS coord_dimension,&#10;    postgis_typmod_srid(a.atttypmod) AS srid,&#10;    postgis_typmod_type(a.atttypmod) AS type&#10;   FROM pg_class c,&#10;    pg_attribute a,&#10;    pg_type t,&#10;    pg_namespace n&#10;  WHERE ((t.typname = 'geography'::name) AND (a.attisdropped = false) AND (a.atttypid = t.oid) AND (a.attrelid = c.oid) AND (c.relnamespace = n.oid) AND (c.relkind = ANY (ARRAY['r'::&quot;char&quot;, 'v'::&quot;char&quot;, 'm'::&quot;char&quot;, 'f'::&quot;char&quot;, 'p'::&quot;char&quot;])) AND (NOT pg_is_other_temp_schema(c.relnamespace)) AND has_table_privilege(c.oid, 'SELECT'::text));">
         <column autoUpdated="false" defaultValue="null" digits="0" id="0" name="f_table_catalog" nullable="true" remarks="" size="2147483647" type="name" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="f_table_schema" nullable="true" remarks="" size="2147483647" type="name" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="f_table_name" nullable="true" remarks="" size="2147483647" type="name" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="f_geography_column" nullable="true" remarks="" size="2147483647" type="name" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="4" name="coord_dimension" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="5" name="srid" nullable="true" remarks="" size="10" type="int4" typeCode="4">
            <parent column="srid" foreignKey="Implied Constraint" implied="true" onDeleteCascade="false" schema="public" table="spatial_ref_sys"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="6" name="type" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
      </table>
      <table name="geometry_columns" numRows="0" remarks="" schema="public" type="VIEW" viewSql=" SELECT (current_database())::character varying(256) AS f_table_catalog,&#10;    n.nspname AS f_table_schema,&#10;    c.relname AS f_table_name,&#10;    a.attname AS f_geometry_column,&#10;    COALESCE(postgis_typmod_dims(a.atttypmod), sn.ndims, 2) AS coord_dimension,&#10;    COALESCE(NULLIF(postgis_typmod_srid(a.atttypmod), 0), sr.srid, 0) AS srid,&#10;    (replace(replace(COALESCE(NULLIF(upper(postgis_typmod_type(a.atttypmod)), 'GEOMETRY'::text), st.type, 'GEOMETRY'::text), 'ZM'::text, ''::text), 'Z'::text, ''::text))::character varying(30) AS type&#10;   FROM ((((((pg_class c&#10;     JOIN pg_attribute a ON (((a.attrelid = c.oid) AND (NOT a.attisdropped))))&#10;     JOIN pg_namespace n ON ((c.relnamespace = n.oid)))&#10;     JOIN pg_type t ON ((a.atttypid = t.oid)))&#10;     LEFT JOIN ( SELECT s.connamespace,&#10;            s.conrelid,&#10;            s.conkey,&#10;            replace(split_part(s.consrc, ''''::text, 2), ')'::text, ''::text) AS type&#10;           FROM ( SELECT pg_constraint.connamespace,&#10;                    pg_constraint.conrelid,&#10;                    pg_constraint.conkey,&#10;                    pg_get_constraintdef(pg_constraint.oid) AS consrc&#10;                   FROM pg_constraint) s&#10;          WHERE (s.consrc ~~* '%geometrytype(% = %'::text)) st ON (((st.connamespace = n.oid) AND (st.conrelid = c.oid) AND (a.attnum = ANY (st.conkey)))))&#10;     LEFT JOIN ( SELECT s.connamespace,&#10;            s.conrelid,&#10;            s.conkey,&#10;            (replace(split_part(s.consrc, ' = '::text, 2), ')'::text, ''::text))::integer AS ndims&#10;           FROM ( SELECT pg_constraint.connamespace,&#10;                    pg_constraint.conrelid,&#10;                    pg_constraint.conkey,&#10;                    pg_get_constraintdef(pg_constraint.oid) AS consrc&#10;                   FROM pg_constraint) s&#10;          WHERE (s.consrc ~~* '%ndims(% = %'::text)) sn ON (((sn.connamespace = n.oid) AND (sn.conrelid = c.oid) AND (a.attnum = ANY (sn.conkey)))))&#10;     LEFT JOIN ( SELECT s.connamespace,&#10;            s.conrelid,&#10;            s.conkey,&#10;            (replace(replace(split_part(s.consrc, ' = '::text, 2), ')'::text, ''::text), '('::text, ''::text))::integer AS srid&#10;           FROM ( SELECT pg_constraint.connamespace,&#10;                    pg_constraint.conrelid,&#10;                    pg_constraint.conkey,&#10;                    pg_get_constraintdef(pg_constraint.oid) AS consrc&#10;                   FROM pg_constraint) s&#10;          WHERE (s.consrc ~~* '%srid(% = %'::text)) sr ON (((sr.connamespace = n.oid) AND (sr.conrelid = c.oid) AND (a.attnum = ANY (sr.conkey)))))&#10;  WHERE ((c.relkind = ANY (ARRAY['r'::&quot;char&quot;, 'v'::&quot;char&quot;, 'm'::&quot;char&quot;, 'f'::&quot;char&quot;, 'p'::&quot;char&quot;])) AND (NOT (c.relname = 'raster_columns'::name)) AND (t.typname = 'geometry'::name) AND (NOT pg_is_other_temp_schema(c.relnamespace)) AND has_table_privilege(c.oid, 'SELECT'::text));">
         <column autoUpdated="false" defaultValue="null" digits="0" id="0" name="f_table_catalog" nullable="true" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="f_table_schema" nullable="true" remarks="" size="2147483647" type="name" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="f_table_name" nullable="true" remarks="" size="2147483647" type="name" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="f_geometry_column" nullable="true" remarks="" size="2147483647" type="name" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="4" name="coord_dimension" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="5" name="srid" nullable="true" remarks="" size="10" type="int4" typeCode="4">
            <parent column="srid" foreignKey="Implied Constraint" implied="true" onDeleteCascade="false" schema="public" table="spatial_ref_sys"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="6" name="type" nullable="true" remarks="" size="30" type="varchar" typeCode="12"/>
      </table>
      <table name="groups" numRows="2" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111">
            <child column="parent_id" foreignKey="FK_groups_groups_parent_id" implied="false" onDeleteCascade="true" schema="public" table="groups"/>
            <child column="group_id" foreignKey="FK_groups_users_groups_group_id" implied="false" onDeleteCascade="true" schema="public" table="groups_users"/>
            <child column="group_id" foreignKey="FK_maps_groups_group_id" implied="false" onDeleteCascade="false" schema="public" table="maps"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_groups_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="name" nullable="false" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="parent_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_groups_groups_parent_id" implied="false" onDeleteCascade="true" schema="public" table="groups"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="4" name="index" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="5" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="6" name="created_by" nullable="true" remarks="User who create the record. Null if System." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="7" name="updated_at" nullable="true" remarks="DateTime the record was last updated." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="8" name="updated_by" nullable="true" remarks="User who last updated the record." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="9" name="is_system" nullable="false" remarks="A system-generated record. Default = false" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="10" name="description" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_groups" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_groups_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_groups_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_groups_is_system" unique="false">
            <column ascending="true" name="is_system"/>
         </index>
         <index name="IX_groups_name" unique="false">
            <column ascending="true" name="name"/>
         </index>
         <index name="IX_groups_parent_id" unique="false">
            <column ascending="true" name="parent_id"/>
         </index>
         <index name="IX_groups_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
         <index name="UQ_groups_tenantid_name" unique="true">
            <column ascending="true" name="tenant_id"/>
            <column ascending="true" name="name"/>
         </index>
      </table>
      <table name="groups_users" numRows="2" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="null" digits="0" id="0" name="group_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_groups_users_groups_group_id" implied="false" onDeleteCascade="true" schema="public" table="groups"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="user_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_groups_users_users_user_id" implied="false" onDeleteCascade="true" schema="public" table="users"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="tenant_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_groups_users_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <primaryKey column="group_id" sequenceNumberInPK="1"/>
         <primaryKey column="user_id" sequenceNumberInPK="2"/>
         <index name="PK_groups_users" unique="true">
            <column ascending="true" name="group_id"/>
            <column ascending="true" name="user_id"/>
         </index>
         <index name="IX_groups_users_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
         <index name="IX_groups_users_user_id" unique="false">
            <column ascending="true" name="user_id"/>
         </index>
      </table>
      <table name="jobs" numRows="1" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111">
            <child column="job_id" foreignKey="FK_jobs_tasks_jobs_job_id" implied="false" onDeleteCascade="true" schema="public" table="jobs_tasks"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_jobs_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="name" nullable="false" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="0" digits="0" id="3" name="type" nullable="false" remarks="Type of the job. Options: 0 - Manual (Default, manual run only), 1 - Automatic (Run automatically based on schedule, if no schedule is supplied - run once on server start), 2 - Disabled." size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="0" digits="0" id="4" name="status" nullable="false" remarks="Status of the last job run. Options: 0 - Stopped (Default), 1 - Running, 2 - Paused." size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="0" digits="0" id="5" name="result" nullable="false" remarks="Result of the last job run. Options: 0 - None (Default, Job was never run), 1 - Pending (Job is executing but no result was yielded yet), 2 - Succeeded (Job succeeded when all of its Tasks succeeded), 3 - Failed (Job failed when any of its Tasks failed). Reset to None on each run." size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="6" name="started_at" nullable="true" remarks="DateTime job was last run. Reset to DateTime.Now on each run." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="7" name="started_by" nullable="true" remarks="User who last run the job. Null if System, reset on each run." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="8" name="duration" nullable="true" remarks="Last job duration in milliseconds. Reset to null on each run." size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="9" name="schedule" nullable="true" remarks="CRON scheduler notation, i.e. &quot;0/5 * * * * ?&quot;." size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="10" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="11" name="created_by" nullable="true" remarks="User who create the record. Null if System." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="12" name="updated_at" nullable="true" remarks="DateTime the record was last updated." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="13" name="updated_by" nullable="true" remarks="User who last updated the record." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="14" name="is_system" nullable="false" remarks="A system-generated record. Default = false" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="15" name="description" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_jobs" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_jobs_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_jobs_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_jobs_is_system" unique="false">
            <column ascending="true" name="is_system"/>
         </index>
         <index name="IX_jobs_name" unique="false">
            <column ascending="true" name="name"/>
         </index>
         <index name="IX_jobs_result" unique="false">
            <column ascending="true" name="result"/>
         </index>
         <index name="IX_jobs_started_at" unique="false">
            <column ascending="true" name="started_at"/>
         </index>
         <index name="IX_jobs_status" unique="false">
            <column ascending="true" name="status"/>
         </index>
         <index name="IX_jobs_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
         <index name="IX_jobs_type" unique="false">
            <column ascending="true" name="type"/>
         </index>
      </table>
      <table name="jobs_tasks" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111">
            <child column="parent_id" foreignKey="FK_jobs_tasks_jobs_tasks_parent_id" implied="false" onDeleteCascade="true" schema="public" table="jobs_tasks"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_jobs_tasks_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="job_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_jobs_tasks_jobs_job_id" implied="false" onDeleteCascade="true" schema="public" table="jobs"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="task_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="4" name="parent_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_jobs_tasks_jobs_tasks_parent_id" implied="false" onDeleteCascade="true" schema="public" table="jobs_tasks"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="5" name="index" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="6" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="7" name="created_by" nullable="true" remarks="User who create the record. Null if System." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="8" name="updated_at" nullable="true" remarks="DateTime the record was last updated." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="9" name="updated_by" nullable="true" remarks="User who last updated the record." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="10" name="is_system" nullable="false" remarks="A system-generated record. Default = false" size="1" type="bool" typeCode="-7"/>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_jobs_tasks" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_jobs_tasks_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_jobs_tasks_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_jobs_tasks_is_system" unique="false">
            <column ascending="true" name="is_system"/>
         </index>
         <index name="IX_jobs_tasks_job_id" unique="false">
            <column ascending="true" name="job_id"/>
         </index>
         <index name="IX_jobs_tasks_parent_id" unique="false">
            <column ascending="true" name="parent_id"/>
         </index>
         <index name="IX_jobs_tasks_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
      </table>
      <table name="layers" numRows="7" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111">
            <child column="layer_id" foreignKey="FK_layers_styles_layers_layer_id" implied="false" onDeleteCascade="true" schema="public" table="layers_styles"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_layers_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="map_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_layers_maps_map_id" implied="false" onDeleteCascade="true" schema="public" table="maps"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="name" nullable="false" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="0" digits="0" id="4" name="type" nullable="false" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="5" name="element_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_layers_elements_element_id" implied="false" onDeleteCascade="false" schema="public" table="elements"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="6" name="basemap_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_layers_basemaps_basemap_id" implied="false" onDeleteCascade="false" schema="public" table="basemaps"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="7" name="label" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="8" name="is_hidden" nullable="false" remarks="" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="9" name="is_selected" nullable="false" remarks="" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="10" name="is_expanded" nullable="false" remarks="" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="11" name="is_selectable" nullable="false" remarks="" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="12" name="is_expandable" nullable="false" remarks="" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="13" name="is_editable" nullable="false" remarks="" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="14" name="group_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_layers_layers_groups_group_id" implied="false" onDeleteCascade="false" schema="public" table="layers_groups"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="15" name="index" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="16" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="17" name="created_by" nullable="true" remarks="User who create the record. Null if System." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="18" name="updated_at" nullable="true" remarks="DateTime the record was last updated." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="19" name="updated_by" nullable="true" remarks="User who last updated the record." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="20" name="is_system" nullable="false" remarks="A system-generated record. Default = false" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="21" name="description" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="0" digits="0" id="22" name="refresh_interval" nullable="false" remarks="" size="10" type="int4" typeCode="4"/>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_layers" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_layers_basemap_id" unique="false">
            <column ascending="true" name="basemap_id"/>
         </index>
         <index name="IX_layers_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_layers_element_id" unique="false">
            <column ascending="true" name="element_id"/>
         </index>
         <index name="IX_layers_group_id" unique="false">
            <column ascending="true" name="group_id"/>
         </index>
         <index name="IX_layers_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_layers_is_system" unique="false">
            <column ascending="true" name="is_system"/>
         </index>
         <index name="IX_layers_map_id" unique="false">
            <column ascending="true" name="map_id"/>
         </index>
         <index name="IX_layers_name" unique="false">
            <column ascending="true" name="name"/>
         </index>
         <index name="IX_layers_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
         <index name="IX_layers_type" unique="false">
            <column ascending="true" name="type"/>
         </index>
      </table>
      <table name="layers_groups" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111">
            <child column="group_id" foreignKey="FK_layers_layers_groups_group_id" implied="false" onDeleteCascade="false" schema="public" table="layers"/>
            <child column="parent_id" foreignKey="FK_layers_groups_layers_groups_parent_id" implied="false" onDeleteCascade="true" schema="public" table="layers_groups"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_layers_groups_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="map_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_layers_groups_maps_map_id" implied="false" onDeleteCascade="true" schema="public" table="maps"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="name" nullable="false" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="4" name="parent_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_layers_groups_layers_groups_parent_id" implied="false" onDeleteCascade="true" schema="public" table="layers_groups"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="5" name="index" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="6" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="7" name="created_by" nullable="true" remarks="User who create the record. Null if System." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="8" name="updated_at" nullable="true" remarks="DateTime the record was last updated." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="9" name="updated_by" nullable="true" remarks="User who last updated the record." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="10" name="is_system" nullable="false" remarks="A system-generated record. Default = false" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="11" name="description" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_layers_groups" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_layers_groups_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_layers_groups_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_layers_groups_is_system" unique="false">
            <column ascending="true" name="is_system"/>
         </index>
         <index name="IX_layers_groups_map_id" unique="false">
            <column ascending="true" name="map_id"/>
         </index>
         <index name="IX_layers_groups_name" unique="false">
            <column ascending="true" name="name"/>
         </index>
         <index name="IX_layers_groups_parent_id" unique="false">
            <column ascending="true" name="parent_id"/>
         </index>
         <index name="IX_layers_groups_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
      </table>
      <table name="layers_styles" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_layers_styles_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="name" nullable="true" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="layer_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_layers_styles_layers_layer_id" implied="false" onDeleteCascade="true" schema="public" table="layers"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="4" name="min_scale" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="5" name="max_scale" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="6" name="index" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="7" name="description" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="8" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_layers_styles" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_layers_styles_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_layers_styles_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_layers_styles_layer_id" unique="false">
            <column ascending="true" name="layer_id"/>
         </index>
         <index name="IX_layers_styles_name" unique="false">
            <column ascending="true" name="name"/>
         </index>
         <index name="IX_layers_styles_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
      </table>
      <table name="maps" numRows="2" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111">
            <child column="map_id" foreignKey="FK_baselayers_maps_map_id" implied="false" onDeleteCascade="true" schema="public" table="baselayers"/>
            <child column="map_id" foreignKey="FK_layers_maps_map_id" implied="false" onDeleteCascade="true" schema="public" table="layers"/>
            <child column="map_id" foreignKey="FK_layers_groups_maps_map_id" implied="false" onDeleteCascade="true" schema="public" table="layers_groups"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_maps_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="name" nullable="false" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="srid" nullable="false" remarks="" size="10" type="int4" typeCode="4">
            <parent column="srid" foreignKey="Implied Constraint" implied="true" onDeleteCascade="false" schema="public" table="spatial_ref_sys"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="4" name="basemap_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_maps_basemaps_basemap_id" implied="false" onDeleteCascade="false" schema="public" table="basemaps"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="5" name="group_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_maps_groups_group_id" implied="false" onDeleteCascade="false" schema="public" table="groups"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="17" id="6" name="center_x" nullable="true" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="7" name="center_y" nullable="true" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="8" name="scale" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="9" name="min_x" nullable="true" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="10" name="min_y" nullable="true" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="11" name="max_x" nullable="true" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="12" name="max_y" nullable="true" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="13" name="min_scale" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="14" name="max_scale" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="15" name="thumbnail" nullable="true" remarks="" size="2147483647" type="bytea" typeCode="-2"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="16" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="17" name="created_by" nullable="true" remarks="User who create the record. Null if System." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="18" name="updated_at" nullable="true" remarks="DateTime the record was last updated." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="19" name="updated_by" nullable="true" remarks="User who last updated the record." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="20" name="is_system" nullable="false" remarks="A system-generated record. Default = false" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="21" name="description" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="22" name="version" nullable="true" remarks="" size="256" type="varchar" typeCode="12"/>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_maps" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_maps_basemap_id" unique="false">
            <column ascending="true" name="basemap_id"/>
         </index>
         <index name="IX_maps_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_maps_group_id" unique="false">
            <column ascending="true" name="group_id"/>
         </index>
         <index name="IX_maps_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_maps_is_system" unique="false">
            <column ascending="true" name="is_system"/>
         </index>
         <index name="IX_maps_name" unique="false">
            <column ascending="true" name="name"/>
         </index>
         <index name="IX_maps_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
      </table>
      <table name="roles" numRows="4" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111">
            <child column="role_id" foreignKey="FK_roles_components_roles_role_id" implied="false" onDeleteCascade="true" schema="public" table="roles_components"/>
            <child column="role_id" foreignKey="FK_users_roles_role_id" implied="false" onDeleteCascade="false" schema="public" table="users"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_roles_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="name" nullable="false" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="3" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="4" name="created_by" nullable="true" remarks="User who create the record. Null if System." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="5" name="updated_at" nullable="true" remarks="DateTime the record was last updated." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="6" name="updated_by" nullable="true" remarks="User who last updated the record." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="7" name="is_system" nullable="false" remarks="A system-generated record. Default = false" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="8" name="description" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_roles" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_roles_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_roles_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_roles_is_system" unique="false">
            <column ascending="true" name="is_system"/>
         </index>
         <index name="IX_roles_name" unique="false">
            <column ascending="true" name="name"/>
         </index>
         <index name="IX_roles_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
         <index name="UQ_roles_tenantid_name" unique="true">
            <column ascending="true" name="tenant_id"/>
            <column ascending="true" name="name"/>
         </index>
      </table>
      <table name="roles_components" numRows="702" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_roles_components_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="role_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_roles_components_roles_role_id" implied="false" onDeleteCascade="true" schema="public" table="roles"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="component_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="0" digits="0" id="4" name="permissions" nullable="false" remarks="" size="10" type="int4" typeCode="4"/>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_roles_components" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_roles_components_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_roles_components_role_id_component_id" unique="true">
            <column ascending="true" name="role_id"/>
            <column ascending="true" name="component_id"/>
         </index>
         <index name="IX_roles_components_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
      </table>
      <table name="schemas" numRows="2" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111">
            <child column="schema_id" foreignKey="FK_constraints_schemas_schema_id" implied="false" onDeleteCascade="true" schema="public" table="constraints"/>
            <child column="schema_id" foreignKey="FK_domains_schemas_schema_id" implied="false" onDeleteCascade="true" schema="public" table="domains"/>
            <child column="schema_id" foreignKey="FK_elements_schemas_schema_id" implied="false" onDeleteCascade="true" schema="public" table="elements"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_schemas_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="name" nullable="false" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="version" nullable="true" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="4" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="5" name="created_by" nullable="true" remarks="User who create the record. Null if System." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="6" name="updated_at" nullable="true" remarks="DateTime the record was last updated." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="7" name="updated_by" nullable="true" remarks="User who last updated the record." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="8" name="is_system" nullable="false" remarks="A system-generated record. Default = false" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="9" name="description" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_schemas" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_schemas_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_schemas_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_schemas_is_system" unique="false">
            <column ascending="true" name="is_system"/>
         </index>
         <index name="IX_schemas_name" unique="false">
            <column ascending="true" name="name"/>
         </index>
         <index name="IX_schemas_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
         <index name="UQ_schemas_tenantid_name" unique="true">
            <column ascending="true" name="tenant_id"/>
            <column ascending="true" name="name"/>
         </index>
      </table>
      <table name="sms_category" remarks="" schema="public" type="TABLE">
         <column autoUpdated="true" defaultValue="null" digits="0" id="0" name="id" nullable="false" remarks="" size="10" type="int4" typeCode="4">
            <child column="category" foreignKey="FK_sms_machine_sms_category_category_tenant_id" implied="false" onDeleteCascade="false" schema="public" table="sms_machine"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <child column="tenant_id" foreignKey="FK_sms_machine_sms_category_category_tenant_id" implied="false" onDeleteCascade="false" schema="public" table="sms_machine"/>
            <parent column="id" foreignKey="FK_sms_category_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="name" nullable="false" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="3" name="created_at" nullable="true" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="4" name="created_by" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="5" name="updated_at" nullable="true" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="6" name="updated_by" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="7" name="is_system" nullable="false" remarks="" size="1" type="bool" typeCode="-7"/>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <primaryKey column="tenant_id" sequenceNumberInPK="2"/>
         <index name="PK_sms_category" unique="true">
            <column ascending="true" name="id"/>
            <column ascending="true" name="tenant_id"/>
         </index>
         <index name="IX_sms_category_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_sms_category_is_system" unique="false">
            <column ascending="true" name="is_system"/>
         </index>
         <index name="IX_sms_category_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
      </table>
      <table name="sms_dozer_parameters" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111">
            <child column="dozer_parameter_id" foreignKey="FK_sms_scraper_cycle_sms_dozer_parameters_dozer_parameter_id" implied="false" onDeleteCascade="false" schema="public" table="sms_scraper_cycle"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_dozer_parameters_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="machine_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_dozer_parameters_sms_machine_machine_id" implied="false" onDeleteCascade="true" schema="public" table="sms_machine"/>
         </column>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="3" name="valid_from" nullable="false" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="4" name="valid_to" nullable="true" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="5" name="deleted_at" nullable="true" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="6" name="cost_per_hour" nullable="false" remarks="" size="5" type="int2" typeCode="5"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="7" name="theoretical_consumption" nullable="false" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="8" name="kg_co2_per_liter" nullable="false" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="9" name="scraper_pusher" nullable="false" remarks="" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="10" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="11" name="created_by" nullable="true" remarks="User who create the record. Null if System." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="12" name="updated_at" nullable="true" remarks="DateTime the record was last updated." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="13" name="updated_by" nullable="true" remarks="User who last updated the record." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="14" name="is_system" nullable="false" remarks="A system-generated record. Default = false" size="1" type="bool" typeCode="-7"/>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_sms_dozer_parameters" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_dozer_parameters_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_sms_dozer_parameters_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_dozer_parameters_is_system" unique="false">
            <column ascending="true" name="is_system"/>
         </index>
         <index name="IX_sms_dozer_parameters_machine_id" unique="false">
            <column ascending="true" name="machine_id"/>
         </index>
         <index name="IX_sms_dozer_parameters_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
         <index name="IX_sms_dozer_parameters_valid_from" unique="false">
            <column ascending="true" name="valid_from"/>
         </index>
         <index name="IX_sms_dozer_parameters_valid_to" unique="false">
            <column ascending="true" name="valid_to"/>
         </index>
      </table>
      <table name="sms_fixed_zone_algo_machine_parameters" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_fixed_zone_algo_machine_parameters_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="machine_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_fixed_zone_algo_machine_parameters_sms_machine_machine_~" implied="false" onDeleteCascade="true" schema="public" table="sms_machine"/>
         </column>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="3" name="valid_from" nullable="false" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="4" name="valid_to" nullable="true" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="5" name="deleted_at" nullable="true" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="6" name="moving_speed_limit" nullable="false" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="7" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="8" name="created_by" nullable="true" remarks="User who create the record. Null if System." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="9" name="updated_at" nullable="true" remarks="DateTime the record was last updated." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="10" name="updated_by" nullable="true" remarks="User who last updated the record." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="11" name="is_system" nullable="false" remarks="A system-generated record. Default = false" size="1" type="bool" typeCode="-7"/>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_sms_fixed_zone_algo_machine_parameters" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_fixed_zone_algo_machine_parameters_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_sms_fixed_zone_algo_machine_parameters_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_fixed_zone_algo_machine_parameters_is_system" unique="false">
            <column ascending="true" name="is_system"/>
         </index>
         <index name="IX_sms_fixed_zone_algo_machine_parameters_machine_id" unique="false">
            <column ascending="true" name="machine_id"/>
         </index>
         <index name="IX_sms_fixed_zone_algo_machine_parameters_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
         <index name="IX_sms_fixed_zone_algo_machine_parameters_valid_from" unique="false">
            <column ascending="true" name="valid_from"/>
         </index>
         <index name="IX_sms_fixed_zone_algo_machine_parameters_valid_to" unique="false">
            <column ascending="true" name="valid_to"/>
         </index>
      </table>
      <table name="sms_fixed_zone_algo_result" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_fixed_zone_algo_result_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="day_id" nullable="false" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="shift_day_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_fixed_zone_algo_result_sms_shift_day_shift_day_id" implied="false" onDeleteCascade="false" schema="public" table="sms_shift_day"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="4" name="machine_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_fixed_zone_algo_result_sms_machine_machine_id" implied="false" onDeleteCascade="false" schema="public" table="sms_machine"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="5" name="zone_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_fixed_zone_algo_result_sms_zone_zone_id" implied="false" onDeleteCascade="false" schema="public" table="sms_zone"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="6" name="type" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="7" name="start_date" nullable="false" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="8" name="duration" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="9" name="distance" nullable="true" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="10" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="11" name="shift_day_name" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_sms_fixed_zone_algo_result" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_fixed_zone_algo_result_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_sms_fixed_zone_algo_result_day_id" unique="false">
            <column ascending="true" name="day_id"/>
         </index>
         <index name="IX_sms_fixed_zone_algo_result_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_fixed_zone_algo_result_shift_day_id" unique="false">
            <column ascending="true" name="shift_day_id"/>
         </index>
         <index name="IX_sms_fixed_zone_algo_result_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
         <index name="IX_sms_fixed_zone_algo_result_type" unique="false">
            <column ascending="true" name="type"/>
         </index>
         <index name="IX_sms_fixed_zone_algo_result_zone_id" unique="false">
            <column ascending="true" name="zone_id"/>
         </index>
         <index name="UQ_sms_fixed_zone_algo_result_machineid_startdate" unique="true">
            <column ascending="true" name="machine_id"/>
            <column ascending="true" name="start_date"/>
         </index>
      </table>
      <table name="sms_hiboo_daily_data" numRows="8074" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="null" digits="0" id="0" name="tenant_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_hiboo_daily_data_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="calendar_day_id" nullable="false" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="equipment_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_hiboo_daily_data_sms_hiboo_equipment_equipment_id" implied="false" onDeleteCascade="true" schema="public" table="sms_hiboo_equipment"/>
         </column>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="3" name="received_at" nullable="false" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="4" name="operating_hours" nullable="true" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="5" name="idle_hours" nullable="true" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="6" name="working_hours" nullable="true" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="7" name="fuel_used" nullable="true" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="8" name="distance" nullable="true" remarks="" size="17" type="float8" typeCode="8"/>
         <primaryKey column="calendar_day_id" sequenceNumberInPK="1"/>
         <primaryKey column="equipment_id" sequenceNumberInPK="2"/>
         <index name="PK_sms_hiboo_daily_data" unique="true">
            <column ascending="true" name="calendar_day_id"/>
            <column ascending="true" name="equipment_id"/>
         </index>
         <index name="IX_sms_hiboo_daily_data_equipment_id" unique="false">
            <column ascending="true" name="equipment_id"/>
         </index>
         <index name="IX_sms_hiboo_daily_data_received_at" unique="false">
            <column ascending="true" name="received_at"/>
         </index>
         <index name="IX_sms_hiboo_daily_data_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
      </table>
      <table name="sms_hiboo_equipment" numRows="31" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <child column="equipment_id" foreignKey="FK_sms_hiboo_daily_data_sms_hiboo_equipment_equipment_id" implied="false" onDeleteCascade="true" schema="public" table="sms_hiboo_daily_data"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_hiboo_equipment_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="name" nullable="true" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="serial_number" nullable="false" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="4" name="model" nullable="true" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="5" name="make" nullable="true" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="6" name="created_at" nullable="true" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="7" name="created_by" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="8" name="updated_at" nullable="true" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="9" name="updated_by" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="10" name="is_system" nullable="false" remarks="" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="11" name="feature_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_hiboo_equipment_features_feature_id" implied="false" onDeleteCascade="false" schema="public" table="features"/>
         </column>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_sms_hiboo_equipment" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_hiboo_equipment_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_sms_hiboo_equipment_feature_id" unique="false">
            <column ascending="true" name="feature_id"/>
         </index>
         <index name="IX_sms_hiboo_equipment_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_hiboo_equipment_is_system" unique="false">
            <column ascending="true" name="is_system"/>
         </index>
         <index name="IX_sms_hiboo_equipment_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
      </table>
      <table name="sms_kpi_machines_cycles" numRows="60862" remarks="Sms KPI machines cycles per day." schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="null" digits="0" id="0" name="day_id" nullable="false" remarks="Day identifier." size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_kpi_machines_cycles_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="site_id" nullable="true" remarks="Sms site identifier." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="site_name" nullable="true" remarks="Sms site name." size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="4" name="shift_id" nullable="true" remarks="Sms shift identifier." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="5" name="shift_name" nullable="true" remarks="Sms shift name." size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="6" name="cycle_day_id" nullable="false" remarks="Serial cycle ID by day per dumper." size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="7" name="cycle_date_start" nullable="false" remarks="UTC date/time of cycle start." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="8" name="cycle_hour_start" nullable="false" remarks="Local hour of cycle start." size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="9" name="cycle_time" nullable="false" remarks="Total cycle time." size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="10" name="dumper_id" nullable="false" remarks="Dumper machine identifier." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="11" name="dumper_type_id" nullable="false" remarks="Dumper machine type identifier." size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="12" name="dumper_type" nullable="false" remarks="Dumper machine type name." size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="13" name="dumper_name" nullable="true" remarks="Dumper machine name." size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="14" name="loader_id" nullable="true" remarks="Loader machine identifier." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="15" name="loader_type_id" nullable="true" remarks="Loader machine type identifier." size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="16" name="loader_type" nullable="true" remarks="Loader machine type name." size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="17" name="loader_name" nullable="true" remarks="Loader machine name." size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="18" name="zone_loading_id" nullable="true" remarks="Loading fixed zone identifier." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="19" name="zone_loading_name" nullable="true" remarks="Loading fixed zone name." size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="20" name="zone_dumping_id" nullable="true" remarks="Dumping fixed zone identifier." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="21" name="zone_dumping_name" nullable="true" remarks="Dumping fixed zone name." size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="22" name="dumper_distance" nullable="false" remarks="Total distance dumper machine travelled (in m)." size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="23" name="dumper_distance_empty" nullable="false" remarks="Distance dumper machine travelled empty (in m)." size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="24" name="dumper_distance_loaded" nullable="false" remarks="Distance dumper machine travelled loaded (in m)." size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="25" name="dumper_time_operating" nullable="false" remarks="Total dumper operating time (in sec.)." size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="26" name="dumper_time_travelling_empty" nullable="false" remarks="Time dumper machine travelled empty (in sec.)." size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="27" name="dumper_time_travelling_loaded" nullable="false" remarks="Time dumper machine travelled loaded (in sec.)." size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="28" name="dumper_time_waiting_empty" nullable="false" remarks="Time dumper machine waiting empty on track (in sec.)." size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="29" name="dumper_time_waiting_loaded" nullable="false" remarks="Time dumper machine waiting loaded on track (in sec.)." size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="30" name="dumper_time_engine_off" nullable="false" remarks="Time dumper machine while engine was off (in sec.)." size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="31" name="dumper_time_loading" nullable="false" remarks="Time dumper machine spent loading (in sec.)." size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="32" name="dumper_time_dumping" nullable="false" remarks="Time dumper machine spent dumping (in sec.)." size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="33" name="dumper_time_waiting_loading" nullable="false" remarks="Time dumper machine waiting for loading (in sec.)." size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="34" name="dumper_time_waiting_dumping" nullable="false" remarks="Time dumper machine waiting for dumping (in sec.)." size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="35" name="dumper_volume_theoretical" nullable="true" remarks="Theoretical volume of machine's dumpster (in m3)." size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="36" name="dumper_operation_loader_unknown" nullable="false" remarks="True if false loading, False otherwise." size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="37" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <index name="IX_sms_kpi_machines_cycles_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_sms_kpi_machines_cycles_cycle_date_start" unique="false">
            <column ascending="true" name="cycle_date_start"/>
         </index>
         <index name="IX_sms_kpi_machines_cycles_day_id" unique="false">
            <column ascending="true" name="day_id"/>
         </index>
         <index name="IX_sms_kpi_machines_cycles_day_id_tenant_id_site_id_dumper_id_~" unique="true">
            <column ascending="true" name="day_id"/>
            <column ascending="true" name="tenant_id"/>
            <column ascending="true" name="site_id"/>
            <column ascending="true" name="dumper_id"/>
            <column ascending="true" name="cycle_day_id"/>
         </index>
         <index name="IX_sms_kpi_machines_cycles_dumper_id" unique="false">
            <column ascending="true" name="dumper_id"/>
         </index>
         <index name="IX_sms_kpi_machines_cycles_dumper_name" unique="false">
            <column ascending="true" name="dumper_name"/>
         </index>
         <index name="IX_sms_kpi_machines_cycles_dumper_type" unique="false">
            <column ascending="true" name="dumper_type"/>
         </index>
         <index name="IX_sms_kpi_machines_cycles_dumper_type_id" unique="false">
            <column ascending="true" name="dumper_type_id"/>
         </index>
         <index name="IX_sms_kpi_machines_cycles_loader_id" unique="false">
            <column ascending="true" name="loader_id"/>
         </index>
         <index name="IX_sms_kpi_machines_cycles_loader_name" unique="false">
            <column ascending="true" name="loader_name"/>
         </index>
         <index name="IX_sms_kpi_machines_cycles_loader_type" unique="false">
            <column ascending="true" name="loader_type"/>
         </index>
         <index name="IX_sms_kpi_machines_cycles_loader_type_id" unique="false">
            <column ascending="true" name="loader_type_id"/>
         </index>
         <index name="IX_sms_kpi_machines_cycles_site_id" unique="false">
            <column ascending="true" name="site_id"/>
         </index>
         <index name="IX_sms_kpi_machines_cycles_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
         <index name="IX_sms_kpi_machines_cycles_zone_dumping_id" unique="false">
            <column ascending="true" name="zone_dumping_id"/>
         </index>
         <index name="IX_sms_kpi_machines_cycles_zone_dumping_name" unique="false">
            <column ascending="true" name="zone_dumping_name"/>
         </index>
         <index name="IX_sms_kpi_machines_cycles_zone_loading_id" unique="false">
            <column ascending="true" name="zone_loading_id"/>
         </index>
         <index name="IX_sms_kpi_machines_cycles_zone_loading_name" unique="false">
            <column ascending="true" name="zone_loading_name"/>
         </index>
      </table>
      <table name="sms_kpi_sites" numRows="433" remarks="Sms KPI Site statistics per day." schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="null" digits="0" id="0" name="day_id" nullable="false" remarks="Day identifier." size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_kpi_sites_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="site_id" nullable="true" remarks="Sms site identifier." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="site_name" nullable="true" remarks="Sms site name." size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="4" name="machines_count" nullable="true" remarks="Total machines count." size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="5" name="machines_count_active" nullable="true" remarks="Total active machines count." size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="6" name="machines_volume" nullable="true" remarks="Sum of all the machines volumes that have been dumped during that day (in m3)." size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="7" name="machines_fuel_used" nullable="true" remarks="Sum of all the machines fuel that have been used during that day (in L)." size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="8" name="machines_co2_equivalent" nullable="true" remarks="Sum of all the machines fuel that have been used during that day mulitplied by the CO2/L (in Kg)." size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="9" name="machines_hours_operating" nullable="true" remarks="Sum of all the machines hours that have been working during that day (in Hours)." size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="10" name="machines_cost" nullable="true" remarks="Sum of all the machines hours that have been working during that day mulitplied by the hourly rate." size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="11" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <index name="IX_sms_kpi_sites_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_sms_kpi_sites_day_id" unique="false">
            <column ascending="true" name="day_id"/>
         </index>
         <index name="IX_sms_kpi_sites_day_id_tenant_id_site_id" unique="true">
            <column ascending="true" name="day_id"/>
            <column ascending="true" name="tenant_id"/>
            <column ascending="true" name="site_id"/>
         </index>
         <index name="IX_sms_kpi_sites_site_id" unique="false">
            <column ascending="true" name="site_id"/>
         </index>
         <index name="IX_sms_kpi_sites_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
      </table>
      <table name="sms_kpi_sites_machines" numRows="7544" remarks="Sms KPI machine data per day." schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="null" digits="0" id="0" name="day_id" nullable="false" remarks="Day identifier." size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_kpi_sites_machines_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="site_id" nullable="true" remarks="Sms site identifier." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="site_name" nullable="true" remarks="Sms site name." size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="4" name="machine_id" nullable="false" remarks="Machine identifier." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="5" name="machine_type_id" nullable="false" remarks="Machine type identifier." size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="6" name="machine_type" nullable="false" remarks="Machine type name." size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="7" name="machine_name" nullable="false" remarks="Machine name." size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="8" name="machine_make" nullable="true" remarks="Machine manufacturer." size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="9" name="machine_model" nullable="true" remarks="Machine model." size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="10" name="machine_sn" nullable="false" remarks="Machine serial number." size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="11" name="tracker_gps_count_teltonika" nullable="true" remarks="Total machine GPS count by Teltonika." size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="12" name="tracker_sn_hiboo" nullable="true" remarks="Tracker serial number by Hiboo." size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="13" name="tracker_name_hiboo" nullable="true" remarks="Tracker machine name by Hiboo." size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="14" name="tracker_sn_teltonika" nullable="true" remarks="Tracker serial number by Teltonika." size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="15" name="tracker_id_teltonika" nullable="true" remarks="Tracker machine ID by Teltonika." size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="16" name="machine_hours_operating" nullable="true" remarks="Computed machine operating hours (in h)." size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="17" name="machine_hours_idle" nullable="true" remarks="Computed machine idle hours (in h)." size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="18" name="machine_hours_working" nullable="true" remarks="Computed machine working hours (in h)." size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="19" name="machine_fuel_used" nullable="true" remarks="Computed machine fuel used (in L)." size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="20" name="machine_distance" nullable="true" remarks="Computed machine distance travelled (in m)." size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="21" name="machine_fuel_consumption" nullable="true" remarks="Computed machine fuel consumption (in L/h)." size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="22" name="machine_hours_idling_percentage" nullable="true" remarks="Computed machine idling hours percentage - idling hours/operating hours * 100 (in %)." size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="23" name="machine_co2_equivalent" nullable="true" remarks="Computed machine CO2 equivalent (in kg)." size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="24" name="hiboo_hours_operating" nullable="true" remarks="Machine operating hours from hiboo source (in h)." size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="25" name="hiboo_hours_idle" nullable="true" remarks="Machine idle hours from hiboo source (in h)." size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="26" name="hiboo_hours_working" nullable="true" remarks="Machine working hours from hiboo source (in h)." size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="27" name="hiboo_fuel_used" nullable="true" remarks="Machine fuel used from hiboo source (in L)." size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="28" name="hiboo_distance" nullable="true" remarks="Machine distance travelled from hiboo source (in m)." size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="29" name="hiboo_fuel_consumption" nullable="true" remarks="Machine fuel consumption from hiboo source (in L/h)." size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="30" name="hiboo_hours_idling_percentage" nullable="true" remarks="Machine idling hours percentage from hiboo source - idling hours/operating hours * 100 (in %)." size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="31" name="hiboo_co2_equivalent" nullable="true" remarks="Machine CO2 equivalent from hiboo source (in kg)." size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="32" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <index name="IX_sms_kpi_sites_machines_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_sms_kpi_sites_machines_day_id" unique="false">
            <column ascending="true" name="day_id"/>
         </index>
         <index name="IX_sms_kpi_sites_machines_day_id_tenant_id_site_id_machine_id" unique="true">
            <column ascending="true" name="day_id"/>
            <column ascending="true" name="tenant_id"/>
            <column ascending="true" name="site_id"/>
            <column ascending="true" name="machine_id"/>
         </index>
         <index name="IX_sms_kpi_sites_machines_machine_id" unique="false">
            <column ascending="true" name="machine_id"/>
         </index>
         <index name="IX_sms_kpi_sites_machines_machine_name" unique="false">
            <column ascending="true" name="machine_name"/>
         </index>
         <index name="IX_sms_kpi_sites_machines_machine_sn" unique="false">
            <column ascending="true" name="machine_sn"/>
         </index>
         <index name="IX_sms_kpi_sites_machines_machine_type" unique="false">
            <column ascending="true" name="machine_type"/>
         </index>
         <index name="IX_sms_kpi_sites_machines_machine_type_id" unique="false">
            <column ascending="true" name="machine_type_id"/>
         </index>
         <index name="IX_sms_kpi_sites_machines_site_id" unique="false">
            <column ascending="true" name="site_id"/>
         </index>
         <index name="IX_sms_kpi_sites_machines_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
         <index name="IX_sms_kpi_sites_machines_tracker_name_hiboo" unique="false">
            <column ascending="true" name="tracker_name_hiboo"/>
         </index>
         <index name="IX_sms_kpi_sites_machines_tracker_sn_hiboo" unique="false">
            <column ascending="true" name="tracker_sn_hiboo"/>
         </index>
         <index name="IX_sms_kpi_sites_machines_tracker_sn_teltonika" unique="false">
            <column ascending="true" name="tracker_sn_teltonika"/>
         </index>
      </table>
      <table name="sms_loader_daily_zone" numRows="10646" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111">
            <child column="end_daily_zone_id" foreignKey="FK_sms_loader_move_sms_loader_daily_zone_end_daily_zone_id" implied="false" onDeleteCascade="false" schema="public" table="sms_loader_move"/>
            <child column="start_daily_zone_id" foreignKey="FK_sms_loader_move_sms_loader_daily_zone_start_daily_zone_id" implied="false" onDeleteCascade="false" schema="public" table="sms_loader_move"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_loader_daily_zone_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="day_id" nullable="false" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="name" nullable="false" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="4" name="zone_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_loader_daily_zone_sms_zone_zone_id" implied="false" onDeleteCascade="false" schema="public" table="sms_zone"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="5" name="polygon" nullable="false" remarks="" size="2147483647" type="geometry" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="6" name="center" nullable="true" remarks="" size="2147483647" type="geometry" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="7" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="8" name="feature_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_loader_daily_zone_features_feature_id" implied="false" onDeleteCascade="false" schema="public" table="features"/>
         </column>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_sms_loader_daily_zone" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_loader_daily_zone_center" unique="false">
            <column ascending="true" name="center"/>
         </index>
         <index name="IX_sms_loader_daily_zone_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_sms_loader_daily_zone_day_id" unique="false">
            <column ascending="true" name="day_id"/>
         </index>
         <index name="IX_sms_loader_daily_zone_feature_id" unique="false">
            <column ascending="true" name="feature_id"/>
         </index>
         <index name="IX_sms_loader_daily_zone_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_loader_daily_zone_name" unique="false">
            <column ascending="true" name="name"/>
         </index>
         <index name="IX_sms_loader_daily_zone_polygon" unique="false">
            <column ascending="true" name="polygon"/>
         </index>
         <index name="IX_sms_loader_daily_zone_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
         <index name="IX_sms_loader_daily_zone_zone_id" unique="false">
            <column ascending="true" name="zone_id"/>
         </index>
      </table>
      <table name="sms_loader_move" numRows="129478" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_loader_move_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="day_id" nullable="false" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="shift_day_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_loader_move_sms_shift_day_shift_day_id" implied="false" onDeleteCascade="false" schema="public" table="sms_shift_day"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="4" name="type" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="5" name="start_date" nullable="false" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="6" name="duration" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="7" name="distance" nullable="true" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="8" name="geometry" nullable="true" remarks="" size="2147483647" type="geometry" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="9" name="loader_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_loader_move_sms_machine_loader_id" implied="false" onDeleteCascade="false" schema="public" table="sms_machine"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="10" name="start_daily_zone_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_loader_move_sms_loader_daily_zone_start_daily_zone_id" implied="false" onDeleteCascade="false" schema="public" table="sms_loader_daily_zone"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="11" name="end_daily_zone_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_loader_move_sms_loader_daily_zone_end_daily_zone_id" implied="false" onDeleteCascade="false" schema="public" table="sms_loader_daily_zone"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="12" name="centroid" nullable="true" remarks="" size="2147483647" type="geometry" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="13" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="14" name="feature_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_loader_move_features_feature_id" implied="false" onDeleteCascade="false" schema="public" table="features"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="15" name="zone_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_loader_move_sms_zone_zone_id" implied="false" onDeleteCascade="false" schema="public" table="sms_zone"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="16" name="loader_parameter_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_loader_move_sms_loader_parameters_loader_parameter_id" implied="false" onDeleteCascade="false" schema="public" table="sms_loader_parameters"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="17" name="shift_day_name" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_sms_loader_move" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_loader_move_centroid" unique="false">
            <column ascending="true" name="centroid"/>
         </index>
         <index name="IX_sms_loader_move_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_sms_loader_move_day_id" unique="false">
            <column ascending="true" name="day_id"/>
         </index>
         <index name="IX_sms_loader_move_end_daily_zone_id" unique="false">
            <column ascending="true" name="end_daily_zone_id"/>
         </index>
         <index name="IX_sms_loader_move_feature_id" unique="false">
            <column ascending="true" name="feature_id"/>
         </index>
         <index name="IX_sms_loader_move_geometry" unique="false">
            <column ascending="true" name="geometry"/>
         </index>
         <index name="IX_sms_loader_move_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_loader_move_loader_parameter_id" unique="false">
            <column ascending="true" name="loader_parameter_id"/>
         </index>
         <index name="IX_sms_loader_move_shift_day_id" unique="false">
            <column ascending="true" name="shift_day_id"/>
         </index>
         <index name="IX_sms_loader_move_start_daily_zone_id" unique="false">
            <column ascending="true" name="start_daily_zone_id"/>
         </index>
         <index name="IX_sms_loader_move_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
         <index name="IX_sms_loader_move_type" unique="false">
            <column ascending="true" name="type"/>
         </index>
         <index name="IX_sms_loader_move_zone_id" unique="false">
            <column ascending="true" name="zone_id"/>
         </index>
         <index name="UQ_sms_loader_move_loaderid_startdate" unique="true">
            <column ascending="true" name="loader_id"/>
            <column ascending="true" name="start_date"/>
         </index>
      </table>
      <table name="sms_loader_parameters" numRows="13" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111">
            <child column="loader_parameter_id" foreignKey="FK_sms_loader_move_sms_loader_parameters_loader_parameter_id" implied="false" onDeleteCascade="false" schema="public" table="sms_loader_move"/>
            <child column="loader_parameter_id" foreignKey="FK_sms_truck_cycle_sms_loader_parameters_loader_parameter_id" implied="false" onDeleteCascade="false" schema="public" table="sms_truck_cycle"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_loader_parameters_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="machine_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_loader_parameters_sms_machine_machine_id" implied="false" onDeleteCascade="true" schema="public" table="sms_machine"/>
         </column>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="3" name="valid_from" nullable="false" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="4" name="valid_to" nullable="true" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="5" name="deleted_at" nullable="true" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="6" name="cost_per_hour" nullable="false" remarks="" size="5" type="int2" typeCode="5"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="7" name="theoretical_consumption" nullable="false" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="8" name="kg_co2_per_liter" nullable="false" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="9" name="target_time_per_bucket" nullable="false" remarks="" size="5" type="int2" typeCode="5"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="10" name="tonne" nullable="false" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="11" name="volume" nullable="false" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="12" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="13" name="created_by" nullable="true" remarks="User who create the record. Null if System." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="14" name="updated_at" nullable="true" remarks="DateTime the record was last updated." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="15" name="updated_by" nullable="true" remarks="User who last updated the record." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="16" name="is_system" nullable="false" remarks="A system-generated record. Default = false" size="1" type="bool" typeCode="-7"/>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_sms_loader_parameters" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_loader_parameters_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_sms_loader_parameters_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_loader_parameters_is_system" unique="false">
            <column ascending="true" name="is_system"/>
         </index>
         <index name="IX_sms_loader_parameters_machine_id" unique="false">
            <column ascending="true" name="machine_id"/>
         </index>
         <index name="IX_sms_loader_parameters_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
         <index name="IX_sms_loader_parameters_valid_from" unique="false">
            <column ascending="true" name="valid_from"/>
         </index>
         <index name="IX_sms_loader_parameters_valid_to" unique="false">
            <column ascending="true" name="valid_to"/>
         </index>
      </table>
      <table name="sms_machine" numRows="57" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111">
            <child column="machine_id" foreignKey="FK_sms_dozer_parameters_sms_machine_machine_id" implied="false" onDeleteCascade="true" schema="public" table="sms_dozer_parameters"/>
            <child column="machine_id" foreignKey="FK_sms_fixed_zone_algo_machine_parameters_sms_machine_machine_~" implied="false" onDeleteCascade="true" schema="public" table="sms_fixed_zone_algo_machine_parameters"/>
            <child column="machine_id" foreignKey="FK_sms_fixed_zone_algo_result_sms_machine_machine_id" implied="false" onDeleteCascade="false" schema="public" table="sms_fixed_zone_algo_result"/>
            <child column="loader_id" foreignKey="FK_sms_loader_move_sms_machine_loader_id" implied="false" onDeleteCascade="false" schema="public" table="sms_loader_move"/>
            <child column="machine_id" foreignKey="FK_sms_loader_parameters_sms_machine_machine_id" implied="false" onDeleteCascade="true" schema="public" table="sms_loader_parameters"/>
            <child column="machine_id" foreignKey="FK_sms_machine_site_association_sms_machine_machine_id" implied="false" onDeleteCascade="true" schema="public" table="sms_machine_site_association"/>
            <child column="machine_id" foreignKey="FK_sms_machine_teltonika_tracker_sms_machine_machine_id" implied="false" onDeleteCascade="true" schema="public" table="sms_machine_teltonika_tracker"/>
            <child column="machine_id" foreignKey="FK_sms_other_parameters_sms_machine_machine_id" implied="false" onDeleteCascade="true" schema="public" table="sms_other_parameters"/>
            <child column="dozer_id" foreignKey="FK_sms_scraper_cycle_sms_machine_dozer_id" implied="false" onDeleteCascade="false" schema="public" table="sms_scraper_cycle"/>
            <child column="scraper_id" foreignKey="FK_sms_scraper_cycle_sms_machine_scraper_id" implied="false" onDeleteCascade="false" schema="public" table="sms_scraper_cycle"/>
            <child column="dozer_id" foreignKey="FK_sms_scraper_move_sms_machine_dozer_id" implied="false" onDeleteCascade="false" schema="public" table="sms_scraper_move"/>
            <child column="scraper_id" foreignKey="FK_sms_scraper_move_sms_machine_scraper_id" implied="false" onDeleteCascade="false" schema="public" table="sms_scraper_move"/>
            <child column="machine_id" foreignKey="FK_sms_scraper_parameters_sms_machine_machine_id" implied="false" onDeleteCascade="true" schema="public" table="sms_scraper_parameters"/>
            <child column="dozer_id" foreignKey="FK_sms_teltonika_scraper_gps_data_sms_machine_dozer_id" implied="false" onDeleteCascade="false" schema="public" table="sms_teltonika_scraper_gps_data"/>
            <child column="scraper_id" foreignKey="FK_sms_teltonika_scraper_gps_data_sms_machine_scraper_id" implied="false" onDeleteCascade="true" schema="public" table="sms_teltonika_scraper_gps_data"/>
            <child column="loader_id" foreignKey="FK_sms_truck_cycle_sms_machine_loader_id" implied="false" onDeleteCascade="false" schema="public" table="sms_truck_cycle"/>
            <child column="truck_id" foreignKey="FK_sms_truck_cycle_sms_machine_truck_id" implied="false" onDeleteCascade="false" schema="public" table="sms_truck_cycle"/>
            <child column="loader_id" foreignKey="FK_sms_truck_move_sms_machine_loader_id" implied="false" onDeleteCascade="false" schema="public" table="sms_truck_move"/>
            <child column="truck_id" foreignKey="FK_sms_truck_move_sms_machine_truck_id" implied="false" onDeleteCascade="false" schema="public" table="sms_truck_move"/>
            <child column="machine_id" foreignKey="FK_sms_truck_parameters_sms_machine_machine_id" implied="false" onDeleteCascade="true" schema="public" table="sms_truck_parameters"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="tenant_id" foreignKey="FK_sms_machine_sms_category_category_tenant_id" implied="false" onDeleteCascade="false" schema="public" table="sms_category"/>
            <parent column="tenant_id" foreignKey="FK_sms_machine_sms_machine_type_type_tenant_id" implied="false" onDeleteCascade="false" schema="public" table="sms_machine_type"/>
            <parent column="id" foreignKey="FK_sms_machine_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="name" nullable="false" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="serial_number" nullable="false" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="4" name="model" nullable="true" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="5" name="make" nullable="true" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="6" name="category" nullable="true" remarks="" size="10" type="int4" typeCode="4">
            <parent column="id" foreignKey="FK_sms_machine_sms_category_category_tenant_id" implied="false" onDeleteCascade="false" schema="public" table="sms_category"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="7" name="type" nullable="true" remarks="" size="10" type="int4" typeCode="4">
            <parent column="id" foreignKey="FK_sms_machine_sms_machine_type_type_tenant_id" implied="false" onDeleteCascade="false" schema="public" table="sms_machine_type"/>
         </column>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="8" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="9" name="created_by" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="10" name="updated_at" nullable="true" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="11" name="updated_by" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="12" name="is_system" nullable="false" remarks="" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="13" name="description" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="14" name="deleted_at" nullable="true" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="15" name="feature_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_machine_features_feature_id" implied="false" onDeleteCascade="false" schema="public" table="features"/>
         </column>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_sms_machine" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_machine_category_tenant_id" unique="false">
            <column ascending="true" name="category"/>
            <column ascending="true" name="tenant_id"/>
         </index>
         <index name="IX_sms_machine_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_sms_machine_feature_id" unique="false">
            <column ascending="true" name="feature_id"/>
         </index>
         <index name="IX_sms_machine_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_machine_is_system" unique="false">
            <column ascending="true" name="is_system"/>
         </index>
         <index name="IX_sms_machine_name" unique="false">
            <column ascending="true" name="name"/>
         </index>
         <index name="IX_sms_machine_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
         <index name="IX_sms_machine_type_tenant_id" unique="false">
            <column ascending="true" name="type"/>
            <column ascending="true" name="tenant_id"/>
         </index>
      </table>
      <table name="sms_machine_distance_per_day_id" numRows="0" remarks="" schema="public" type="VIEW" viewSql=" SELECT sm.name,&#10;    sm.model,&#10;    stm.day_id,&#10;    (sum(stm.distance))::integer AS total_distance&#10;   FROM (sms_truck_move stm&#10;     JOIN sms_machine sm ON ((stm.truck_id = sm.id)))&#10;  GROUP BY sm.name, sm.model, stm.day_id&#10;  ORDER BY stm.day_id DESC, sm.model;">
         <column autoUpdated="false" defaultValue="null" digits="0" id="0" name="name" nullable="true" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="model" nullable="true" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="day_id" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="total_distance" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
      </table>
      <table name="sms_machine_site_association" numRows="48" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_machine_site_association_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="machine_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_machine_site_association_sms_machine_machine_id" implied="false" onDeleteCascade="true" schema="public" table="sms_machine"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="site_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_machine_site_association_sms_site_site_id" implied="false" onDeleteCascade="true" schema="public" table="sms_site"/>
         </column>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="4" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="5" name="created_by" nullable="true" remarks="User who create the record. Null if System." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="6" name="updated_at" nullable="true" remarks="DateTime the record was last updated." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="7" name="updated_by" nullable="true" remarks="User who last updated the record." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="8" name="is_system" nullable="false" remarks="A system-generated record. Default = false" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="9" name="deleted_at" nullable="true" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="10" name="valid_from" nullable="false" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="11" name="valid_to" nullable="true" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_sms_machine_site_association" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_machine_site_association_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_sms_machine_site_association_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_machine_site_association_is_system" unique="false">
            <column ascending="true" name="is_system"/>
         </index>
         <index name="IX_sms_machine_site_association_machine_id" unique="false">
            <column ascending="true" name="machine_id"/>
         </index>
         <index name="IX_sms_machine_site_association_site_id" unique="false">
            <column ascending="true" name="site_id"/>
         </index>
         <index name="IX_sms_machine_site_association_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
      </table>
      <table name="sms_machine_teltonika_tracker" numRows="52" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="null" digits="0" id="0" name="machine_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_machine_teltonika_tracker_sms_machine_machine_id" implied="false" onDeleteCascade="true" schema="public" table="sms_machine"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tracker_serial" nullable="false" remarks="" size="2147483647" type="text" typeCode="12">
            <parent column="serial_number" foreignKey="FK_sms_machine_teltonika_tracker_sms_teltonika_tracker_tracker~" implied="false" onDeleteCascade="true" schema="public" table="sms_teltonika_tracker"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="tenant_id" foreignKey="FK_sms_machine_teltonika_tracker_sms_teltonika_tracker_tracker~" implied="false" onDeleteCascade="true" schema="public" table="sms_teltonika_tracker"/>
            <parent column="id" foreignKey="FK_sms_machine_teltonika_tracker_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
            <parent column="tenant_id" foreignKey="FK_sms_machine_teltonika_tracker_sms_state_state_tenant_id" implied="false" onDeleteCascade="false" schema="public" table="sms_state"/>
         </column>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="3" name="valid_from" nullable="false" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="4" name="valid_to" nullable="true" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="5" name="deleted_at" nullable="true" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="6" name="state" nullable="true" remarks="" size="10" type="int4" typeCode="4">
            <parent column="id" foreignKey="FK_sms_machine_teltonika_tracker_sms_state_state_tenant_id" implied="false" onDeleteCascade="false" schema="public" table="sms_state"/>
         </column>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="7" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="8" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111"/>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_sms_machine_teltonika_tracker" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_machine_teltonika_tracker_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_sms_machine_teltonika_tracker_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_machine_teltonika_tracker_machine_id" unique="false">
            <column ascending="true" name="machine_id"/>
         </index>
         <index name="IX_sms_machine_teltonika_tracker_state" unique="false">
            <column ascending="true" name="state"/>
         </index>
         <index name="IX_sms_machine_teltonika_tracker_state_tenant_id" unique="false">
            <column ascending="true" name="state"/>
            <column ascending="true" name="tenant_id"/>
         </index>
         <index name="IX_sms_machine_teltonika_tracker_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
         <index name="IX_sms_machine_teltonika_tracker_tracker_serial" unique="false">
            <column ascending="true" name="tracker_serial"/>
         </index>
         <index name="IX_sms_machine_teltonika_tracker_tracker_serial_tenant_id" unique="false">
            <column ascending="true" name="tracker_serial"/>
            <column ascending="true" name="tenant_id"/>
         </index>
         <index name="IX_sms_machine_teltonika_tracker_valid_from" unique="false">
            <column ascending="true" name="valid_from"/>
         </index>
         <index name="IX_sms_machine_teltonika_tracker_valid_to" unique="false">
            <column ascending="true" name="valid_to"/>
         </index>
      </table>
      <table name="sms_machine_type" numRows="8" remarks="" schema="public" type="TABLE">
         <column autoUpdated="true" defaultValue="null" digits="0" id="0" name="id" nullable="false" remarks="" size="10" type="int4" typeCode="4">
            <child column="type" foreignKey="FK_sms_machine_sms_machine_type_type_tenant_id" implied="false" onDeleteCascade="false" schema="public" table="sms_machine"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <child column="tenant_id" foreignKey="FK_sms_machine_sms_machine_type_type_tenant_id" implied="false" onDeleteCascade="false" schema="public" table="sms_machine"/>
            <parent column="id" foreignKey="FK_sms_machine_type_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="name" nullable="false" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="3" name="created_at" nullable="true" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="4" name="created_by" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="5" name="updated_at" nullable="true" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="6" name="updated_by" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="7" name="is_system" nullable="false" remarks="" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="0" digits="0" id="8" name="calculation_type" nullable="false" remarks="" size="10" type="int4" typeCode="4"/>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <primaryKey column="tenant_id" sequenceNumberInPK="2"/>
         <index name="PK_sms_machine_type" unique="true">
            <column ascending="true" name="id"/>
            <column ascending="true" name="tenant_id"/>
         </index>
         <index name="IX_sms_machine_type_calculation_type" unique="false">
            <column ascending="true" name="calculation_type"/>
         </index>
         <index name="IX_sms_machine_type_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_sms_machine_type_is_system" unique="false">
            <column ascending="true" name="is_system"/>
         </index>
         <index name="IX_sms_machine_type_tenant_id1" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
      </table>
      <table name="sms_machines_trackers" numRows="0" remarks="" schema="public" type="VIEW" viewSql=" SELECT DISTINCT sm.id AS machine_id,&#10;    sm.tenant_id,&#10;    sm.name AS machine_name,&#10;    sm.serial_number AS machine_sn,&#10;    sm.model AS machine_model,&#10;    sm.make AS machine_make,&#10;    sm.category AS machine_category,&#10;    sm.type AS machine_type,&#10;    smt.name AS machine_type_name,&#10;    smtt.tracker_serial AS tracker_teltonika_sn,&#10;    she.name AS tracker_hiboo_name,&#10;    f.geometry AS last_position,&#10;    f.valid_from AS last_position_time,&#10;    site.name AS site_name,&#10;        CASE&#10;            WHEN ((sm.type = 1) OR (sm.type = 7)) THEN truck_parameters.cost_per_hour&#10;            WHEN (sm.type = 2) THEN loader_parameters.cost_per_hour&#10;            WHEN (sm.type = 3) THEN dozer_parameters.cost_per_hour&#10;            WHEN (sm.type = 6) THEN scraper_parameters.cost_per_hour&#10;            ELSE other_parameters.cost_per_hour&#10;        END AS cost_per_hour,&#10;        CASE&#10;            WHEN ((sm.type = 1) OR (sm.type = 7)) THEN truck_parameters.theoretical_consumption&#10;            WHEN (sm.type = 2) THEN loader_parameters.theoretical_consumption&#10;            WHEN (sm.type = 3) THEN dozer_parameters.theoretical_consumption&#10;            WHEN (sm.type = 6) THEN scraper_parameters.theoretical_consumption&#10;            ELSE other_parameters.theoretical_consumption&#10;        END AS theoretical_consumption,&#10;        CASE&#10;            WHEN ((sm.type = 1) OR (sm.type = 7)) THEN truck_parameters.kg_co2_per_liter&#10;            WHEN (sm.type = 2) THEN loader_parameters.kg_co2_per_liter&#10;            WHEN (sm.type = 3) THEN dozer_parameters.kg_co2_per_liter&#10;            WHEN (sm.type = 6) THEN scraper_parameters.kg_co2_per_liter&#10;            ELSE other_parameters.kg_co2_per_liter&#10;        END AS kg_co2_per_liter,&#10;        CASE&#10;            WHEN ((sm.type = 1) OR (sm.type = 7)) THEN truck_parameters.tonne&#10;            WHEN (sm.type = 2) THEN loader_parameters.tonne&#10;            WHEN (sm.type = 6) THEN scraper_parameters.tonne&#10;            ELSE NULL::double precision&#10;        END AS tonne,&#10;        CASE&#10;            WHEN ((sm.type = 1) OR (sm.type = 7)) THEN truck_parameters.volume&#10;            WHEN (sm.type = 2) THEN loader_parameters.volume&#10;            WHEN (sm.type = 6) THEN scraper_parameters.volume&#10;            ELSE NULL::double precision&#10;        END AS volume,&#10;        CASE&#10;            WHEN ((sm.type = 1) OR (sm.type = 7)) THEN truck_parameters.target_dump_time&#10;            WHEN (sm.type = 6) THEN scraper_parameters.target_dump_time&#10;            ELSE NULL::smallint&#10;        END AS target_dump_time,&#10;        CASE&#10;            WHEN (sm.type = 2) THEN loader_parameters.target_time_per_bucket&#10;            ELSE NULL::smallint&#10;        END AS target_time_per_bucket,&#10;        CASE&#10;            WHEN (sm.deleted_at IS NULL) THEN false&#10;            ELSE true&#10;        END AS is_deleted,&#10;        CASE&#10;            WHEN (sm.type = 3) THEN dozer_parameters.scraper_pusher&#10;            ELSE NULL::boolean&#10;        END AS scraper_pusher&#10;   FROM ((((((((((sms_machine sm&#10;     LEFT JOIN ( SELECT smtt_1.machine_id,&#10;            smtt_1.tracker_serial,&#10;            smtt_1.tenant_id,&#10;            smtt_1.valid_from,&#10;            smtt_1.valid_to,&#10;            smtt_1.deleted_at,&#10;            smtt_1.state,&#10;            smtt_1.created_at,&#10;            smtt_1.id&#10;           FROM sms_machine_teltonika_tracker smtt_1&#10;          WHERE ((((smtt_1.valid_from &lt;= now()) AND (smtt_1.valid_to &gt; now())) OR ((smtt_1.valid_from &lt;= now()) AND (smtt_1.valid_to IS NULL))) AND (smtt_1.deleted_at IS NULL))&#10;          ORDER BY smtt_1.valid_from) smtt ON ((sm.id = smtt.machine_id)))&#10;     LEFT JOIN features f ON ((sm.feature_id = f.id)))&#10;     LEFT JOIN ( SELECT smsa.id,&#10;            smsa.tenant_id,&#10;            smsa.machine_id,&#10;            smsa.site_id,&#10;            smsa.created_at,&#10;            smsa.created_by,&#10;            smsa.updated_at,&#10;            smsa.updated_by,&#10;            smsa.is_system,&#10;            smsa.deleted_at,&#10;            smsa.valid_from,&#10;            smsa.valid_to,&#10;            ss.name&#10;           FROM (sms_machine_site_association smsa&#10;             JOIN sms_site ss ON ((smsa.site_id = ss.id)))&#10;          WHERE ((((smsa.valid_from &lt;= now()) AND (smsa.valid_to &gt; now())) OR ((smsa.valid_from &lt;= now()) AND (smsa.valid_to IS NULL))) AND (smsa.deleted_at IS NULL))&#10;          ORDER BY smsa.valid_from) site ON ((site.machine_id = sm.id)))&#10;     LEFT JOIN ( SELECT stp.id,&#10;            stp.tenant_id,&#10;            stp.machine_id,&#10;            stp.valid_from,&#10;            stp.valid_to,&#10;            stp.deleted_at,&#10;            stp.cost_per_hour,&#10;            stp.theoretical_consumption,&#10;            stp.kg_co2_per_liter,&#10;            stp.target_dump_time,&#10;            stp.tonne,&#10;            stp.volume,&#10;            stp.created_at,&#10;            stp.created_by,&#10;            stp.updated_at,&#10;            stp.updated_by,&#10;            stp.is_system&#10;           FROM sms_truck_parameters stp&#10;          WHERE ((((stp.valid_from &lt;= now()) AND (stp.valid_to &gt; now())) OR ((stp.valid_from &lt;= now()) AND (stp.valid_to IS NULL))) AND (stp.deleted_at IS NULL))&#10;          ORDER BY stp.valid_from) truck_parameters ON ((truck_parameters.machine_id = sm.id)))&#10;     LEFT JOIN ( SELECT slp.id,&#10;            slp.tenant_id,&#10;            slp.machine_id,&#10;            slp.valid_from,&#10;            slp.valid_to,&#10;            slp.deleted_at,&#10;            slp.cost_per_hour,&#10;            slp.theoretical_consumption,&#10;            slp.kg_co2_per_liter,&#10;            slp.target_time_per_bucket,&#10;            slp.tonne,&#10;            slp.volume,&#10;            slp.created_at,&#10;            slp.created_by,&#10;            slp.updated_at,&#10;            slp.updated_by,&#10;            slp.is_system&#10;           FROM sms_loader_parameters slp&#10;          WHERE ((((slp.valid_from &lt;= now()) AND (slp.valid_to &gt; now())) OR ((slp.valid_from &lt;= now()) AND (slp.valid_to IS NULL))) AND (slp.deleted_at IS NULL))&#10;          ORDER BY slp.valid_from) loader_parameters ON ((loader_parameters.machine_id = sm.id)))&#10;     LEFT JOIN ( SELECT ssp.id,&#10;            ssp.tenant_id,&#10;            ssp.machine_id,&#10;            ssp.valid_from,&#10;            ssp.valid_to,&#10;            ssp.deleted_at,&#10;            ssp.cost_per_hour,&#10;            ssp.theoretical_consumption,&#10;            ssp.kg_co2_per_liter,&#10;            ssp.target_dump_time,&#10;            ssp.tonne,&#10;            ssp.volume,&#10;            ssp.created_at,&#10;            ssp.created_by,&#10;            ssp.updated_at,&#10;            ssp.updated_by,&#10;            ssp.is_system&#10;           FROM sms_scraper_parameters ssp&#10;          WHERE ((((ssp.valid_from &lt;= now()) AND (ssp.valid_to &gt; now())) OR ((ssp.valid_from &lt;= now()) AND (ssp.valid_to IS NULL))) AND (ssp.deleted_at IS NULL))&#10;          ORDER BY ssp.valid_from) scraper_parameters ON ((scraper_parameters.machine_id = sm.id)))&#10;     LEFT JOIN ( SELECT sdp.id,&#10;            sdp.tenant_id,&#10;            sdp.machine_id,&#10;            sdp.valid_from,&#10;            sdp.valid_to,&#10;            sdp.deleted_at,&#10;            sdp.cost_per_hour,&#10;            sdp.theoretical_consumption,&#10;            sdp.kg_co2_per_liter,&#10;            sdp.scraper_pusher,&#10;            sdp.created_at,&#10;            sdp.created_by,&#10;            sdp.updated_at,&#10;            sdp.updated_by,&#10;            sdp.is_system&#10;           FROM sms_dozer_parameters sdp&#10;          WHERE ((((sdp.valid_from &lt;= now()) AND (sdp.valid_to &gt; now())) OR ((sdp.valid_from &lt;= now()) AND (sdp.valid_to IS NULL))) AND (sdp.deleted_at IS NULL))&#10;          ORDER BY sdp.valid_from) dozer_parameters ON ((dozer_parameters.machine_id = sm.id)))&#10;     LEFT JOIN ( SELECT sop.id,&#10;            sop.tenant_id,&#10;            sop.machine_id,&#10;            sop.valid_from,&#10;            sop.valid_to,&#10;            sop.deleted_at,&#10;            sop.cost_per_hour,&#10;            sop.theoretical_consumption,&#10;            sop.kg_co2_per_liter,&#10;            sop.created_at,&#10;            sop.created_by,&#10;            sop.updated_at,&#10;            sop.updated_by,&#10;            sop.is_system&#10;           FROM sms_other_parameters sop&#10;          WHERE ((((sop.valid_from &lt;= now()) AND (sop.valid_to &gt; now())) OR ((sop.valid_from &lt;= now()) AND (sop.valid_to IS NULL))) AND (sop.deleted_at IS NULL))&#10;          ORDER BY sop.valid_from) other_parameters ON ((other_parameters.machine_id = sm.id)))&#10;     LEFT JOIN sms_hiboo_equipment she ON (((sm.serial_number)::text = (she.serial_number)::text)))&#10;     JOIN sms_machine_type smt ON ((sm.type = smt.id)));">
         <column autoUpdated="false" defaultValue="null" digits="0" id="0" name="machine_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="machine_name" nullable="true" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="machine_sn" nullable="true" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="4" name="machine_model" nullable="true" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="5" name="machine_make" nullable="true" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="6" name="machine_category" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="7" name="machine_type" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="8" name="machine_type_name" nullable="true" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="9" name="tracker_teltonika_sn" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="10" name="tracker_hiboo_name" nullable="true" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="11" name="last_position" nullable="true" remarks="" size="2147483647" type="geometry" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="12" name="last_position_time" nullable="true" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="13" name="site_name" nullable="true" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="14" name="cost_per_hour" nullable="true" remarks="" size="5" type="int2" typeCode="5"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="15" name="theoretical_consumption" nullable="true" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="16" name="kg_co2_per_liter" nullable="true" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="17" name="tonne" nullable="true" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="18" name="volume" nullable="true" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="19" name="target_dump_time" nullable="true" remarks="" size="5" type="int2" typeCode="5"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="20" name="target_time_per_bucket" nullable="true" remarks="" size="5" type="int2" typeCode="5"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="21" name="is_deleted" nullable="true" remarks="" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="22" name="scraper_pusher" nullable="true" remarks="" size="1" type="bool" typeCode="-7"/>
      </table>
      <table name="sms_machines_with_tracker_id_and_hiboo_data" numRows="0" remarks="" schema="public" type="VIEW" viewSql=" SELECT sm.serial_number,&#10;    smtt.tracker_serial,&#10;    sm.name AS machine_name,&#10;    sm.model AS machine_model,&#10;    sm.make AS machine_make,&#10;    she.model AS hiboo_model,&#10;    she.make AS hiboo_make,&#10;    shdd.calendar_day_id,&#10;    shdd.operating_hours,&#10;    shdd.idle_hours,&#10;    shdd.working_hours,&#10;    shdd.fuel_used,&#10;    shdd.distance,&#10;    sm.id AS machine_id,&#10;    sm.model,&#10;    sm.name,&#10;    sm.type,&#10;    she.id AS equipment_id&#10;   FROM (((sms_machine sm&#10;     JOIN sms_hiboo_equipment she ON (((sm.serial_number)::text = (she.serial_number)::text)))&#10;     JOIN sms_hiboo_daily_data shdd ON ((she.id = shdd.equipment_id)))&#10;     LEFT JOIN sms_machine_teltonika_tracker smtt ON ((sm.id = smtt.machine_id)))&#10;  WHERE (shdd.calendar_day_id &lt; (to_char(now(), 'YYYYMMDD'::text))::integer)&#10;  ORDER BY shdd.calendar_day_id DESC;">
         <column autoUpdated="false" defaultValue="null" digits="0" id="0" name="serial_number" nullable="true" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tracker_serial" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="machine_name" nullable="true" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="machine_model" nullable="true" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="4" name="machine_make" nullable="true" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="5" name="hiboo_model" nullable="true" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="6" name="hiboo_make" nullable="true" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="7" name="calendar_day_id" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="8" name="operating_hours" nullable="true" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="9" name="idle_hours" nullable="true" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="10" name="working_hours" nullable="true" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="11" name="fuel_used" nullable="true" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="12" name="distance" nullable="true" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="13" name="machine_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="14" name="model" nullable="true" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="15" name="name" nullable="true" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="16" name="type" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="17" name="equipment_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111"/>
      </table>
      <table name="sms_mobile_events" numRows="251" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_mobile_events_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="machine_id" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="type" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="4" name="material" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="5" name="lat" nullable="true" remarks="" size="0" type="numeric" typeCode="2"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="6" name="lon" nullable="true" remarks="" size="0" type="numeric" typeCode="2"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="7" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_sms_mobile_events" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_mobile_events_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_sms_mobile_events_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_mobile_events_machine_id" unique="false">
            <column ascending="true" name="machine_id"/>
         </index>
         <index name="IX_sms_mobile_events_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
      </table>
      <table name="sms_other_parameters" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_other_parameters_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="machine_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_other_parameters_sms_machine_machine_id" implied="false" onDeleteCascade="true" schema="public" table="sms_machine"/>
         </column>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="3" name="valid_from" nullable="false" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="4" name="valid_to" nullable="true" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="5" name="deleted_at" nullable="true" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="6" name="cost_per_hour" nullable="false" remarks="" size="5" type="int2" typeCode="5"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="7" name="theoretical_consumption" nullable="false" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="8" name="kg_co2_per_liter" nullable="false" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="9" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="10" name="created_by" nullable="true" remarks="User who create the record. Null if System." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="11" name="updated_at" nullable="true" remarks="DateTime the record was last updated." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="12" name="updated_by" nullable="true" remarks="User who last updated the record." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="13" name="is_system" nullable="false" remarks="A system-generated record. Default = false" size="1" type="bool" typeCode="-7"/>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_sms_other_parameters" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_other_parameters_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_sms_other_parameters_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_other_parameters_is_system" unique="false">
            <column ascending="true" name="is_system"/>
         </index>
         <index name="IX_sms_other_parameters_machine_id" unique="false">
            <column ascending="true" name="machine_id"/>
         </index>
         <index name="IX_sms_other_parameters_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
         <index name="IX_sms_other_parameters_valid_from" unique="false">
            <column ascending="true" name="valid_from"/>
         </index>
         <index name="IX_sms_other_parameters_valid_to" unique="false">
            <column ascending="true" name="valid_to"/>
         </index>
      </table>
      <table name="sms_scraper_cycle" numRows="25427" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_scraper_cycle_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="day_id" nullable="false" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="cycle_day_id" nullable="false" remarks="" size="5" type="int2" typeCode="5"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="4" name="shift_day_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_scraper_cycle_sms_shift_day_shift_day_id" implied="false" onDeleteCascade="false" schema="public" table="sms_shift_day"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="5" name="scraper_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_scraper_cycle_sms_machine_scraper_id" implied="false" onDeleteCascade="false" schema="public" table="sms_machine"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="6" name="dozer_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_scraper_cycle_sms_machine_dozer_id" implied="false" onDeleteCascade="false" schema="public" table="sms_machine"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="7" name="load_daily_zone_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_scraper_cycle_sms_scraper_daily_zone_load_daily_zone_id" implied="false" onDeleteCascade="false" schema="public" table="sms_scraper_daily_zone"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="8" name="dump_daily_zone_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_scraper_cycle_sms_scraper_daily_zone_dump_daily_zone_id" implied="false" onDeleteCascade="false" schema="public" table="sms_scraper_daily_zone"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="9" name="load_zone_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_scraper_cycle_sms_zone_load_zone_id" implied="false" onDeleteCascade="false" schema="public" table="sms_zone"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="10" name="dump_zone_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_scraper_cycle_sms_zone_dump_zone_id" implied="false" onDeleteCascade="false" schema="public" table="sms_zone"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="11" name="local_hour" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="12" name="start_date" nullable="true" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="13" name="distance_loaded" nullable="true" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="14" name="distance_empty" nullable="true" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="15" name="total_cycle_time" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="16" name="travel_time_empty" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="17" name="travel_time_loaded" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="18" name="waiting_on_track_empty" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="19" name="waiting_on_track_loaded" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="20" name="stopped_engine_off_time" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="21" name="loading_time" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="22" name="dumping_time" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="23" name="waiting_for_loading_time" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="24" name="waiting_for_dumping_time" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="25" name="unknown_load" nullable="false" remarks="" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="26" name="is_approximate" nullable="false" remarks="" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="27" name="geom_load_dump" nullable="true" remarks="" size="2147483647" type="geometry" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="28" name="feature_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_scraper_cycle_features_feature_id" implied="false" onDeleteCascade="false" schema="public" table="features"/>
         </column>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="29" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="30" name="shift_day_name" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="31" name="unknown_dump" nullable="false" remarks="" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="32" name="dozer_parameter_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_scraper_cycle_sms_dozer_parameters_dozer_parameter_id" implied="false" onDeleteCascade="false" schema="public" table="sms_dozer_parameters"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="33" name="scraper_parameter_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_scraper_cycle_sms_scraper_parameters_scraper_parameter_~" implied="false" onDeleteCascade="false" schema="public" table="sms_scraper_parameters"/>
         </column>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_sms_scraper_cycle" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_scraper_cycle_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_sms_scraper_cycle_day_id" unique="false">
            <column ascending="true" name="day_id"/>
         </index>
         <index name="IX_sms_scraper_cycle_dozer_id" unique="false">
            <column ascending="true" name="dozer_id"/>
         </index>
         <index name="IX_sms_scraper_cycle_dozer_parameter_id" unique="false">
            <column ascending="true" name="dozer_parameter_id"/>
         </index>
         <index name="IX_sms_scraper_cycle_dump_daily_zone_id" unique="false">
            <column ascending="true" name="dump_daily_zone_id"/>
         </index>
         <index name="IX_sms_scraper_cycle_dump_zone_id" unique="false">
            <column ascending="true" name="dump_zone_id"/>
         </index>
         <index name="IX_sms_scraper_cycle_feature_id" unique="false">
            <column ascending="true" name="feature_id"/>
         </index>
         <index name="IX_sms_scraper_cycle_geom_load_dump" unique="false">
            <column ascending="true" name="geom_load_dump"/>
         </index>
         <index name="IX_sms_scraper_cycle_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_scraper_cycle_load_daily_zone_id" unique="false">
            <column ascending="true" name="load_daily_zone_id"/>
         </index>
         <index name="IX_sms_scraper_cycle_load_zone_id" unique="false">
            <column ascending="true" name="load_zone_id"/>
         </index>
         <index name="IX_sms_scraper_cycle_scraper_id" unique="false">
            <column ascending="true" name="scraper_id"/>
         </index>
         <index name="IX_sms_scraper_cycle_scraper_parameter_id" unique="false">
            <column ascending="true" name="scraper_parameter_id"/>
         </index>
         <index name="IX_sms_scraper_cycle_shift_day_id" unique="false">
            <column ascending="true" name="shift_day_id"/>
         </index>
         <index name="IX_sms_scraper_cycle_start_date" unique="false">
            <column ascending="true" name="start_date"/>
         </index>
         <index name="IX_sms_scraper_cycle_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
      </table>
      <table name="sms_scraper_daily_zone" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111">
            <child column="dump_daily_zone_id" foreignKey="FK_sms_scraper_cycle_sms_scraper_daily_zone_dump_daily_zone_id" implied="false" onDeleteCascade="false" schema="public" table="sms_scraper_cycle"/>
            <child column="load_daily_zone_id" foreignKey="FK_sms_scraper_cycle_sms_scraper_daily_zone_load_daily_zone_id" implied="false" onDeleteCascade="false" schema="public" table="sms_scraper_cycle"/>
            <child column="end_daily_zone_id" foreignKey="FK_sms_scraper_move_sms_scraper_daily_zone_end_daily_zone_id" implied="false" onDeleteCascade="false" schema="public" table="sms_scraper_move"/>
            <child column="start_daily_zone_id" foreignKey="FK_sms_scraper_move_sms_scraper_daily_zone_start_daily_zone_id" implied="false" onDeleteCascade="false" schema="public" table="sms_scraper_move"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_scraper_daily_zone_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="day_id" nullable="false" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="name" nullable="false" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="4" name="zone_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_scraper_daily_zone_sms_zone_zone_id" implied="false" onDeleteCascade="false" schema="public" table="sms_zone"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="5" name="polygon" nullable="false" remarks="" size="2147483647" type="geometry" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="6" name="center" nullable="true" remarks="" size="2147483647" type="geometry" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="7" name="feature_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_scraper_daily_zone_features_feature_id" implied="false" onDeleteCascade="false" schema="public" table="features"/>
         </column>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="8" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_sms_scraper_daily_zone" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_scraper_daily_zone_center" unique="false">
            <column ascending="true" name="center"/>
         </index>
         <index name="IX_sms_scraper_daily_zone_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_sms_scraper_daily_zone_day_id" unique="false">
            <column ascending="true" name="day_id"/>
         </index>
         <index name="IX_sms_scraper_daily_zone_feature_id" unique="false">
            <column ascending="true" name="feature_id"/>
         </index>
         <index name="IX_sms_scraper_daily_zone_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_scraper_daily_zone_name" unique="false">
            <column ascending="true" name="name"/>
         </index>
         <index name="IX_sms_scraper_daily_zone_polygon" unique="false">
            <column ascending="true" name="polygon"/>
         </index>
         <index name="IX_sms_scraper_daily_zone_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
         <index name="IX_sms_scraper_daily_zone_zone_id" unique="false">
            <column ascending="true" name="zone_id"/>
         </index>
      </table>
      <table name="sms_scraper_move" numRows="191942" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_scraper_move_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="scraper_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_scraper_move_sms_machine_scraper_id" implied="false" onDeleteCascade="false" schema="public" table="sms_machine"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="day_id" nullable="false" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="4" name="cycle_day_id" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="5" name="shift_day_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_scraper_move_sms_shift_day_shift_day_id" implied="false" onDeleteCascade="false" schema="public" table="sms_shift_day"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="6" name="type" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="7" name="start_date" nullable="false" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="8" name="duration" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="9" name="distance" nullable="true" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="10" name="geometry" nullable="true" remarks="" size="2147483647" type="geometry" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="11" name="dozer_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_scraper_move_sms_machine_dozer_id" implied="false" onDeleteCascade="false" schema="public" table="sms_machine"/>
         </column>
         <column autoUpdated="false" defaultValue="false" digits="0" id="12" name="dumpster_loaded_at_the_end" nullable="false" remarks="" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="13" name="start_daily_zone_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_scraper_move_sms_scraper_daily_zone_start_daily_zone_id" implied="false" onDeleteCascade="false" schema="public" table="sms_scraper_daily_zone"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="14" name="end_daily_zone_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_scraper_move_sms_scraper_daily_zone_end_daily_zone_id" implied="false" onDeleteCascade="false" schema="public" table="sms_scraper_daily_zone"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="15" name="zone_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_scraper_move_sms_zone_zone_id" implied="false" onDeleteCascade="false" schema="public" table="sms_zone"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="16" name="centroid" nullable="true" remarks="" size="2147483647" type="geometry" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="17" name="feature_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_scraper_move_features_feature_id" implied="false" onDeleteCascade="false" schema="public" table="features"/>
         </column>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="18" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="19" name="shift_day_name" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="20" name="scraper_parameter_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_scraper_move_sms_scraper_parameters_scraper_parameter_id" implied="false" onDeleteCascade="false" schema="public" table="sms_scraper_parameters"/>
         </column>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_sms_scraper_move" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_scraper_move_centroid" unique="false">
            <column ascending="true" name="centroid"/>
         </index>
         <index name="IX_sms_scraper_move_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_sms_scraper_move_day_id" unique="false">
            <column ascending="true" name="day_id"/>
         </index>
         <index name="IX_sms_scraper_move_dozer_id" unique="false">
            <column ascending="true" name="dozer_id"/>
         </index>
         <index name="IX_sms_scraper_move_end_daily_zone_id" unique="false">
            <column ascending="true" name="end_daily_zone_id"/>
         </index>
         <index name="IX_sms_scraper_move_feature_id" unique="false">
            <column ascending="true" name="feature_id"/>
         </index>
         <index name="IX_sms_scraper_move_geometry" unique="false">
            <column ascending="true" name="geometry"/>
         </index>
         <index name="IX_sms_scraper_move_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_scraper_move_scraper_parameter_id" unique="false">
            <column ascending="true" name="scraper_parameter_id"/>
         </index>
         <index name="IX_sms_scraper_move_shift_day_id" unique="false">
            <column ascending="true" name="shift_day_id"/>
         </index>
         <index name="IX_sms_scraper_move_start_daily_zone_id" unique="false">
            <column ascending="true" name="start_daily_zone_id"/>
         </index>
         <index name="IX_sms_scraper_move_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
         <index name="IX_sms_scraper_move_type" unique="false">
            <column ascending="true" name="type"/>
         </index>
         <index name="IX_sms_scraper_move_zone_id" unique="false">
            <column ascending="true" name="zone_id"/>
         </index>
         <index name="UQ_sms_scraper_move_scraperid_startdate" unique="true">
            <column ascending="true" name="scraper_id"/>
            <column ascending="true" name="start_date"/>
         </index>
      </table>
      <table name="sms_scraper_parameters" numRows="10" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111">
            <child column="scraper_parameter_id" foreignKey="FK_sms_scraper_cycle_sms_scraper_parameters_scraper_parameter_~" implied="false" onDeleteCascade="false" schema="public" table="sms_scraper_cycle"/>
            <child column="scraper_parameter_id" foreignKey="FK_sms_scraper_move_sms_scraper_parameters_scraper_parameter_id" implied="false" onDeleteCascade="false" schema="public" table="sms_scraper_move"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_scraper_parameters_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="machine_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_scraper_parameters_sms_machine_machine_id" implied="false" onDeleteCascade="true" schema="public" table="sms_machine"/>
         </column>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="3" name="valid_from" nullable="false" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="4" name="valid_to" nullable="true" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="5" name="deleted_at" nullable="true" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="6" name="cost_per_hour" nullable="false" remarks="" size="5" type="int2" typeCode="5"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="7" name="theoretical_consumption" nullable="false" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="8" name="kg_co2_per_liter" nullable="false" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="9" name="target_dump_time" nullable="false" remarks="" size="5" type="int2" typeCode="5"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="10" name="tonne" nullable="false" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="11" name="volume" nullable="false" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="12" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="13" name="created_by" nullable="true" remarks="User who create the record. Null if System." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="14" name="updated_at" nullable="true" remarks="DateTime the record was last updated." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="15" name="updated_by" nullable="true" remarks="User who last updated the record." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="16" name="is_system" nullable="false" remarks="A system-generated record. Default = false" size="1" type="bool" typeCode="-7"/>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_sms_scraper_parameters" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_scraper_parameters_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_sms_scraper_parameters_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_scraper_parameters_is_system" unique="false">
            <column ascending="true" name="is_system"/>
         </index>
         <index name="IX_sms_scraper_parameters_machine_id" unique="false">
            <column ascending="true" name="machine_id"/>
         </index>
         <index name="IX_sms_scraper_parameters_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
         <index name="IX_sms_scraper_parameters_valid_from" unique="false">
            <column ascending="true" name="valid_from"/>
         </index>
         <index name="IX_sms_scraper_parameters_valid_to" unique="false">
            <column ascending="true" name="valid_to"/>
         </index>
      </table>
      <table name="sms_shift" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111">
            <child column="shift_id" foreignKey="FK_sms_shift_day_sms_shift_shift_id" implied="false" onDeleteCascade="true" schema="public" table="sms_shift_day"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_shift_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="site_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_shift_sms_site_site_id" implied="false" onDeleteCascade="true" schema="public" table="sms_site"/>
         </column>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="3" name="valid_from" nullable="false" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="4" name="valid_to" nullable="true" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="5" name="deleted_at" nullable="true" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="6" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="7" name="created_by" nullable="true" remarks="User who create the record. Null if System." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="8" name="updated_at" nullable="true" remarks="DateTime the record was last updated." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="9" name="updated_by" nullable="true" remarks="User who last updated the record." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="10" name="is_system" nullable="false" remarks="A system-generated record. Default = false" size="1" type="bool" typeCode="-7"/>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_sms_shift" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_shift_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_sms_shift_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_shift_is_system" unique="false">
            <column ascending="true" name="is_system"/>
         </index>
         <index name="IX_sms_shift_site_id" unique="false">
            <column ascending="true" name="site_id"/>
         </index>
         <index name="IX_sms_shift_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
         <index name="IX_sms_shift_valid_from" unique="false">
            <column ascending="true" name="valid_from"/>
         </index>
         <index name="IX_sms_shift_valid_to" unique="false">
            <column ascending="true" name="valid_to"/>
         </index>
      </table>
      <table name="sms_shift_day" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111">
            <child column="shift_day_id" foreignKey="FK_sms_fixed_zone_algo_result_sms_shift_day_shift_day_id" implied="false" onDeleteCascade="false" schema="public" table="sms_fixed_zone_algo_result"/>
            <child column="shift_day_id" foreignKey="FK_sms_loader_move_sms_shift_day_shift_day_id" implied="false" onDeleteCascade="false" schema="public" table="sms_loader_move"/>
            <child column="shift_day_id" foreignKey="FK_sms_scraper_cycle_sms_shift_day_shift_day_id" implied="false" onDeleteCascade="false" schema="public" table="sms_scraper_cycle"/>
            <child column="shift_day_id" foreignKey="FK_sms_scraper_move_sms_shift_day_shift_day_id" implied="false" onDeleteCascade="false" schema="public" table="sms_scraper_move"/>
            <child column="shift_day_id" foreignKey="FK_sms_tgd_computed_info_sms_shift_day_shift_day_id" implied="false" onDeleteCascade="false" schema="public" table="sms_tgd_computed_info"/>
            <child column="shift_day_id" foreignKey="FK_sms_truck_cycle_sms_shift_day_shift_day_id" implied="false" onDeleteCascade="false" schema="public" table="sms_truck_cycle"/>
            <child column="shift_day_id" foreignKey="FK_sms_truck_move_sms_shift_day_shift_day_id" implied="false" onDeleteCascade="false" schema="public" table="sms_truck_move"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_shift_day_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="shift_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_shift_day_sms_shift_shift_id" implied="false" onDeleteCascade="true" schema="public" table="sms_shift"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="name" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="4" name="day_mask" nullable="false" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="5" name="start_hour" nullable="false" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="6" name="start_minute" nullable="false" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="7" name="end_hour" nullable="false" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="8" name="end_minute" nullable="false" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="9" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="10" name="created_by" nullable="true" remarks="User who create the record. Null if System." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="11" name="updated_at" nullable="true" remarks="DateTime the record was last updated." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="12" name="updated_by" nullable="true" remarks="User who last updated the record." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="13" name="is_system" nullable="false" remarks="A system-generated record. Default = false" size="1" type="bool" typeCode="-7"/>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_sms_shift_day" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_shift_day_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_sms_shift_day_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_shift_day_is_system" unique="false">
            <column ascending="true" name="is_system"/>
         </index>
         <index name="IX_sms_shift_day_shift_id" unique="false">
            <column ascending="true" name="shift_id"/>
         </index>
         <index name="IX_sms_shift_day_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
      </table>
      <table name="sms_site" numRows="2" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111">
            <child column="site_id" foreignKey="FK_sms_machine_site_association_sms_site_site_id" implied="false" onDeleteCascade="true" schema="public" table="sms_machine_site_association"/>
            <child column="site_id" foreignKey="FK_sms_shift_sms_site_site_id" implied="false" onDeleteCascade="true" schema="public" table="sms_shift"/>
            <child column="site_id" foreignKey="FK_sms_site_parameters_sms_site_site_id" implied="false" onDeleteCascade="true" schema="public" table="sms_site_parameters"/>
            <child column="site_id" foreignKey="FK_sms_zone_sms_site_site_id" implied="false" onDeleteCascade="false" schema="public" table="sms_zone"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_site_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="name" nullable="false" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="geo_center" nullable="true" remarks="" size="2147483647" type="geometry" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="4" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="5" name="created_by" nullable="true" remarks="User who create the record. Null if System." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="6" name="updated_at" nullable="true" remarks="DateTime the record was last updated." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="7" name="updated_by" nullable="true" remarks="User who last updated the record." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="8" name="is_system" nullable="false" remarks="A system-generated record. Default = false" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="9" name="deleted_at" nullable="true" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="10" name="description" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="11" name="reports_email" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_sms_site" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_site_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_sms_site_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_site_is_system" unique="false">
            <column ascending="true" name="is_system"/>
         </index>
         <index name="IX_sms_site_name" unique="false">
            <column ascending="true" name="name"/>
         </index>
         <index name="IX_sms_site_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
      </table>
      <table name="sms_site_parameters" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_site_parameters_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="site_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_site_parameters_sms_site_site_id" implied="false" onDeleteCascade="true" schema="public" table="sms_site"/>
         </column>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="3" name="valid_from" nullable="false" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="4" name="valid_to" nullable="true" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="5" name="deleted_at" nullable="true" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="6" name="gnr_cost_per_liter" nullable="false" remarks="" size="5" type="int2" typeCode="5"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="7" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="8" name="created_by" nullable="true" remarks="User who create the record. Null if System." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="9" name="updated_at" nullable="true" remarks="DateTime the record was last updated." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="10" name="updated_by" nullable="true" remarks="User who last updated the record." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="11" name="is_system" nullable="false" remarks="A system-generated record. Default = false" size="1" type="bool" typeCode="-7"/>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_sms_site_parameters" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_site_parameters_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_sms_site_parameters_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_site_parameters_is_system" unique="false">
            <column ascending="true" name="is_system"/>
         </index>
         <index name="IX_sms_site_parameters_site_id" unique="false">
            <column ascending="true" name="site_id"/>
         </index>
         <index name="IX_sms_site_parameters_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
         <index name="IX_sms_site_parameters_valid_from" unique="false">
            <column ascending="true" name="valid_from"/>
         </index>
         <index name="IX_sms_site_parameters_valid_to" unique="false">
            <column ascending="true" name="valid_to"/>
         </index>
      </table>
      <table name="sms_state" numRows="2" remarks="" schema="public" type="TABLE">
         <column autoUpdated="true" defaultValue="null" digits="0" id="0" name="id" nullable="false" remarks="" size="10" type="int4" typeCode="4">
            <child column="state" foreignKey="FK_sms_machine_teltonika_tracker_sms_state_state_tenant_id" implied="false" onDeleteCascade="false" schema="public" table="sms_machine_teltonika_tracker"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <child column="tenant_id" foreignKey="FK_sms_machine_teltonika_tracker_sms_state_state_tenant_id" implied="false" onDeleteCascade="false" schema="public" table="sms_machine_teltonika_tracker"/>
            <parent column="id" foreignKey="FK_sms_state_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="name" nullable="false" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="description" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="4" name="created_at" nullable="true" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="5" name="created_by" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="6" name="updated_at" nullable="true" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="7" name="updated_by" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="8" name="is_system" nullable="false" remarks="" size="1" type="bool" typeCode="-7"/>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <primaryKey column="tenant_id" sequenceNumberInPK="2"/>
         <index name="PK_sms_state" unique="true">
            <column ascending="true" name="id"/>
            <column ascending="true" name="tenant_id"/>
         </index>
         <index name="IX_sms_state_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_sms_state_is_system" unique="false">
            <column ascending="true" name="is_system"/>
         </index>
         <index name="IX_sms_state_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
      </table>
      <table name="sms_teltonika_gps_data" numRows="16609196" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="null" digits="0" id="0" name="tenant_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="tenant_id" foreignKey="FK_sms_teltonika_gps_data_sms_teltonika_tracker_serial_number_~" implied="false" onDeleteCascade="true" schema="public" table="sms_teltonika_tracker"/>
            <parent column="id" foreignKey="FK_sms_teltonika_gps_data_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="serial_number" nullable="false" remarks="" size="2147483647" type="text" typeCode="12">
            <parent column="serial_number" foreignKey="FK_sms_teltonika_gps_data_sms_teltonika_tracker_serial_number_~" implied="false" onDeleteCascade="true" schema="public" table="sms_teltonika_tracker"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="6" id="2" name="time" nullable="false" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="3" name="id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <child column="id" foreignKey="FK_sms_tgd_computed_info_sms_teltonika_gps_data_id" implied="false" onDeleteCascade="true" schema="public" table="sms_tgd_computed_info"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="4" name="coord" nullable="true" remarks="" size="2147483647" type="geometry" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="5" name="speed" nullable="true" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="6" name="extv" nullable="true" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="7" name="ign" nullable="true" remarks="" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="8" name="dumpster_proximity" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="9" name="created_at" nullable="false" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="10" name="alt" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <primaryKey column="serial_number" sequenceNumberInPK="1"/>
         <primaryKey column="time" sequenceNumberInPK="2"/>
         <primaryKey column="tenant_id" sequenceNumberInPK="3"/>
         <index name="PK_sms_teltonika_gps_data" unique="true">
            <column ascending="true" name="serial_number"/>
            <column ascending="true" name="time"/>
            <column ascending="true" name="tenant_id"/>
         </index>
         <index name="AK_sms_teltonika_gps_data_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_teltonika_gps_data_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_teltonika_gps_data_serial_number_tenant_id" unique="false">
            <column ascending="true" name="serial_number"/>
            <column ascending="true" name="tenant_id"/>
         </index>
         <index name="IX_sms_teltonika_gps_data_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
      </table>
      <table name="sms_teltonika_scraper_gps_data" numRows="53" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_teltonika_scraper_gps_data_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="6" id="2" name="time" nullable="false" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="coord" nullable="true" remarks="" size="2147483647" type="geometry" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="4" name="ign" nullable="true" remarks="" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="5" name="dumpster_open" nullable="false" remarks="" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="6" name="dozer_nearby" nullable="true" remarks="" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="7" name="scraper_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_teltonika_scraper_gps_data_sms_machine_scraper_id" implied="false" onDeleteCascade="true" schema="public" table="sms_machine"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="8" name="dozer_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_teltonika_scraper_gps_data_sms_machine_dozer_id" implied="false" onDeleteCascade="false" schema="public" table="sms_machine"/>
         </column>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="9" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_sms_teltonika_scraper_gps_data" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_teltonika_scraper_gps_data_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_sms_teltonika_scraper_gps_data_dozer_id" unique="false">
            <column ascending="true" name="dozer_id"/>
         </index>
         <index name="IX_sms_teltonika_scraper_gps_data_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_teltonika_scraper_gps_data_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
         <index name="UQ_sms_teltonika_scraper_gps_data_scraperid_time" unique="true">
            <column ascending="true" name="scraper_id"/>
            <column ascending="true" name="time"/>
         </index>
      </table>
      <table name="sms_teltonika_tracker" numRows="35" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="null" digits="0" id="0" name="serial_number" nullable="false" remarks="" size="2147483647" type="text" typeCode="12">
            <child column="tracker_serial" foreignKey="FK_sms_machine_teltonika_tracker_sms_teltonika_tracker_tracker~" implied="false" onDeleteCascade="true" schema="public" table="sms_machine_teltonika_tracker"/>
            <child column="serial_number" foreignKey="FK_sms_teltonika_gps_data_sms_teltonika_tracker_serial_number_~" implied="false" onDeleteCascade="true" schema="public" table="sms_teltonika_gps_data"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <child column="tenant_id" foreignKey="FK_sms_machine_teltonika_tracker_sms_teltonika_tracker_tracker~" implied="false" onDeleteCascade="true" schema="public" table="sms_machine_teltonika_tracker"/>
            <child column="tenant_id" foreignKey="FK_sms_teltonika_gps_data_sms_teltonika_tracker_serial_number_~" implied="false" onDeleteCascade="true" schema="public" table="sms_teltonika_gps_data"/>
            <parent column="id" foreignKey="FK_sms_teltonika_tracker_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="2" name="created_at" nullable="false" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="3" name="updated_at" nullable="true" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="4" name="deleted_at" nullable="true" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <primaryKey column="serial_number" sequenceNumberInPK="1"/>
         <primaryKey column="tenant_id" sequenceNumberInPK="2"/>
         <index name="PK_sms_teltonika_tracker" unique="true">
            <column ascending="true" name="serial_number"/>
            <column ascending="true" name="tenant_id"/>
         </index>
         <index name="IX_sms_teltonika_tracker_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_sms_teltonika_tracker_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
      </table>
      <table name="sms_tgd_computed_info" numRows="12636282" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_tgd_computed_info_sms_teltonika_gps_data_id" implied="false" onDeleteCascade="true" schema="public" table="sms_teltonika_gps_data"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_tgd_computed_info_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="delta_time" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="delta_alt" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="4" name="delta_distance" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="5" name="computed_speed" nullable="true" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="6" name="shift_day_name" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="7" name="day_id" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="8" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="9" name="shift_day_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_tgd_computed_info_sms_shift_day_shift_day_id" implied="false" onDeleteCascade="false" schema="public" table="sms_shift_day"/>
         </column>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_sms_tgd_computed_info" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_tgd_computed_info_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_sms_tgd_computed_info_day_id" unique="false">
            <column ascending="true" name="day_id"/>
         </index>
         <index name="IX_sms_tgd_computed_info_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_tgd_computed_info_shift_day_id" unique="false">
            <column ascending="true" name="shift_day_id"/>
         </index>
         <index name="IX_sms_tgd_computed_info_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
      </table>
      <table name="sms_truck_cycle" numRows="54182" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_truck_cycle_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="day_id" nullable="false" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="cycle_day_id" nullable="false" remarks="" size="5" type="int2" typeCode="5"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="4" name="truck_parameter_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_truck_cycle_sms_truck_parameters_truck_parameter_id" implied="false" onDeleteCascade="false" schema="public" table="sms_truck_parameters"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="5" name="truck_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_truck_cycle_sms_machine_truck_id" implied="false" onDeleteCascade="false" schema="public" table="sms_machine"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="6" name="loader_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_truck_cycle_sms_machine_loader_id" implied="false" onDeleteCascade="false" schema="public" table="sms_machine"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="7" name="load_daily_zone_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_truck_cycle_sms_truck_daily_zone_load_daily_zone_id" implied="false" onDeleteCascade="false" schema="public" table="sms_truck_daily_zone"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="8" name="dump_daily_zone_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_truck_cycle_sms_truck_daily_zone_dump_daily_zone_id" implied="false" onDeleteCascade="false" schema="public" table="sms_truck_daily_zone"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="9" name="local_hour" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="10" name="start_date" nullable="true" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="11" name="distance_loaded" nullable="true" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="12" name="distance_empty" nullable="true" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="13" name="total_cycle_time" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="14" name="travel_time_empty" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="15" name="travel_time_loaded" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="16" name="waiting_on_track_empty" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="17" name="waiting_on_track_loaded" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="18" name="stopped_engine_off_time" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="19" name="loading_time" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="20" name="dumping_time" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="21" name="waiting_for_loading_time" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="22" name="waiting_for_dumping_time" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="23" name="unknown_load" nullable="false" remarks="" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="24" name="is_approximate" nullable="false" remarks="" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="25" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="26" name="feature_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_truck_cycle_features_feature_id" implied="false" onDeleteCascade="false" schema="public" table="features"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="27" name="geom_load_dump" nullable="true" remarks="" size="2147483647" type="geometry" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="28" name="dump_zone_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_truck_cycle_sms_zone_dump_zone_id" implied="false" onDeleteCascade="false" schema="public" table="sms_zone"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="29" name="load_zone_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_truck_cycle_sms_zone_load_zone_id" implied="false" onDeleteCascade="false" schema="public" table="sms_zone"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="30" name="loader_parameter_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_truck_cycle_sms_loader_parameters_loader_parameter_id" implied="false" onDeleteCascade="false" schema="public" table="sms_loader_parameters"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="31" name="shift_day_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_truck_cycle_sms_shift_day_shift_day_id" implied="false" onDeleteCascade="false" schema="public" table="sms_shift_day"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="32" name="shift_day_name" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_sms_truck_cycle" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_truck_cycle_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_sms_truck_cycle_day_id" unique="false">
            <column ascending="true" name="day_id"/>
         </index>
         <index name="IX_sms_truck_cycle_dump_daily_zone_id" unique="false">
            <column ascending="true" name="dump_daily_zone_id"/>
         </index>
         <index name="IX_sms_truck_cycle_dump_zone_id" unique="false">
            <column ascending="true" name="dump_zone_id"/>
         </index>
         <index name="IX_sms_truck_cycle_feature_id" unique="false">
            <column ascending="true" name="feature_id"/>
         </index>
         <index name="IX_sms_truck_cycle_geom_load_dump" unique="false">
            <column ascending="true" name="geom_load_dump"/>
         </index>
         <index name="IX_sms_truck_cycle_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_truck_cycle_load_daily_zone_id" unique="false">
            <column ascending="true" name="load_daily_zone_id"/>
         </index>
         <index name="IX_sms_truck_cycle_load_zone_id" unique="false">
            <column ascending="true" name="load_zone_id"/>
         </index>
         <index name="IX_sms_truck_cycle_loader_id" unique="false">
            <column ascending="true" name="loader_id"/>
         </index>
         <index name="IX_sms_truck_cycle_loader_parameter_id" unique="false">
            <column ascending="true" name="loader_parameter_id"/>
         </index>
         <index name="IX_sms_truck_cycle_shift_day_id" unique="false">
            <column ascending="true" name="shift_day_id"/>
         </index>
         <index name="IX_sms_truck_cycle_start_date" unique="false">
            <column ascending="true" name="start_date"/>
         </index>
         <index name="IX_sms_truck_cycle_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
         <index name="IX_sms_truck_cycle_truck_id" unique="false">
            <column ascending="true" name="truck_id"/>
         </index>
         <index name="IX_sms_truck_cycle_truck_parameter_id" unique="false">
            <column ascending="true" name="truck_parameter_id"/>
         </index>
      </table>
      <table name="sms_truck_daily_zone" numRows="5714" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111">
            <child column="dump_daily_zone_id" foreignKey="FK_sms_truck_cycle_sms_truck_daily_zone_dump_daily_zone_id" implied="false" onDeleteCascade="false" schema="public" table="sms_truck_cycle"/>
            <child column="load_daily_zone_id" foreignKey="FK_sms_truck_cycle_sms_truck_daily_zone_load_daily_zone_id" implied="false" onDeleteCascade="false" schema="public" table="sms_truck_cycle"/>
            <child column="end_daily_zone_id" foreignKey="FK_sms_truck_move_sms_truck_daily_zone_end_daily_zone_id" implied="false" onDeleteCascade="false" schema="public" table="sms_truck_move"/>
            <child column="start_daily_zone_id" foreignKey="FK_sms_truck_move_sms_truck_daily_zone_start_daily_zone_id" implied="false" onDeleteCascade="false" schema="public" table="sms_truck_move"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_truck_daily_zone_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="day_id" nullable="false" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="name" nullable="false" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="4" name="zone_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_truck_daily_zone_sms_zone_zone_id" implied="false" onDeleteCascade="false" schema="public" table="sms_zone"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="5" name="polygon" nullable="false" remarks="" size="2147483647" type="geometry" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="6" name="center" nullable="true" remarks="" size="2147483647" type="geometry" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="7" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="8" name="feature_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_truck_daily_zone_features_feature_id" implied="false" onDeleteCascade="false" schema="public" table="features"/>
         </column>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_sms_truck_daily_zone" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_truck_daily_zone_center" unique="false">
            <column ascending="true" name="center"/>
         </index>
         <index name="IX_sms_truck_daily_zone_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_sms_truck_daily_zone_day_id" unique="false">
            <column ascending="true" name="day_id"/>
         </index>
         <index name="IX_sms_truck_daily_zone_feature_id" unique="false">
            <column ascending="true" name="feature_id"/>
         </index>
         <index name="IX_sms_truck_daily_zone_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_truck_daily_zone_name" unique="false">
            <column ascending="true" name="name"/>
         </index>
         <index name="IX_sms_truck_daily_zone_polygon" unique="false">
            <column ascending="true" name="polygon"/>
         </index>
         <index name="IX_sms_truck_daily_zone_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
         <index name="IX_sms_truck_daily_zone_zone_id" unique="false">
            <column ascending="true" name="zone_id"/>
         </index>
      </table>
      <table name="sms_truck_move" numRows="685364" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_truck_move_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="truck_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_truck_move_sms_machine_truck_id" implied="false" onDeleteCascade="false" schema="public" table="sms_machine"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="day_id" nullable="false" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="4" name="cycle_day_id" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="5" name="truck_parameter_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_truck_move_sms_truck_parameters_truck_parameter_id" implied="false" onDeleteCascade="false" schema="public" table="sms_truck_parameters"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="6" name="type" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="7" name="start_date" nullable="false" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="8" name="duration" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="9" name="distance" nullable="true" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="10" name="geometry" nullable="true" remarks="" size="2147483647" type="geometry" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="11" name="loader_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_truck_move_sms_machine_loader_id" implied="false" onDeleteCascade="false" schema="public" table="sms_machine"/>
         </column>
         <column autoUpdated="false" defaultValue="false" digits="0" id="12" name="dumpster_loaded_at_the_end" nullable="false" remarks="" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="13" name="start_daily_zone_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_truck_move_sms_truck_daily_zone_start_daily_zone_id" implied="false" onDeleteCascade="false" schema="public" table="sms_truck_daily_zone"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="14" name="end_daily_zone_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_truck_move_sms_truck_daily_zone_end_daily_zone_id" implied="false" onDeleteCascade="false" schema="public" table="sms_truck_daily_zone"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="15" name="centroid" nullable="true" remarks="" size="2147483647" type="geometry" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="16" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="17" name="feature_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_truck_move_features_feature_id" implied="false" onDeleteCascade="false" schema="public" table="features"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="18" name="zone_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_truck_move_sms_zone_zone_id" implied="false" onDeleteCascade="false" schema="public" table="sms_zone"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="19" name="shift_day_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_truck_move_sms_shift_day_shift_day_id" implied="false" onDeleteCascade="false" schema="public" table="sms_shift_day"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="20" name="shift_day_name" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_sms_truck_move" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_truck_move_centroid" unique="false">
            <column ascending="true" name="centroid"/>
         </index>
         <index name="IX_sms_truck_move_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_sms_truck_move_day_id" unique="false">
            <column ascending="true" name="day_id"/>
         </index>
         <index name="IX_sms_truck_move_end_daily_zone_id" unique="false">
            <column ascending="true" name="end_daily_zone_id"/>
         </index>
         <index name="IX_sms_truck_move_feature_id" unique="false">
            <column ascending="true" name="feature_id"/>
         </index>
         <index name="IX_sms_truck_move_geometry" unique="false">
            <column ascending="true" name="geometry"/>
         </index>
         <index name="IX_sms_truck_move_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_truck_move_loader_id" unique="false">
            <column ascending="true" name="loader_id"/>
         </index>
         <index name="IX_sms_truck_move_shift_day_id" unique="false">
            <column ascending="true" name="shift_day_id"/>
         </index>
         <index name="IX_sms_truck_move_start_daily_zone_id" unique="false">
            <column ascending="true" name="start_daily_zone_id"/>
         </index>
         <index name="IX_sms_truck_move_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
         <index name="IX_sms_truck_move_truck_parameter_id" unique="false">
            <column ascending="true" name="truck_parameter_id"/>
         </index>
         <index name="IX_sms_truck_move_type" unique="false">
            <column ascending="true" name="type"/>
         </index>
         <index name="IX_sms_truck_move_zone_id" unique="false">
            <column ascending="true" name="zone_id"/>
         </index>
         <index name="UQ_sms_truck_move_truckid_startdate" unique="true">
            <column ascending="true" name="truck_id"/>
            <column ascending="true" name="start_date"/>
         </index>
      </table>
      <table name="sms_truck_parameters" numRows="13" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111">
            <child column="truck_parameter_id" foreignKey="FK_sms_truck_cycle_sms_truck_parameters_truck_parameter_id" implied="false" onDeleteCascade="false" schema="public" table="sms_truck_cycle"/>
            <child column="truck_parameter_id" foreignKey="FK_sms_truck_move_sms_truck_parameters_truck_parameter_id" implied="false" onDeleteCascade="false" schema="public" table="sms_truck_move"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_truck_parameters_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="machine_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_truck_parameters_sms_machine_machine_id" implied="false" onDeleteCascade="true" schema="public" table="sms_machine"/>
         </column>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="3" name="valid_from" nullable="false" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="4" name="valid_to" nullable="true" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="5" name="deleted_at" nullable="true" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="6" name="cost_per_hour" nullable="false" remarks="" size="5" type="int2" typeCode="5"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="7" name="theoretical_consumption" nullable="false" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="8" name="kg_co2_per_liter" nullable="false" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="9" name="target_dump_time" nullable="false" remarks="" size="5" type="int2" typeCode="5"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="10" name="tonne" nullable="false" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="null" digits="17" id="11" name="volume" nullable="false" remarks="" size="17" type="float8" typeCode="8"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="12" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="13" name="created_by" nullable="true" remarks="User who create the record. Null if System." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="14" name="updated_at" nullable="true" remarks="DateTime the record was last updated." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="15" name="updated_by" nullable="true" remarks="User who last updated the record." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="16" name="is_system" nullable="false" remarks="A system-generated record. Default = false" size="1" type="bool" typeCode="-7"/>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_sms_truck_parameters" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_truck_parameters_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_sms_truck_parameters_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_truck_parameters_is_system" unique="false">
            <column ascending="true" name="is_system"/>
         </index>
         <index name="IX_sms_truck_parameters_machine_id" unique="false">
            <column ascending="true" name="machine_id"/>
         </index>
         <index name="IX_sms_truck_parameters_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
         <index name="IX_sms_truck_parameters_valid_from" unique="false">
            <column ascending="true" name="valid_from"/>
         </index>
         <index name="IX_sms_truck_parameters_valid_to" unique="false">
            <column ascending="true" name="valid_to"/>
         </index>
      </table>
      <table name="sms_zone" numRows="48" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111">
            <child column="zone_id" foreignKey="FK_sms_fixed_zone_algo_result_sms_zone_zone_id" implied="false" onDeleteCascade="false" schema="public" table="sms_fixed_zone_algo_result"/>
            <child column="zone_id" foreignKey="FK_sms_loader_daily_zone_sms_zone_zone_id" implied="false" onDeleteCascade="false" schema="public" table="sms_loader_daily_zone"/>
            <child column="zone_id" foreignKey="FK_sms_loader_move_sms_zone_zone_id" implied="false" onDeleteCascade="false" schema="public" table="sms_loader_move"/>
            <child column="dump_zone_id" foreignKey="FK_sms_scraper_cycle_sms_zone_dump_zone_id" implied="false" onDeleteCascade="false" schema="public" table="sms_scraper_cycle"/>
            <child column="load_zone_id" foreignKey="FK_sms_scraper_cycle_sms_zone_load_zone_id" implied="false" onDeleteCascade="false" schema="public" table="sms_scraper_cycle"/>
            <child column="zone_id" foreignKey="FK_sms_scraper_daily_zone_sms_zone_zone_id" implied="false" onDeleteCascade="false" schema="public" table="sms_scraper_daily_zone"/>
            <child column="zone_id" foreignKey="FK_sms_scraper_move_sms_zone_zone_id" implied="false" onDeleteCascade="false" schema="public" table="sms_scraper_move"/>
            <child column="dump_zone_id" foreignKey="FK_sms_truck_cycle_sms_zone_dump_zone_id" implied="false" onDeleteCascade="false" schema="public" table="sms_truck_cycle"/>
            <child column="load_zone_id" foreignKey="FK_sms_truck_cycle_sms_zone_load_zone_id" implied="false" onDeleteCascade="false" schema="public" table="sms_truck_cycle"/>
            <child column="zone_id" foreignKey="FK_sms_truck_daily_zone_sms_zone_zone_id" implied="false" onDeleteCascade="false" schema="public" table="sms_truck_daily_zone"/>
            <child column="zone_id" foreignKey="FK_sms_truck_move_sms_zone_zone_id" implied="false" onDeleteCascade="false" schema="public" table="sms_truck_move"/>
            <child column="parent_id" foreignKey="FK_sms_zone_sms_zone_parent_id" implied="false" onDeleteCascade="true" schema="public" table="sms_zone"/>
            <child column="zone_id" foreignKey="FK_sms_zone_attributes_sms_zone_zone_id" implied="false" onDeleteCascade="true" schema="public" table="sms_zone_attributes"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_zone_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="name" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="parent_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_zone_sms_zone_parent_id" implied="false" onDeleteCascade="true" schema="public" table="sms_zone"/>
         </column>
         <column autoUpdated="false" defaultValue="false" digits="0" id="4" name="accept_load" nullable="false" remarks="" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="5" name="accept_dump" nullable="false" remarks="" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="6" name="accept_stop" nullable="false" remarks="" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="7" name="dump_time_coef" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="8" name="load_time_coef" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="9" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="10" name="created_by" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="11" name="updated_at" nullable="true" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="12" name="updated_by" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="13" name="is_system" nullable="false" remarks="" size="1" type="bool" typeCode="-7"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="14" name="center" nullable="true" remarks="" size="2147483647" type="geometry" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="15" name="deleted_at" nullable="true" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="16" name="geometry_3d" nullable="true" remarks="" size="2147483647" type="geometry" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="17" name="polygon" nullable="false" remarks="" size="2147483647" type="geometry" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="18" name="site_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_zone_sms_site_site_id" implied="false" onDeleteCascade="false" schema="public" table="sms_site"/>
         </column>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="19" name="valid_from" nullable="false" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="20" name="valid_to" nullable="true" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="21" name="feature_id" nullable="true" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_zone_features_feature_id" implied="false" onDeleteCascade="false" schema="public" table="features"/>
         </column>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_sms_zone" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_zone_center" unique="false">
            <column ascending="true" name="center"/>
         </index>
         <index name="IX_sms_zone_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_sms_zone_feature_id" unique="false">
            <column ascending="true" name="feature_id"/>
         </index>
         <index name="IX_sms_zone_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_zone_is_system" unique="false">
            <column ascending="true" name="is_system"/>
         </index>
         <index name="IX_sms_zone_parent_id" unique="false">
            <column ascending="true" name="parent_id"/>
         </index>
         <index name="IX_sms_zone_polygon" unique="false">
            <column ascending="true" name="polygon"/>
         </index>
         <index name="IX_sms_zone_site_id" unique="false">
            <column ascending="true" name="site_id"/>
         </index>
         <index name="IX_sms_zone_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
      </table>
      <table name="sms_zone_attributes" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_zone_attributes_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="zone_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_sms_zone_attributes_sms_zone_zone_id" implied="false" onDeleteCascade="true" schema="public" table="sms_zone"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="name" nullable="false" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="4" name="value" nullable="false" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="5" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="6" name="created_by" nullable="true" remarks="User who create the record. Null if System." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="7" name="updated_at" nullable="true" remarks="DateTime the record was last updated." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="8" name="updated_by" nullable="true" remarks="User who last updated the record." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="9" name="is_system" nullable="false" remarks="A system-generated record. Default = false" size="1" type="bool" typeCode="-7"/>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_sms_zone_attributes" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_zone_attributes_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_sms_zone_attributes_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_sms_zone_attributes_is_system" unique="false">
            <column ascending="true" name="is_system"/>
         </index>
         <index name="IX_sms_zone_attributes_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
         <index name="IX_sms_zone_attributes_zone_id" unique="false">
            <column ascending="true" name="zone_id"/>
         </index>
      </table>
      <table name="spatial_ref_sys" numRows="8500" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="null" digits="0" id="0" name="srid" nullable="false" remarks="" size="10" type="int4" typeCode="4">
            <child column="srid" foreignKey="Implied Constraint" implied="true" onDeleteCascade="false" schema="public" table="geography_columns"/>
            <child column="srid" foreignKey="Implied Constraint" implied="true" onDeleteCascade="false" schema="public" table="geometry_columns"/>
            <child column="srid" foreignKey="Implied Constraint" implied="true" onDeleteCascade="false" schema="public" table="maps"/>
            <child column="srid" foreignKey="Implied Constraint" implied="true" onDeleteCascade="false" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="auth_name" nullable="true" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="auth_srid" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="srtext" nullable="true" remarks="" size="2048" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="4" name="proj4text" nullable="true" remarks="" size="2048" type="varchar" typeCode="12"/>
         <primaryKey column="srid" sequenceNumberInPK="1"/>
         <index name="spatial_ref_sys_pkey" unique="true">
            <column ascending="true" name="srid"/>
         </index>
      </table>
      <table name="tenants" numRows="2" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111">
            <child column="tenant_id" foreignKey="FK_attachments_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="attachments"/>
            <child column="tenant_id" foreignKey="FK_attributes_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="attributes"/>
            <child column="tenant_id" foreignKey="FK_baselayers_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="baselayers"/>
            <child column="tenant_id" foreignKey="FK_basemaps_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="basemaps"/>
            <child column="tenant_id" foreignKey="FK_constraints_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="constraints"/>
            <child column="tenant_id" foreignKey="FK_constraints_members_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="constraints_members"/>
            <child column="tenant_id" foreignKey="FK_domains_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="domains"/>
            <child column="tenant_id" foreignKey="FK_domains_elements_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="domains_elements"/>
            <child column="tenant_id" foreignKey="FK_elements_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="elements"/>
            <child column="tenant_id" foreignKey="FK_features_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="features"/>
            <child column="tenant_id" foreignKey="FK_features_locks_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="features_locks"/>
            <child column="tenant_id" foreignKey="FK_features_versions_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="features_versions"/>
            <child column="tenant_id" foreignKey="FK_groups_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="groups"/>
            <child column="tenant_id" foreignKey="FK_groups_users_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="groups_users"/>
            <child column="tenant_id" foreignKey="FK_jobs_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="jobs"/>
            <child column="tenant_id" foreignKey="FK_jobs_tasks_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="jobs_tasks"/>
            <child column="tenant_id" foreignKey="FK_layers_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="layers"/>
            <child column="tenant_id" foreignKey="FK_layers_groups_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="layers_groups"/>
            <child column="tenant_id" foreignKey="FK_layers_styles_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="layers_styles"/>
            <child column="tenant_id" foreignKey="FK_maps_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="maps"/>
            <child column="tenant_id" foreignKey="FK_roles_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="roles"/>
            <child column="tenant_id" foreignKey="FK_roles_components_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="roles_components"/>
            <child column="tenant_id" foreignKey="FK_schemas_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="schemas"/>
            <child column="tenant_id" foreignKey="FK_sms_category_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="sms_category"/>
            <child column="tenant_id" foreignKey="FK_sms_dozer_parameters_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="sms_dozer_parameters"/>
            <child column="tenant_id" foreignKey="FK_sms_fixed_zone_algo_machine_parameters_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="sms_fixed_zone_algo_machine_parameters"/>
            <child column="tenant_id" foreignKey="FK_sms_fixed_zone_algo_result_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="sms_fixed_zone_algo_result"/>
            <child column="tenant_id" foreignKey="FK_sms_hiboo_daily_data_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="sms_hiboo_daily_data"/>
            <child column="tenant_id" foreignKey="FK_sms_hiboo_equipment_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="sms_hiboo_equipment"/>
            <child column="tenant_id" foreignKey="FK_sms_kpi_machines_cycles_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="sms_kpi_machines_cycles"/>
            <child column="tenant_id" foreignKey="FK_sms_kpi_sites_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="sms_kpi_sites"/>
            <child column="tenant_id" foreignKey="FK_sms_kpi_sites_machines_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="sms_kpi_sites_machines"/>
            <child column="tenant_id" foreignKey="FK_sms_loader_daily_zone_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="sms_loader_daily_zone"/>
            <child column="tenant_id" foreignKey="FK_sms_loader_move_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="sms_loader_move"/>
            <child column="tenant_id" foreignKey="FK_sms_loader_parameters_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="sms_loader_parameters"/>
            <child column="tenant_id" foreignKey="FK_sms_machine_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="sms_machine"/>
            <child column="tenant_id" foreignKey="FK_sms_machine_site_association_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="sms_machine_site_association"/>
            <child column="tenant_id" foreignKey="FK_sms_machine_teltonika_tracker_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="sms_machine_teltonika_tracker"/>
            <child column="tenant_id" foreignKey="FK_sms_machine_type_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="sms_machine_type"/>
            <child column="tenant_id" foreignKey="FK_sms_mobile_events_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="sms_mobile_events"/>
            <child column="tenant_id" foreignKey="FK_sms_other_parameters_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="sms_other_parameters"/>
            <child column="tenant_id" foreignKey="FK_sms_scraper_cycle_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="sms_scraper_cycle"/>
            <child column="tenant_id" foreignKey="FK_sms_scraper_daily_zone_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="sms_scraper_daily_zone"/>
            <child column="tenant_id" foreignKey="FK_sms_scraper_move_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="sms_scraper_move"/>
            <child column="tenant_id" foreignKey="FK_sms_scraper_parameters_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="sms_scraper_parameters"/>
            <child column="tenant_id" foreignKey="FK_sms_shift_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="sms_shift"/>
            <child column="tenant_id" foreignKey="FK_sms_shift_day_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="sms_shift_day"/>
            <child column="tenant_id" foreignKey="FK_sms_site_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="sms_site"/>
            <child column="tenant_id" foreignKey="FK_sms_site_parameters_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="sms_site_parameters"/>
            <child column="tenant_id" foreignKey="FK_sms_state_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="sms_state"/>
            <child column="tenant_id" foreignKey="FK_sms_teltonika_gps_data_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="sms_teltonika_gps_data"/>
            <child column="tenant_id" foreignKey="FK_sms_teltonika_scraper_gps_data_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="sms_teltonika_scraper_gps_data"/>
            <child column="tenant_id" foreignKey="FK_sms_teltonika_tracker_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="sms_teltonika_tracker"/>
            <child column="tenant_id" foreignKey="FK_sms_tgd_computed_info_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="sms_tgd_computed_info"/>
            <child column="tenant_id" foreignKey="FK_sms_truck_cycle_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="sms_truck_cycle"/>
            <child column="tenant_id" foreignKey="FK_sms_truck_daily_zone_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="sms_truck_daily_zone"/>
            <child column="tenant_id" foreignKey="FK_sms_truck_move_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="sms_truck_move"/>
            <child column="tenant_id" foreignKey="FK_sms_truck_parameters_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="sms_truck_parameters"/>
            <child column="tenant_id" foreignKey="FK_sms_zone_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="sms_zone"/>
            <child column="tenant_id" foreignKey="FK_sms_zone_attributes_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="sms_zone_attributes"/>
            <child column="tenant_id" foreignKey="FK_users_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="users"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="name" nullable="false" remarks="" size="63" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="organization" nullable="false" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="fullname" nullable="true" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="4" name="email" nullable="false" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="5" name="url" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="6" name="logo" nullable="true" remarks="" size="2147483647" type="bytea" typeCode="-2"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="7" name="smtp_host" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="8" name="smtp_port" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="9" name="smtp_username" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="10" name="smtp_password" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="11" name="smtp_security" nullable="true" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="12" name="db_username" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="13" name="db_password" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="14" name="srid" nullable="false" remarks="" size="10" type="int4" typeCode="4">
            <parent column="srid" foreignKey="Implied Constraint" implied="true" onDeleteCascade="false" schema="public" table="spatial_ref_sys"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="15" name="locale" nullable="false" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="16" name="time_zone" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="17" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="18" name="created_by" nullable="true" remarks="User who create the record. Null if System." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="19" name="updated_at" nullable="true" remarks="DateTime the record was last updated." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="20" name="updated_by" nullable="true" remarks="User who last updated the record." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="21" name="is_system" nullable="false" remarks="A system-generated record. Default = false" size="1" type="bool" typeCode="-7"/>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_tenants" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_tenants_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_tenants_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_tenants_is_system" unique="false">
            <column ascending="true" name="is_system"/>
         </index>
         <index name="IX_tenants_name" unique="true">
            <column ascending="true" name="name"/>
         </index>
      </table>
      <table name="users" numRows="31" remarks="" schema="public" type="TABLE">
         <column autoUpdated="false" defaultValue="gen_random_uuid()" digits="0" id="0" name="id" nullable="false" remarks="Unique identifier." size="2147483647" type="uuid" typeCode="1111">
            <child column="created_by" foreignKey="FK_features_locks_users_created_by" implied="false" onDeleteCascade="true" schema="public" table="features_locks"/>
            <child column="user_id" foreignKey="FK_groups_users_users_user_id" implied="false" onDeleteCascade="true" schema="public" table="groups_users"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="1" name="tenant_id" nullable="false" remarks="Tenant identifier." size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_users_tenants_tenant_id" implied="false" onDeleteCascade="true" schema="public" table="tenants"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="2" name="role_id" nullable="false" remarks="" size="2147483647" type="uuid" typeCode="1111">
            <parent column="id" foreignKey="FK_users_roles_role_id" implied="false" onDeleteCascade="false" schema="public" table="roles"/>
         </column>
         <column autoUpdated="false" defaultValue="null" digits="0" id="3" name="username" nullable="false" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="4" name="email" nullable="false" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="5" name="password" nullable="false" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="6" name="fullname" nullable="false" remarks="" size="256" type="varchar" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="7" name="locale" nullable="false" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="8" name="last_seen" nullable="true" remarks="" size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="0" digits="0" id="9" name="last_client" nullable="false" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="0" digits="0" id="10" name="status" nullable="false" remarks="" size="10" type="int4" typeCode="4"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="11" name="time_zone" nullable="true" remarks="" size="2147483647" type="text" typeCode="12"/>
         <column autoUpdated="false" defaultValue="now()" digits="6" id="12" name="created_at" nullable="false" remarks="DateTime the record was created." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="13" name="created_by" nullable="true" remarks="User who create the record. Null if System." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="null" digits="6" id="14" name="updated_at" nullable="true" remarks="DateTime the record was last updated." size="35" type="timestamptz" typeCode="93"/>
         <column autoUpdated="false" defaultValue="null" digits="0" id="15" name="updated_by" nullable="true" remarks="User who last updated the record." size="2147483647" type="uuid" typeCode="1111"/>
         <column autoUpdated="false" defaultValue="false" digits="0" id="16" name="is_system" nullable="false" remarks="A system-generated record. Default = false" size="1" type="bool" typeCode="-7"/>
         <primaryKey column="id" sequenceNumberInPK="1"/>
         <index name="PK_users" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_users_created_at" unique="false">
            <column ascending="true" name="created_at"/>
         </index>
         <index name="IX_users_email" unique="false">
            <column ascending="true" name="email"/>
         </index>
         <index name="IX_users_id" unique="true">
            <column ascending="true" name="id"/>
         </index>
         <index name="IX_users_is_system" unique="false">
            <column ascending="true" name="is_system"/>
         </index>
         <index name="IX_users_role_id" unique="false">
            <column ascending="true" name="role_id"/>
         </index>
         <index name="IX_users_status" unique="false">
            <column ascending="true" name="status"/>
         </index>
         <index name="IX_users_tenant_id" unique="false">
            <column ascending="true" name="tenant_id"/>
         </index>
         <index name="UQ_users_tenantid_username" unique="true">
            <column ascending="true" name="tenant_id"/>
            <column ascending="true" name="username"/>
         </index>
      </table>
   </tables>
   <routines>
      <routine dataAccess="MODIFIES" deterministic="true" name="_postgis_deprecate(oldname text, newname text, version text)" returnType="void" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="plpgsql"><![CDATA[DECLARE
  curver_text text;
BEGIN
  --
  -- Raises a NOTICE if it was deprecated in this version,
  -- a WARNING if in a previous version (only up to minor version checked)
  --
	curver_text := '3.3.3';
	IF pg_catalog.split_part(curver_text,'.',1)::int > pg_catalog.split_part(version,'.',1)::int OR
	   ( pg_catalog.split_part(curver_text,'.',1) = pg_catalog.split_part(version,'.',1) AND
		 pg_catalog.split_part(curver_text,'.',2) != split_part(version,'.',2) )
	THEN
	  RAISE WARNING '% signature was deprecated in %. Please use %', oldname, version, newname;
	ELSE
	  RAISE DEBUG '% signature was deprecated in %. Please use %', oldname, version, newname;
	END IF;
END;]]></definition>
         <parameters>
            <parameter mode="IN" name="oldname" type="text"/>
            <parameter mode="IN" name="newname" type="text"/>
            <parameter mode="IN" name="version" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="_postgis_index_extent(tbl regclass, col text)" returnType="box2d" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[_postgis_gserialized_index_extent]]></definition>
         <parameters>
            <parameter mode="IN" name="tbl" type="regclass"/>
            <parameter mode="IN" name="col" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="_postgis_join_selectivity(regclass, text, regclass, text, text DEFAULT '2'::text)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[_postgis_gserialized_joinsel]]></definition>
         <parameters>
            <parameter mode="IN" type="regclass"/>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="regclass"/>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="_postgis_pgsql_version()" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT CASE WHEN pg_catalog.split_part(s,'.',1)::integer > 9 THEN pg_catalog.split_part(s,'.',1) || '0'
	ELSE pg_catalog.split_part(s,'.', 1) || pg_catalog.split_part(s,'.', 2) END AS v
	FROM pg_catalog.substring(version(), 'PostgreSQL ([0-9\.]+)') AS s;]]></definition>
         <parameters>
            <parameter mode="IN"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="_postgis_scripts_pgsql_version()" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT '150'::text AS version]]></definition>
         <parameters>
            <parameter mode="IN"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="_postgis_selectivity(tbl regclass, att_name text, geom geometry, mode text DEFAULT '2'::text)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[_postgis_gserialized_sel]]></definition>
         <parameters>
            <parameter mode="IN" name="tbl" type="regclass"/>
            <parameter mode="IN" name="att_name" type="text"/>
            <parameter mode="IN" name="geom" type="geometry"/>
            <parameter mode="IN" name="mode" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="_postgis_stats(tbl regclass, att_name text, text DEFAULT '2'::text)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[_postgis_gserialized_stats]]></definition>
         <parameters>
            <parameter mode="IN" name="tbl" type="regclass"/>
            <parameter mode="IN" name="att_name" type="text"/>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="_st_3ddfullywithin(geom1 geometry, geom2 geometry, double precision)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_dfullywithin3d]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="_st_3ddwithin(geom1 geometry, geom2 geometry, double precision)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_dwithin3d]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="_st_3dintersects(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[ST_3DIntersects]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="_st_asgml(integer, geometry, integer, integer, text, text)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_asGML]]></definition>
         <parameters>
            <parameter mode="IN" type="integer"/>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="integer"/>
            <parameter mode="IN" type="integer"/>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="_st_asx3d(integer, geometry, integer, integer, text)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_asX3D]]></definition>
         <parameters>
            <parameter mode="IN" type="integer"/>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="integer"/>
            <parameter mode="IN" type="integer"/>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="_st_bestsrid(geography)" returnType="integer" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geography_bestsrid]]></definition>
         <parameters>
            <parameter mode="IN" type="geography"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="_st_bestsrid(geography, geography)" returnType="integer" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geography_bestsrid]]></definition>
         <parameters>
            <parameter mode="IN" type="geography"/>
            <parameter mode="IN" type="geography"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="_st_concavehull(param_inputgeom geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="plpgsql"><![CDATA[DECLARE
	vexhull public.geometry;
	var_resultgeom public.geometry;
	var_inputgeom public.geometry;
	vexring public.geometry;
	cavering public.geometry;
	cavept public.geometry[];
	seglength double precision;
	var_tempgeom public.geometry;
	scale_factor float := 1;
	i integer;
	BEGIN
		-- First compute the ConvexHull of the geometry
		vexhull := public.ST_ConvexHull(param_inputgeom);
		var_inputgeom := param_inputgeom;
		--A point really has no concave hull
		IF public.ST_GeometryType(vexhull) = 'ST_Point' OR public.ST_GeometryType(vexHull) = 'ST_LineString' THEN
			RETURN vexhull;
		END IF;

		-- convert the hull perimeter to a linestring so we can manipulate individual points
		vexring := CASE WHEN public.ST_GeometryType(vexhull) = 'ST_LineString' THEN vexhull ELSE public.ST_ExteriorRing(vexhull) END;
		IF abs(public.ST_X(public.ST_PointN(vexring,1))) < 1 THEN --scale the geometry to prevent stupid precision errors - not sure it works so make low for now
			scale_factor := 100;
			vexring := public.ST_Scale(vexring, scale_factor,scale_factor);
			var_inputgeom := public.ST_Scale(var_inputgeom, scale_factor, scale_factor);
			--RAISE NOTICE 'Scaling';
		END IF;
		seglength := public.ST_Length(vexring)/least(public.ST_NPoints(vexring)*2,1000) ;

		vexring := public.ST_Segmentize(vexring, seglength);
		-- find the point on the original geom that is closest to each point of the convex hull and make a new linestring out of it.
		cavering := public.ST_Collect(
			ARRAY(

				SELECT
					public.ST_ClosestPoint(var_inputgeom, pt ) As the_geom
					FROM (
						SELECT  public.ST_PointN(vexring, n ) As pt, n
							FROM
							generate_series(1, public.ST_NPoints(vexring) ) As n
						) As pt

				)
			)
		;

		var_resultgeom := public.ST_MakeLine(geom)
			FROM public.ST_Dump(cavering) As foo;

		IF public.ST_IsSimple(var_resultgeom) THEN
			var_resultgeom := public.ST_MakePolygon(var_resultgeom);
			--RAISE NOTICE 'is Simple: %', var_resultgeom;
		ELSE 
			--RAISE NOTICE 'is not Simple: %', var_resultgeom;
			var_resultgeom := public.ST_ConvexHull(var_resultgeom);
		END IF;

		IF scale_factor > 1 THEN -- scale the result back
			var_resultgeom := public.ST_Scale(var_resultgeom, 1/scale_factor, 1/scale_factor);
		END IF;

		-- make sure result covers original (#3638)
		-- Using ST_UnaryUnion since SFCGAL doesn't replace with its own implementation
		-- and SFCGAL one chokes for some reason
		var_resultgeom := public.ST_UnaryUnion(public.ST_Collect(param_inputgeom, var_resultgeom) );
		RETURN var_resultgeom;

	END;]]></definition>
         <parameters>
            <parameter mode="IN" name="param_inputgeom" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="_st_contains(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[contains]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="_st_containsproperly(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[containsproperly]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="_st_coveredby(geog1 geography, geog2 geography)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geography_coveredby]]></definition>
         <parameters>
            <parameter mode="IN" name="geog1" type="geography"/>
            <parameter mode="IN" name="geog2" type="geography"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="_st_coveredby(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[coveredby]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="_st_covers(geog1 geography, geog2 geography)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geography_covers]]></definition>
         <parameters>
            <parameter mode="IN" name="geog1" type="geography"/>
            <parameter mode="IN" name="geog2" type="geography"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="_st_covers(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[covers]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="_st_crosses(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[crosses]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="_st_dfullywithin(geom1 geometry, geom2 geometry, double precision)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_dfullywithin]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="_st_distancetree(geography, geography)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT public._ST_DistanceTree($1, $2, 0.0, true)]]></definition>
         <parameters>
            <parameter mode="IN" type="geography"/>
            <parameter mode="IN" type="geography"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="_st_distancetree(geography, geography, double precision, boolean)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geography_distance_tree]]></definition>
         <parameters>
            <parameter mode="IN" type="geography"/>
            <parameter mode="IN" type="geography"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="boolean"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="_st_distanceuncached(geography, geography)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT public._ST_DistanceUnCached($1, $2, 0.0, true)]]></definition>
         <parameters>
            <parameter mode="IN" type="geography"/>
            <parameter mode="IN" type="geography"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="_st_distanceuncached(geography, geography, boolean)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT public._ST_DistanceUnCached($1, $2, 0.0, $3)]]></definition>
         <parameters>
            <parameter mode="IN" type="geography"/>
            <parameter mode="IN" type="geography"/>
            <parameter mode="IN" type="boolean"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="_st_distanceuncached(geography, geography, double precision, boolean)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geography_distance_uncached]]></definition>
         <parameters>
            <parameter mode="IN" type="geography"/>
            <parameter mode="IN" type="geography"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="boolean"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="_st_dwithin(geog1 geography, geog2 geography, tolerance double precision, use_spheroid boolean DEFAULT true)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geography_dwithin]]></definition>
         <parameters>
            <parameter mode="IN" name="geog1" type="geography"/>
            <parameter mode="IN" name="geog2" type="geography"/>
            <parameter mode="IN" name="tolerance" type="double precision"/>
            <parameter mode="IN" name="use_spheroid" type="boolean"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="_st_dwithin(geom1 geometry, geom2 geometry, double precision)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_dwithin]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="_st_dwithinuncached(geography, geography, double precision)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT $1 OPERATOR(public.&&) public._ST_Expand($2,$3) AND $2 OPERATOR(public.&&) public._ST_Expand($1,$3) AND public._ST_DWithinUnCached($1, $2, $3, true)]]></definition>
         <parameters>
            <parameter mode="IN" type="geography"/>
            <parameter mode="IN" type="geography"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="_st_dwithinuncached(geography, geography, double precision, boolean)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geography_dwithin_uncached]]></definition>
         <parameters>
            <parameter mode="IN" type="geography"/>
            <parameter mode="IN" type="geography"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="boolean"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="_st_equals(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[ST_Equals]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="_st_expand(geography, double precision)" returnType="geography" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geography_expand]]></definition>
         <parameters>
            <parameter mode="IN" type="geography"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="_st_geomfromgml(text, integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geom_from_gml]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="_st_intersects(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[ST_Intersects]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="_st_linecrossingdirection(line1 geometry, line2 geometry)" returnType="integer" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[ST_LineCrossingDirection]]></definition>
         <parameters>
            <parameter mode="IN" name="line1" type="geometry"/>
            <parameter mode="IN" name="line2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="_st_longestline(geom1 geometry, geom2 geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_longestline2d]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="_st_maxdistance(geom1 geometry, geom2 geometry)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_maxdistance2d_linestring]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="_st_orderingequals(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_same]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="_st_overlaps(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[overlaps]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="_st_pointoutside(geography)" returnType="geography" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geography_point_outside]]></definition>
         <parameters>
            <parameter mode="IN" type="geography"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="_st_sortablehash(geom geometry)" returnType="bigint" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[_ST_SortableHash]]></definition>
         <parameters>
            <parameter mode="IN" name="geom" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="_st_touches(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[touches]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="_st_voronoi(g1 geometry, clip geometry DEFAULT NULL::geometry, tolerance double precision DEFAULT 0.0, return_polygons boolean DEFAULT true)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[ST_Voronoi]]></definition>
         <parameters>
            <parameter mode="IN" name="g1" type="geometry"/>
            <parameter mode="IN" name="clip" type="geometry"/>
            <parameter mode="IN" name="tolerance" type="double precision"/>
            <parameter mode="IN" name="return_polygons" type="boolean"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="_st_within(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT public._ST_Contains($2,$1)]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="addauth(text)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: auth_token - Adds an authorization token to be used in the current transaction.]]></comment>
         <definition language="plpgsql"><![CDATA[DECLARE
	lockid alias for $1;
	okay boolean;
	myrec record;
BEGIN
	-- check to see if table exists
	--  if not, CREATE TEMP TABLE mylock (transid xid, lockcode text)
	okay := 'f';
	FOR myrec IN SELECT * FROM pg_class WHERE relname = 'temp_lock_have_table' LOOP
		okay := 't';
	END LOOP;
	IF (okay <> 't') THEN
		CREATE TEMP TABLE temp_lock_have_table (transid xid, lockcode text);
			-- this will only work from pgsql7.4 up
			-- ON COMMIT DELETE ROWS;
	END IF;

	--  INSERT INTO mylock VALUES ( $1)
--	EXECUTE 'INSERT INTO temp_lock_have_table VALUES ( '||
--		quote_literal(getTransactionID()) || ',' ||
--		quote_literal(lockid) ||')';

	INSERT INTO temp_lock_have_table VALUES (getTransactionID(), lockid);

	RETURN true::boolean;
END;]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="addgeometrycolumn(catalog_name character varying, schema_name character varying, table_name character varying, column_name character varying, new_srid_in integer, new_type character varying, new_dim integer, use_typmod boolean DEFAULT true)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: catalog_name, schema_name, table_name, column_name, srid, type, dimension, use_typmod=true - Adds a geometry column to an existing table.]]></comment>
         <definition language="plpgsql"><![CDATA[DECLARE
	rec RECORD;
	sr varchar;
	real_schema name;
	sql text;
	new_srid integer;

BEGIN

	-- Verify geometry type
	IF (postgis_type_name(new_type,new_dim) IS NULL )
	THEN
		RAISE EXCEPTION 'Invalid type name "%(%)" - valid ones are:
	POINT, MULTIPOINT,
	LINESTRING, MULTILINESTRING,
	POLYGON, MULTIPOLYGON,
	CIRCULARSTRING, COMPOUNDCURVE, MULTICURVE,
	CURVEPOLYGON, MULTISURFACE,
	GEOMETRY, GEOMETRYCOLLECTION,
	POINTM, MULTIPOINTM,
	LINESTRINGM, MULTILINESTRINGM,
	POLYGONM, MULTIPOLYGONM,
	CIRCULARSTRINGM, COMPOUNDCURVEM, MULTICURVEM
	CURVEPOLYGONM, MULTISURFACEM, TRIANGLE, TRIANGLEM,
	POLYHEDRALSURFACE, POLYHEDRALSURFACEM, TIN, TINM
	or GEOMETRYCOLLECTIONM', new_type, new_dim;
		RETURN 'fail';
	END IF;

	-- Verify dimension
	IF ( (new_dim >4) OR (new_dim <2) ) THEN
		RAISE EXCEPTION 'invalid dimension';
		RETURN 'fail';
	END IF;

	IF ( (new_type LIKE '%M') AND (new_dim!=3) ) THEN
		RAISE EXCEPTION 'TypeM needs 3 dimensions';
		RETURN 'fail';
	END IF;

	-- Verify SRID
	IF ( new_srid_in > 0 ) THEN
		IF new_srid_in > 998999 THEN
			RAISE EXCEPTION 'AddGeometryColumn() - SRID must be <= %', 998999;
		END IF;
		new_srid := new_srid_in;
		SELECT SRID INTO sr FROM spatial_ref_sys WHERE SRID = new_srid;
		IF NOT FOUND THEN
			RAISE EXCEPTION 'AddGeometryColumn() - invalid SRID';
			RETURN 'fail';
		END IF;
	ELSE
		new_srid := public.ST_SRID('POINT EMPTY'::public.geometry);
		IF ( new_srid_in != new_srid ) THEN
			RAISE NOTICE 'SRID value % converted to the officially unknown SRID value %', new_srid_in, new_srid;
		END IF;
	END IF;

	-- Verify schema
	IF ( schema_name IS NOT NULL AND schema_name != '' ) THEN
		sql := 'SELECT nspname FROM pg_namespace ' ||
			'WHERE text(nspname) = ' || quote_literal(schema_name) ||
			'LIMIT 1';
		RAISE DEBUG '%', sql;
		EXECUTE sql INTO real_schema;

		IF ( real_schema IS NULL ) THEN
			RAISE EXCEPTION 'Schema % is not a valid schemaname', quote_literal(schema_name);
			RETURN 'fail';
		END IF;
	END IF;

	IF ( real_schema IS NULL ) THEN
		RAISE DEBUG 'Detecting schema';
		sql := 'SELECT n.nspname AS schemaname ' ||
			'FROM pg_catalog.pg_class c ' ||
			  'JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace ' ||
			'WHERE c.relkind = ' || quote_literal('r') ||
			' AND n.nspname NOT IN (' || quote_literal('pg_catalog') || ', ' || quote_literal('pg_toast') || ')' ||
			' AND pg_catalog.pg_table_is_visible(c.oid)' ||
			' AND c.relname = ' || quote_literal(table_name);
		RAISE DEBUG '%', sql;
		EXECUTE sql INTO real_schema;

		IF ( real_schema IS NULL ) THEN
			RAISE EXCEPTION 'Table % does not occur in the search_path', quote_literal(table_name);
			RETURN 'fail';
		END IF;
	END IF;

	-- Add geometry column to table
	IF use_typmod THEN
		 sql := 'ALTER TABLE ' ||
			quote_ident(real_schema) || '.' || quote_ident(table_name)
			|| ' ADD COLUMN ' || quote_ident(column_name) ||
			' geometry(' || public.postgis_type_name(new_type, new_dim) || ', ' || new_srid::text || ')';
		RAISE DEBUG '%', sql;
	ELSE
		sql := 'ALTER TABLE ' ||
			quote_ident(real_schema) || '.' || quote_ident(table_name)
			|| ' ADD COLUMN ' || quote_ident(column_name) ||
			' geometry ';
		RAISE DEBUG '%', sql;
	END IF;
	EXECUTE sql;

	IF NOT use_typmod THEN
		-- Add table CHECKs
		sql := 'ALTER TABLE ' ||
			quote_ident(real_schema) || '.' || quote_ident(table_name)
			|| ' ADD CONSTRAINT '
			|| quote_ident('enforce_srid_' || column_name)
			|| ' CHECK (st_srid(' || quote_ident(column_name) ||
			') = ' || new_srid::text || ')' ;
		RAISE DEBUG '%', sql;
		EXECUTE sql;

		sql := 'ALTER TABLE ' ||
			quote_ident(real_schema) || '.' || quote_ident(table_name)
			|| ' ADD CONSTRAINT '
			|| quote_ident('enforce_dims_' || column_name)
			|| ' CHECK (st_ndims(' || quote_ident(column_name) ||
			') = ' || new_dim::text || ')' ;
		RAISE DEBUG '%', sql;
		EXECUTE sql;

		IF ( NOT (new_type = 'GEOMETRY')) THEN
			sql := 'ALTER TABLE ' ||
				quote_ident(real_schema) || '.' || quote_ident(table_name) || ' ADD CONSTRAINT ' ||
				quote_ident('enforce_geotype_' || column_name) ||
				' CHECK (GeometryType(' ||
				quote_ident(column_name) || ')=' ||
				quote_literal(new_type) || ' OR (' ||
				quote_ident(column_name) || ') is null)';
			RAISE DEBUG '%', sql;
			EXECUTE sql;
		END IF;
	END IF;

	RETURN
		real_schema || '.' ||
		table_name || '.' || column_name ||
		' SRID:' || new_srid::text ||
		' TYPE:' || new_type ||
		' DIMS:' || new_dim::text || ' ';
END;]]></definition>
         <parameters>
            <parameter mode="IN" name="catalog_name" type="character varying"/>
            <parameter mode="IN" name="schema_name" type="character varying"/>
            <parameter mode="IN" name="table_name" type="character varying"/>
            <parameter mode="IN" name="column_name" type="character varying"/>
            <parameter mode="IN" name="new_srid_in" type="integer"/>
            <parameter mode="IN" name="new_type" type="character varying"/>
            <parameter mode="IN" name="new_dim" type="integer"/>
            <parameter mode="IN" name="use_typmod" type="boolean"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="addgeometrycolumn(schema_name character varying, table_name character varying, column_name character varying, new_srid integer, new_type character varying, new_dim integer, use_typmod boolean DEFAULT true)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: schema_name, table_name, column_name, srid, type, dimension, use_typmod=true - Adds a geometry column to an existing table.]]></comment>
         <definition language="plpgsql"><![CDATA[DECLARE
	ret  text;
BEGIN
	SELECT public.AddGeometryColumn('',$1,$2,$3,$4,$5,$6,$7) into ret;
	RETURN ret;
END;]]></definition>
         <parameters>
            <parameter mode="IN" name="schema_name" type="character varying"/>
            <parameter mode="IN" name="table_name" type="character varying"/>
            <parameter mode="IN" name="column_name" type="character varying"/>
            <parameter mode="IN" name="new_srid" type="integer"/>
            <parameter mode="IN" name="new_type" type="character varying"/>
            <parameter mode="IN" name="new_dim" type="integer"/>
            <parameter mode="IN" name="use_typmod" type="boolean"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="addgeometrycolumn(table_name character varying, column_name character varying, new_srid integer, new_type character varying, new_dim integer, use_typmod boolean DEFAULT true)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: table_name, column_name, srid, type, dimension, use_typmod=true - Adds a geometry column to an existing table.]]></comment>
         <definition language="plpgsql"><![CDATA[DECLARE
	ret  text;
BEGIN
	SELECT public.AddGeometryColumn('','',$1,$2,$3,$4,$5, $6) into ret;
	RETURN ret;
END;]]></definition>
         <parameters>
            <parameter mode="IN" name="table_name" type="character varying"/>
            <parameter mode="IN" name="column_name" type="character varying"/>
            <parameter mode="IN" name="new_srid" type="integer"/>
            <parameter mode="IN" name="new_type" type="character varying"/>
            <parameter mode="IN" name="new_dim" type="integer"/>
            <parameter mode="IN" name="use_typmod" type="boolean"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="box(box3d)" returnType="box" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[BOX3D_to_BOX]]></definition>
         <parameters>
            <parameter mode="IN" type="box3d"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="box(geometry)" returnType="box" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_to_BOX]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="box2d(box3d)" returnType="box2d" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[BOX3D_to_BOX2D]]></definition>
         <parameters>
            <parameter mode="IN" type="box3d"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="box2d(geometry)" returnType="box2d" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom - Returns a BOX2D representing the 2D extent of a geometry.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_to_BOX2D]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="box2d_in(cstring)" returnType="box2d" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[BOX2D_in]]></definition>
         <parameters>
            <parameter mode="IN" type="cstring"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="box2d_out(box2d)" returnType="cstring" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[BOX2D_out]]></definition>
         <parameters>
            <parameter mode="IN" type="box2d"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="box2df_in(cstring)" returnType="box2df" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[box2df_in]]></definition>
         <parameters>
            <parameter mode="IN" type="cstring"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="box2df_out(box2df)" returnType="cstring" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[box2df_out]]></definition>
         <parameters>
            <parameter mode="IN" type="box2df"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="box3d(box2d)" returnType="box3d" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[BOX2D_to_BOX3D]]></definition>
         <parameters>
            <parameter mode="IN" type="box2d"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="box3d(geometry)" returnType="box3d" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom - Returns a BOX3D representing the 3D extent of a geometry.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_to_BOX3D]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="box3d_in(cstring)" returnType="box3d" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[BOX3D_in]]></definition>
         <parameters>
            <parameter mode="IN" type="cstring"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="box3d_out(box3d)" returnType="cstring" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[BOX3D_out]]></definition>
         <parameters>
            <parameter mode="IN" type="box3d"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="box3dtobox(box3d)" returnType="box" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[BOX3D_to_BOX]]></definition>
         <parameters>
            <parameter mode="IN" type="box3d"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="bytea(geography)" returnType="bytea" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_to_bytea]]></definition>
         <parameters>
            <parameter mode="IN" type="geography"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="bytea(geometry)" returnType="bytea" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_to_bytea]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="checkauth(text, text)" returnType="integer" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: a_table_name, a_key_column_name - Creates a trigger on a table to prevent/allow updates and deletes of rows based on authorization token.]]></comment>
         <definition language="sql"><![CDATA[SELECT CheckAuth('', $1, $2)]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="checkauth(text, text, text)" returnType="integer" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: a_schema_name, a_table_name, a_key_column_name - Creates a trigger on a table to prevent/allow updates and deletes of rows based on authorization token.]]></comment>
         <definition language="plpgsql"><![CDATA[DECLARE
	schema text;
BEGIN
	IF NOT LongTransactionsEnabled() THEN
		RAISE EXCEPTION 'Long transaction support disabled, use EnableLongTransaction() to enable.';
	END IF;

	if ( $1 != '' ) THEN
		schema = $1;
	ELSE
		SELECT current_schema() into schema;
	END IF;

	-- TODO: check for an already existing trigger ?

	EXECUTE 'CREATE TRIGGER check_auth BEFORE UPDATE OR DELETE ON '
		|| quote_ident(schema) || '.' || quote_ident($2)
		||' FOR EACH ROW EXECUTE PROCEDURE CheckAuthTrigger('
		|| quote_literal($3) || ')';

	RETURN 0;
END;]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="checkauthtrigger()" returnType="trigger" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[check_authorization]]></definition>
         <parameters>
            <parameter mode="IN"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="contains_2d(box2df, box2df)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_contains_box2df_box2df_2d]]></definition>
         <parameters>
            <parameter mode="IN" type="box2df"/>
            <parameter mode="IN" type="box2df"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="contains_2d(box2df, geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_contains_box2df_geom_2d]]></definition>
         <parameters>
            <parameter mode="IN" type="box2df"/>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="contains_2d(geometry, box2df)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT $2 OPERATOR(public.@) $1;]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="box2df"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="disablelongtransactions()" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[Disables long transaction support.]]></comment>
         <definition language="plpgsql"><![CDATA[DECLARE
	rec RECORD;

BEGIN

	--
	-- Drop all triggers applied by CheckAuth()
	--
	FOR rec IN
		SELECT c.relname, t.tgname, t.tgargs FROM pg_trigger t, pg_class c, pg_proc p
		WHERE p.proname = 'checkauthtrigger' and t.tgfoid = p.oid and t.tgrelid = c.oid
	LOOP
		EXECUTE 'DROP TRIGGER ' || quote_ident(rec.tgname) ||
			' ON ' || quote_ident(rec.relname);
	END LOOP;

	--
	-- Drop the authorization_table table
	--
	FOR rec IN SELECT * FROM pg_class WHERE relname = 'authorization_table' LOOP
		DROP TABLE authorization_table;
	END LOOP;

	--
	-- Drop the authorized_tables view
	--
	FOR rec IN SELECT * FROM pg_class WHERE relname = 'authorized_tables' LOOP
		DROP VIEW authorized_tables;
	END LOOP;

	RETURN 'Long transactions support disabled';
END;]]></definition>
         <parameters>
            <parameter mode="IN"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="dropgeometrycolumn(catalog_name character varying, schema_name character varying, table_name character varying, column_name character varying)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: catalog_name, schema_name, table_name, column_name - Removes a geometry column from a spatial table.]]></comment>
         <definition language="plpgsql"><![CDATA[DECLARE
	myrec RECORD;
	okay boolean;
	real_schema name;

BEGIN

	-- Find, check or fix schema_name
	IF ( schema_name != '' ) THEN
		okay = false;

		FOR myrec IN SELECT nspname FROM pg_namespace WHERE text(nspname) = schema_name LOOP
			okay := true;
		END LOOP;

		IF ( okay <>  true ) THEN
			RAISE NOTICE 'Invalid schema name - using current_schema()';
			SELECT current_schema() into real_schema;
		ELSE
			real_schema = schema_name;
		END IF;
	ELSE
		SELECT current_schema() into real_schema;
	END IF;

	-- Find out if the column is in the geometry_columns table
	okay = false;
	FOR myrec IN SELECT * from public.geometry_columns where f_table_schema = text(real_schema) and f_table_name = table_name and f_geometry_column = column_name LOOP
		okay := true;
	END LOOP;
	IF (okay <> true) THEN
		RAISE EXCEPTION 'column not found in geometry_columns table';
		RETURN false;
	END IF;

	-- Remove table column
	EXECUTE 'ALTER TABLE ' || quote_ident(real_schema) || '.' ||
		quote_ident(table_name) || ' DROP COLUMN ' ||
		quote_ident(column_name);

	RETURN real_schema || '.' || table_name || '.' || column_name ||' effectively removed.';

END;]]></definition>
         <parameters>
            <parameter mode="IN" name="catalog_name" type="character varying"/>
            <parameter mode="IN" name="schema_name" type="character varying"/>
            <parameter mode="IN" name="table_name" type="character varying"/>
            <parameter mode="IN" name="column_name" type="character varying"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="dropgeometrycolumn(schema_name character varying, table_name character varying, column_name character varying)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: schema_name, table_name, column_name - Removes a geometry column from a spatial table.]]></comment>
         <definition language="plpgsql"><![CDATA[DECLARE
	ret text;
BEGIN
	SELECT public.DropGeometryColumn('',$1,$2,$3) into ret;
	RETURN ret;
END;]]></definition>
         <parameters>
            <parameter mode="IN" name="schema_name" type="character varying"/>
            <parameter mode="IN" name="table_name" type="character varying"/>
            <parameter mode="IN" name="column_name" type="character varying"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="dropgeometrycolumn(table_name character varying, column_name character varying)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: table_name, column_name - Removes a geometry column from a spatial table.]]></comment>
         <definition language="plpgsql"><![CDATA[DECLARE
	ret text;
BEGIN
	SELECT public.DropGeometryColumn('','',$1,$2) into ret;
	RETURN ret;
END;]]></definition>
         <parameters>
            <parameter mode="IN" name="table_name" type="character varying"/>
            <parameter mode="IN" name="column_name" type="character varying"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="dropgeometrytable(catalog_name character varying, schema_name character varying, table_name character varying)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: catalog_name, schema_name, table_name - Drops a table and all its references in geometry_columns.]]></comment>
         <definition language="plpgsql"><![CDATA[DECLARE
	real_schema name;

BEGIN

	IF ( schema_name = '' ) THEN
		SELECT current_schema() into real_schema;
	ELSE
		real_schema = schema_name;
	END IF;

	-- TODO: Should we warn if table doesn't exist probably instead just saying dropped
	-- Remove table
	EXECUTE 'DROP TABLE IF EXISTS '
		|| quote_ident(real_schema) || '.' ||
		quote_ident(table_name) || ' RESTRICT';

	RETURN
		real_schema || '.' ||
		table_name ||' dropped.';

END;]]></definition>
         <parameters>
            <parameter mode="IN" name="catalog_name" type="character varying"/>
            <parameter mode="IN" name="schema_name" type="character varying"/>
            <parameter mode="IN" name="table_name" type="character varying"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="dropgeometrytable(schema_name character varying, table_name character varying)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: schema_name, table_name - Drops a table and all its references in geometry_columns.]]></comment>
         <definition language="sql"><![CDATA[SELECT public.DropGeometryTable('',$1,$2)]]></definition>
         <parameters>
            <parameter mode="IN" name="schema_name" type="character varying"/>
            <parameter mode="IN" name="table_name" type="character varying"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="dropgeometrytable(table_name character varying)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: table_name - Drops a table and all its references in geometry_columns.]]></comment>
         <definition language="sql"><![CDATA[SELECT public.DropGeometryTable('','',$1)]]></definition>
         <parameters>
            <parameter mode="IN" name="table_name" type="character varying"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="enablelongtransactions()" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[Enables long transaction support.]]></comment>
         <definition language="plpgsql"><![CDATA[DECLARE
	"query" text;
	exists bool;
	rec RECORD;

BEGIN

	exists = 'f';
	FOR rec IN SELECT * FROM pg_class WHERE relname = 'authorization_table'
	LOOP
		exists = 't';
	END LOOP;

	IF NOT exists
	THEN
		"query" = 'CREATE TABLE authorization_table (
			toid oid, -- table oid
			rid text, -- row id
			expires timestamp,
			authid text
		)';
		EXECUTE "query";
	END IF;

	exists = 'f';
	FOR rec IN SELECT * FROM pg_class WHERE relname = 'authorized_tables'
	LOOP
		exists = 't';
	END LOOP;

	IF NOT exists THEN
		"query" = 'CREATE VIEW authorized_tables AS ' ||
			'SELECT ' ||
			'n.nspname as schema, ' ||
			'c.relname as table, trim(' ||
			quote_literal(chr(92) || '000') ||
			' from t.tgargs) as id_column ' ||
			'FROM pg_trigger t, pg_class c, pg_proc p ' ||
			', pg_namespace n ' ||
			'WHERE p.proname = ' || quote_literal('checkauthtrigger') ||
			' AND c.relnamespace = n.oid' ||
			' AND t.tgfoid = p.oid and t.tgrelid = c.oid';
		EXECUTE "query";
	END IF;

	RETURN 'Long transactions support enabled';
END;]]></definition>
         <parameters>
            <parameter mode="IN"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="equals(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[ST_Equals]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="find_srid(character varying, character varying, character varying)" returnType="integer" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: a_schema_name, a_table_name, a_geomfield_name - Returns the SRID defined for a geometry column.]]></comment>
         <definition language="plpgsql"><![CDATA[DECLARE
	schem varchar =  $1;
	tabl varchar = $2;
	sr int4;
BEGIN
-- if the table contains a . and the schema is empty
-- split the table into a schema and a table
-- otherwise drop through to default behavior
	IF ( schem = '' and strpos(tabl,'.') > 0 ) THEN
	 schem = substr(tabl,1,strpos(tabl,'.')-1);
	 tabl = substr(tabl,length(schem)+2);
	END IF;

	select SRID into sr from public.geometry_columns where (f_table_schema = schem or schem = '') and f_table_name = tabl and f_geometry_column = $3;
	IF NOT FOUND THEN
	   RAISE EXCEPTION 'find_srid() - could not find the corresponding SRID - is the geometry registered in the GEOMETRY_COLUMNS table?  Is there an uppercase/lowercase mismatch?';
	END IF;
	return sr;
END;]]></definition>
         <parameters>
            <parameter mode="IN" type="character varying"/>
            <parameter mode="IN" type="character varying"/>
            <parameter mode="IN" type="character varying"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="geog_brin_inclusion_add_value(internal, internal, internal, internal)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geog_brin_inclusion_add_value]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geography(bytea)" returnType="geography" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geography_from_binary]]></definition>
         <parameters>
            <parameter mode="IN" type="bytea"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geography(geography, integer, boolean)" returnType="geography" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geography_enforce_typmod]]></definition>
         <parameters>
            <parameter mode="IN" type="geography"/>
            <parameter mode="IN" type="integer"/>
            <parameter mode="IN" type="boolean"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geography(geometry)" returnType="geography" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geography_from_geometry]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="geography_analyze(internal)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_analyze_nd]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geography_cmp(geography, geography)" returnType="integer" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geography_cmp]]></definition>
         <parameters>
            <parameter mode="IN" type="geography"/>
            <parameter mode="IN" type="geography"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geography_distance_knn(geography, geography)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geography_distance_knn]]></definition>
         <parameters>
            <parameter mode="IN" type="geography"/>
            <parameter mode="IN" type="geography"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geography_eq(geography, geography)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geography_eq]]></definition>
         <parameters>
            <parameter mode="IN" type="geography"/>
            <parameter mode="IN" type="geography"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geography_ge(geography, geography)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geography_ge]]></definition>
         <parameters>
            <parameter mode="IN" type="geography"/>
            <parameter mode="IN" type="geography"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="geography_gist_compress(internal)" returnType="internal" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_gist_compress]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="geography_gist_consistent(internal, geography, integer)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_gist_consistent]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="geography"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="geography_gist_decompress(internal)" returnType="internal" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_gist_decompress]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="geography_gist_distance(internal, geography, integer)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_gist_geog_distance]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="geography"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="geography_gist_penalty(internal, internal, internal)" returnType="internal" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_gist_penalty]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="geography_gist_picksplit(internal, internal)" returnType="internal" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_gist_picksplit]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="geography_gist_same(box2d, box2d, internal)" returnType="internal" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_gist_same]]></definition>
         <parameters>
            <parameter mode="IN" type="box2d"/>
            <parameter mode="IN" type="box2d"/>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="geography_gist_union(bytea, internal)" returnType="internal" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_gist_union]]></definition>
         <parameters>
            <parameter mode="IN" type="bytea"/>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geography_gt(geography, geography)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geography_gt]]></definition>
         <parameters>
            <parameter mode="IN" type="geography"/>
            <parameter mode="IN" type="geography"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geography_in(cstring, oid, integer)" returnType="geography" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geography_in]]></definition>
         <parameters>
            <parameter mode="IN" type="cstring"/>
            <parameter mode="IN" type="oid"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geography_le(geography, geography)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geography_le]]></definition>
         <parameters>
            <parameter mode="IN" type="geography"/>
            <parameter mode="IN" type="geography"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geography_lt(geography, geography)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geography_lt]]></definition>
         <parameters>
            <parameter mode="IN" type="geography"/>
            <parameter mode="IN" type="geography"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geography_out(geography)" returnType="cstring" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geography_out]]></definition>
         <parameters>
            <parameter mode="IN" type="geography"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geography_overlaps(geography, geography)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_overlaps]]></definition>
         <parameters>
            <parameter mode="IN" type="geography"/>
            <parameter mode="IN" type="geography"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geography_recv(internal, oid, integer)" returnType="geography" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geography_recv]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="oid"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geography_send(geography)" returnType="bytea" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geography_send]]></definition>
         <parameters>
            <parameter mode="IN" type="geography"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geography_spgist_choose_nd(internal, internal)" returnType="void" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_spgist_choose_nd]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geography_spgist_compress_nd(internal)" returnType="internal" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_spgist_compress_nd]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geography_spgist_config_nd(internal, internal)" returnType="void" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_spgist_config_nd]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geography_spgist_inner_consistent_nd(internal, internal)" returnType="void" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_spgist_inner_consistent_nd]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geography_spgist_leaf_consistent_nd(internal, internal)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_spgist_leaf_consistent_nd]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geography_spgist_picksplit_nd(internal, internal)" returnType="void" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_spgist_picksplit_nd]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geography_typmod_in(cstring[])" returnType="integer" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geography_typmod_in]]></definition>
         <parameters>
            <parameter mode="IN" type="cstring[]"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geography_typmod_out(integer)" returnType="cstring" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[postgis_typmod_out]]></definition>
         <parameters>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="geom2d_brin_inclusion_add_value(internal, internal, internal, internal)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geom2d_brin_inclusion_add_value]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="geom3d_brin_inclusion_add_value(internal, internal, internal, internal)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geom3d_brin_inclusion_add_value]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="geom4d_brin_inclusion_add_value(internal, internal, internal, internal)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geom4d_brin_inclusion_add_value]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry(box2d)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[BOX2D_to_LWGEOM]]></definition>
         <parameters>
            <parameter mode="IN" type="box2d"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry(box3d)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[BOX3D_to_LWGEOM]]></definition>
         <parameters>
            <parameter mode="IN" type="box3d"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry(bytea)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_from_bytea]]></definition>
         <parameters>
            <parameter mode="IN" type="bytea"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry(geography)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geometry_from_geography]]></definition>
         <parameters>
            <parameter mode="IN" type="geography"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry(geometry, integer, boolean)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geometry_enforce_typmod]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="integer"/>
            <parameter mode="IN" type="boolean"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry(path)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[path_to_geometry]]></definition>
         <parameters>
            <parameter mode="IN" type="path"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry(point)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[point_to_geometry]]></definition>
         <parameters>
            <parameter mode="IN" type="point"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry(polygon)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[polygon_to_geometry]]></definition>
         <parameters>
            <parameter mode="IN" type="polygon"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry(text)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[parse_WKT_lwgeom]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_above(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_above_2d]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="geometry_analyze(internal)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_analyze_nd]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_below(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_below_2d]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_cmp(geom1 geometry, geom2 geometry)" returnType="integer" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[lwgeom_cmp]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_contained_3d(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_contained_3d]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_contains(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_contains_2d]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_contains_3d(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_contains_3d]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_contains_nd(geometry, geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_contains]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_distance_box(geom1 geometry, geom2 geometry)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_distance_box_2d]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_distance_centroid(geom1 geometry, geom2 geometry)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[ST_Distance]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_distance_centroid_nd(geometry, geometry)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_distance_nd]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_distance_cpa(geometry, geometry)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[ST_DistanceCPA]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_eq(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[lwgeom_eq]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_ge(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[lwgeom_ge]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="geometry_gist_compress_2d(internal)" returnType="internal" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_gist_compress_2d]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="geometry_gist_compress_nd(internal)" returnType="internal" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_gist_compress]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="geometry_gist_consistent_2d(internal, geometry, integer)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_gist_consistent_2d]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="geometry_gist_consistent_nd(internal, geometry, integer)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_gist_consistent]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="geometry_gist_decompress_2d(internal)" returnType="internal" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_gist_decompress_2d]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="geometry_gist_decompress_nd(internal)" returnType="internal" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_gist_decompress]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="geometry_gist_distance_2d(internal, geometry, integer)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_gist_distance_2d]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="geometry_gist_distance_nd(internal, geometry, integer)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_gist_distance]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="geometry_gist_penalty_2d(internal, internal, internal)" returnType="internal" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_gist_penalty_2d]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="geometry_gist_penalty_nd(internal, internal, internal)" returnType="internal" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_gist_penalty]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="geometry_gist_picksplit_2d(internal, internal)" returnType="internal" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_gist_picksplit_2d]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="geometry_gist_picksplit_nd(internal, internal)" returnType="internal" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_gist_picksplit]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="geometry_gist_same_2d(geom1 geometry, geom2 geometry, internal)" returnType="internal" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_gist_same_2d]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="geometry_gist_same_nd(geometry, geometry, internal)" returnType="internal" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_gist_same]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="geometry_gist_sortsupport_2d(internal)" returnType="void" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_gist_sortsupport_2d]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="geometry_gist_union_2d(bytea, internal)" returnType="internal" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_gist_union_2d]]></definition>
         <parameters>
            <parameter mode="IN" type="bytea"/>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="geometry_gist_union_nd(bytea, internal)" returnType="internal" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_gist_union]]></definition>
         <parameters>
            <parameter mode="IN" type="bytea"/>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_gt(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[lwgeom_gt]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_hash(geometry)" returnType="integer" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[lwgeom_hash]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_in(cstring)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_in]]></definition>
         <parameters>
            <parameter mode="IN" type="cstring"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_le(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[lwgeom_le]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_left(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_left_2d]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_lt(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[lwgeom_lt]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_out(geometry)" returnType="cstring" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_out]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_overabove(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_overabove_2d]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_overbelow(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_overbelow_2d]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_overlaps(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_overlaps_2d]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_overlaps_3d(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_overlaps_3d]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_overlaps_nd(geometry, geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_overlaps]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_overleft(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_overleft_2d]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_overright(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_overright_2d]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_recv(internal)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_recv]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_right(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_right_2d]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_same(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_same_2d]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_same_3d(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_same_3d]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_same_nd(geometry, geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_same]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_send(geometry)" returnType="bytea" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_send]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_sortsupport(internal)" returnType="void" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[lwgeom_sortsupport]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_spgist_choose_2d(internal, internal)" returnType="void" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_spgist_choose_2d]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_spgist_choose_3d(internal, internal)" returnType="void" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_spgist_choose_3d]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_spgist_choose_nd(internal, internal)" returnType="void" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_spgist_choose_nd]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_spgist_compress_2d(internal)" returnType="internal" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_spgist_compress_2d]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_spgist_compress_3d(internal)" returnType="internal" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_spgist_compress_3d]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_spgist_compress_nd(internal)" returnType="internal" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_spgist_compress_nd]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_spgist_config_2d(internal, internal)" returnType="void" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_spgist_config_2d]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_spgist_config_3d(internal, internal)" returnType="void" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_spgist_config_3d]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_spgist_config_nd(internal, internal)" returnType="void" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_spgist_config_nd]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_spgist_inner_consistent_2d(internal, internal)" returnType="void" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_spgist_inner_consistent_2d]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_spgist_inner_consistent_3d(internal, internal)" returnType="void" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_spgist_inner_consistent_3d]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_spgist_inner_consistent_nd(internal, internal)" returnType="void" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_spgist_inner_consistent_nd]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_spgist_leaf_consistent_2d(internal, internal)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_spgist_leaf_consistent_2d]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_spgist_leaf_consistent_3d(internal, internal)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_spgist_leaf_consistent_3d]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_spgist_leaf_consistent_nd(internal, internal)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_spgist_leaf_consistent_nd]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_spgist_picksplit_2d(internal, internal)" returnType="void" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_spgist_picksplit_2d]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_spgist_picksplit_3d(internal, internal)" returnType="void" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_spgist_picksplit_3d]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_spgist_picksplit_nd(internal, internal)" returnType="void" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_spgist_picksplit_nd]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_typmod_in(cstring[])" returnType="integer" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geometry_typmod_in]]></definition>
         <parameters>
            <parameter mode="IN" type="cstring[]"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_typmod_out(integer)" returnType="cstring" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[postgis_typmod_out]]></definition>
         <parameters>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_within(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_within_2d]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometry_within_nd(geometry, geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_within]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometrytype(geography)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_getTYPE]]></definition>
         <parameters>
            <parameter mode="IN" type="geography"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geometrytype(geometry)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA - Returns the type of a geometry as text.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_getTYPE]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geomfromewkb(bytea)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOMFromEWKB]]></definition>
         <parameters>
            <parameter mode="IN" type="bytea"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="geomfromewkt(text)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[parse_WKT_lwgeom]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="get_proj4_from_srid(integer)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="plpgsql"><![CDATA[BEGIN
	RETURN proj4text::text FROM public.spatial_ref_sys WHERE srid= $1;
	END;]]></definition>
         <parameters>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="gettransactionid()" returnType="xid" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[getTransactionID]]></definition>
         <parameters>
            <parameter mode="IN"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="gidx_in(cstring)" returnType="gidx" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gidx_in]]></definition>
         <parameters>
            <parameter mode="IN" type="cstring"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="gidx_out(gidx)" returnType="cstring" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gidx_out]]></definition>
         <parameters>
            <parameter mode="IN" type="gidx"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="gserialized_gist_joinsel_2d(internal, oid, internal, smallint)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_gist_joinsel_2d]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="oid"/>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="smallint"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="gserialized_gist_joinsel_nd(internal, oid, internal, smallint)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_gist_joinsel_nd]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="oid"/>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="smallint"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="gserialized_gist_sel_2d(internal, oid, internal, integer)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_gist_sel_2d]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="oid"/>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="gserialized_gist_sel_nd(internal, oid, internal, integer)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_gist_sel_nd]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="oid"/>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="is_contained_2d(box2df, box2df)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_contains_box2df_box2df_2d]]></definition>
         <parameters>
            <parameter mode="IN" type="box2df"/>
            <parameter mode="IN" type="box2df"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="is_contained_2d(box2df, geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_within_box2df_geom_2d]]></definition>
         <parameters>
            <parameter mode="IN" type="box2df"/>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="is_contained_2d(geometry, box2df)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT $2 OPERATOR(public.~) $1;]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="box2df"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="json(geometry)" returnType="json" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geometry_to_json]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="jsonb(geometry)" returnType="jsonb" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geometry_to_jsonb]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="lockrow(text, text, text)" returnType="integer" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: a_table_name, a_row_key, an_auth_token - Sets lock/authorization for a row in a table.]]></comment>
         <definition language="sql"><![CDATA[SELECT LockRow(current_schema(), $1, $2, $3, now()::timestamp+'1:00');]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="lockrow(text, text, text, text)" returnType="integer" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT LockRow($1, $2, $3, $4, now()::timestamp+'1:00');]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="lockrow(text, text, text, text, timestamp without time zone)" returnType="integer" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: a_schema_name, a_table_name, a_row_key, an_auth_token, expire_dt - Sets lock/authorization for a row in a table.]]></comment>
         <definition language="plpgsql"><![CDATA[DECLARE
	myschema alias for $1;
	mytable alias for $2;
	myrid   alias for $3;
	authid alias for $4;
	expires alias for $5;
	ret int;
	mytoid oid;
	myrec RECORD;

BEGIN

	IF NOT LongTransactionsEnabled() THEN
		RAISE EXCEPTION 'Long transaction support disabled, use EnableLongTransaction() to enable.';
	END IF;

	EXECUTE 'DELETE FROM authorization_table WHERE expires < now()';

	SELECT c.oid INTO mytoid FROM pg_class c, pg_namespace n
		WHERE c.relname = mytable
		AND c.relnamespace = n.oid
		AND n.nspname = myschema;

	-- RAISE NOTICE 'toid: %', mytoid;

	FOR myrec IN SELECT * FROM authorization_table WHERE
		toid = mytoid AND rid = myrid
	LOOP
		IF myrec.authid != authid THEN
			RETURN 0;
		ELSE
			RETURN 1;
		END IF;
	END LOOP;

	EXECUTE 'INSERT INTO authorization_table VALUES ('||
		quote_literal(mytoid::text)||','||quote_literal(myrid)||
		','||quote_literal(expires::text)||
		','||quote_literal(authid) ||')';

	GET DIAGNOSTICS ret = ROW_COUNT;

	RETURN ret;
END;]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="timestamp without time zone"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="lockrow(text, text, text, timestamp without time zone)" returnType="integer" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: a_table_name, a_row_key, an_auth_token, expire_dt - Sets lock/authorization for a row in a table.]]></comment>
         <definition language="sql"><![CDATA[SELECT LockRow(current_schema(), $1, $2, $3, $4);]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="timestamp without time zone"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="longtransactionsenabled()" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="plpgsql"><![CDATA[DECLARE
	rec RECORD;
BEGIN
	FOR rec IN SELECT oid FROM pg_class WHERE relname = 'authorized_tables'
	LOOP
		return 't';
	END LOOP;
	return 'f';
END;]]></definition>
         <parameters>
            <parameter mode="IN"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="overlaps_2d(box2df, box2df)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_contains_box2df_box2df_2d]]></definition>
         <parameters>
            <parameter mode="IN" type="box2df"/>
            <parameter mode="IN" type="box2df"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="overlaps_2d(box2df, geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_overlaps_box2df_geom_2d]]></definition>
         <parameters>
            <parameter mode="IN" type="box2df"/>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="overlaps_2d(geometry, box2df)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT $2 OPERATOR(public.&&) $1;]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="box2df"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="overlaps_geog(geography, gidx)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT $2 OPERATOR(public.&&) $1;]]></definition>
         <parameters>
            <parameter mode="IN" type="geography"/>
            <parameter mode="IN" type="gidx"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="overlaps_geog(gidx, geography)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_gidx_geog_overlaps]]></definition>
         <parameters>
            <parameter mode="IN" type="gidx"/>
            <parameter mode="IN" type="geography"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="overlaps_geog(gidx, gidx)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_gidx_gidx_overlaps]]></definition>
         <parameters>
            <parameter mode="IN" type="gidx"/>
            <parameter mode="IN" type="gidx"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="overlaps_nd(geometry, gidx)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT $2 OPERATOR(public.&&&) $1;]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="gidx"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="overlaps_nd(gidx, geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_gidx_geom_overlaps]]></definition>
         <parameters>
            <parameter mode="IN" type="gidx"/>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="overlaps_nd(gidx, gidx)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[gserialized_gidx_gidx_overlaps]]></definition>
         <parameters>
            <parameter mode="IN" type="gidx"/>
            <parameter mode="IN" type="gidx"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="path(geometry)" returnType="path" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geometry_to_path]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="pgis_asflatgeobuf_finalfn(internal)" returnType="bytea" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[pgis_asflatgeobuf_finalfn]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="pgis_asflatgeobuf_transfn(internal, anyelement)" returnType="internal" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[pgis_asflatgeobuf_transfn]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="anyelement"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="pgis_asflatgeobuf_transfn(internal, anyelement, boolean)" returnType="internal" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[pgis_asflatgeobuf_transfn]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="anyelement"/>
            <parameter mode="IN" type="boolean"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="pgis_asflatgeobuf_transfn(internal, anyelement, boolean, text)" returnType="internal" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[pgis_asflatgeobuf_transfn]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="anyelement"/>
            <parameter mode="IN" type="boolean"/>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="pgis_asgeobuf_finalfn(internal)" returnType="bytea" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[pgis_asgeobuf_finalfn]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="pgis_asgeobuf_transfn(internal, anyelement)" returnType="internal" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[pgis_asgeobuf_transfn]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="anyelement"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="pgis_asgeobuf_transfn(internal, anyelement, text)" returnType="internal" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[pgis_asgeobuf_transfn]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="anyelement"/>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="pgis_asmvt_combinefn(internal, internal)" returnType="internal" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[pgis_asmvt_combinefn]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="pgis_asmvt_deserialfn(bytea, internal)" returnType="internal" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[pgis_asmvt_deserialfn]]></definition>
         <parameters>
            <parameter mode="IN" type="bytea"/>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="pgis_asmvt_finalfn(internal)" returnType="bytea" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[pgis_asmvt_finalfn]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="pgis_asmvt_serialfn(internal)" returnType="bytea" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[pgis_asmvt_serialfn]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="pgis_asmvt_transfn(internal, anyelement)" returnType="internal" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[pgis_asmvt_transfn]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="anyelement"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="pgis_asmvt_transfn(internal, anyelement, text)" returnType="internal" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[pgis_asmvt_transfn]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="anyelement"/>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="pgis_asmvt_transfn(internal, anyelement, text, integer)" returnType="internal" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[pgis_asmvt_transfn]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="anyelement"/>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="pgis_asmvt_transfn(internal, anyelement, text, integer, text)" returnType="internal" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[pgis_asmvt_transfn]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="anyelement"/>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="integer"/>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="pgis_asmvt_transfn(internal, anyelement, text, integer, text, text)" returnType="internal" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[pgis_asmvt_transfn]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="anyelement"/>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="integer"/>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="pgis_geometry_accum_transfn(internal, geometry)" returnType="internal" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[pgis_geometry_accum_transfn]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="pgis_geometry_accum_transfn(internal, geometry, double precision)" returnType="internal" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[pgis_geometry_accum_transfn]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="pgis_geometry_accum_transfn(internal, geometry, double precision, integer)" returnType="internal" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[pgis_geometry_accum_transfn]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="pgis_geometry_clusterintersecting_finalfn(internal)" returnType="geometry[]" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[pgis_geometry_clusterintersecting_finalfn]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="pgis_geometry_clusterwithin_finalfn(internal)" returnType="geometry[]" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[pgis_geometry_clusterwithin_finalfn]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="pgis_geometry_collect_finalfn(internal)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[pgis_geometry_collect_finalfn]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="pgis_geometry_makeline_finalfn(internal)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[pgis_geometry_makeline_finalfn]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="pgis_geometry_polygonize_finalfn(internal)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[pgis_geometry_polygonize_finalfn]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="pgis_geometry_union_parallel_combinefn(internal, internal)" returnType="internal" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[pgis_geometry_union_parallel_combinefn]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="pgis_geometry_union_parallel_deserialfn(bytea, internal)" returnType="internal" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[pgis_geometry_union_parallel_deserialfn]]></definition>
         <parameters>
            <parameter mode="IN" type="bytea"/>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="pgis_geometry_union_parallel_finalfn(internal)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[pgis_geometry_union_parallel_finalfn]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="pgis_geometry_union_parallel_serialfn(internal)" returnType="bytea" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[pgis_geometry_union_parallel_serialfn]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="pgis_geometry_union_parallel_transfn(internal, geometry)" returnType="internal" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[pgis_geometry_union_parallel_transfn]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="pgis_geometry_union_parallel_transfn(internal, geometry, double precision)" returnType="internal" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[pgis_geometry_union_parallel_transfn]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="point(geometry)" returnType="point" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geometry_to_point]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="polygon(geometry)" returnType="polygon" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geometry_to_polygon]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="populate_geometry_columns(tbl_oid oid, use_typmod boolean DEFAULT true)" returnType="integer" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: relation_oid, use_typmod=true - Ensures geometry columns are defined with type modifiers or have appropriate spatial constraints.]]></comment>
         <definition language="plpgsql"><![CDATA[DECLARE
	gcs		 RECORD;
	gc		  RECORD;
	gc_old	  RECORD;
	gsrid	   integer;
	gndims	  integer;
	gtype	   text;
	query	   text;
	gc_is_valid boolean;
	inserted	integer;
	constraint_successful boolean := false;

BEGIN
	inserted := 0;

	-- Iterate through all geometry columns in this table
	FOR gcs IN
	SELECT n.nspname, c.relname, a.attname, c.relkind
		FROM pg_class c,
			 pg_attribute a,
			 pg_type t,
			 pg_namespace n
		WHERE c.relkind IN('r', 'f', 'p')
		AND t.typname = 'geometry'
		AND a.attisdropped = false
		AND a.atttypid = t.oid
		AND a.attrelid = c.oid
		AND c.relnamespace = n.oid
		AND n.nspname NOT ILIKE 'pg_temp%'
		AND c.oid = tbl_oid
	LOOP

		RAISE DEBUG 'Processing column %.%.%', gcs.nspname, gcs.relname, gcs.attname;

		gc_is_valid := true;
		-- Find the srid, coord_dimension, and type of current geometry
		-- in geometry_columns -- which is now a view

		SELECT type, srid, coord_dimension, gcs.relkind INTO gc_old
			FROM geometry_columns
			WHERE f_table_schema = gcs.nspname AND f_table_name = gcs.relname AND f_geometry_column = gcs.attname;

		IF upper(gc_old.type) = 'GEOMETRY' THEN
		-- This is an unconstrained geometry we need to do something
		-- We need to figure out what to set the type by inspecting the data
			EXECUTE 'SELECT public.ST_srid(' || quote_ident(gcs.attname) || ') As srid, public.GeometryType(' || quote_ident(gcs.attname) || ') As type, public.ST_NDims(' || quote_ident(gcs.attname) || ') As dims ' ||
					 ' FROM ONLY ' || quote_ident(gcs.nspname) || '.' || quote_ident(gcs.relname) ||
					 ' WHERE ' || quote_ident(gcs.attname) || ' IS NOT NULL LIMIT 1;'
				INTO gc;
			IF gc IS NULL THEN -- there is no data so we can not determine geometry type
				RAISE WARNING 'No data in table %.%, so no information to determine geometry type and srid', gcs.nspname, gcs.relname;
				RETURN 0;
			END IF;
			gsrid := gc.srid; gtype := gc.type; gndims := gc.dims;

			IF use_typmod THEN
				BEGIN
					EXECUTE 'ALTER TABLE ' || quote_ident(gcs.nspname) || '.' || quote_ident(gcs.relname) || ' ALTER COLUMN ' || quote_ident(gcs.attname) ||
						' TYPE geometry(' || postgis_type_name(gtype, gndims, true) || ', ' || gsrid::text  || ') ';
					inserted := inserted + 1;
				EXCEPTION
						WHEN invalid_parameter_value OR feature_not_supported THEN
						RAISE WARNING 'Could not convert ''%'' in ''%.%'' to use typmod with srid %, type %: %', quote_ident(gcs.attname), quote_ident(gcs.nspname), quote_ident(gcs.relname), gsrid, postgis_type_name(gtype, gndims, true), SQLERRM;
							gc_is_valid := false;
				END;

			ELSE
				-- Try to apply srid check to column
				constraint_successful = false;
				IF (gsrid > 0 AND postgis_constraint_srid(gcs.nspname, gcs.relname,gcs.attname) IS NULL ) THEN
					BEGIN
						EXECUTE 'ALTER TABLE ONLY ' || quote_ident(gcs.nspname) || '.' || quote_ident(gcs.relname) ||
								 ' ADD CONSTRAINT ' || quote_ident('enforce_srid_' || gcs.attname) ||
								 ' CHECK (ST_srid(' || quote_ident(gcs.attname) || ') = ' || gsrid || ')';
						constraint_successful := true;
					EXCEPTION
						WHEN check_violation THEN
							RAISE WARNING 'Not inserting ''%'' in ''%.%'' into geometry_columns: could not apply constraint CHECK (st_srid(%) = %)', quote_ident(gcs.attname), quote_ident(gcs.nspname), quote_ident(gcs.relname), quote_ident(gcs.attname), gsrid;
							gc_is_valid := false;
					END;
				END IF;

				-- Try to apply ndims check to column
				IF (gndims IS NOT NULL AND postgis_constraint_dims(gcs.nspname, gcs.relname,gcs.attname) IS NULL ) THEN
					BEGIN
						EXECUTE 'ALTER TABLE ONLY ' || quote_ident(gcs.nspname) || '.' || quote_ident(gcs.relname) || '
								 ADD CONSTRAINT ' || quote_ident('enforce_dims_' || gcs.attname) || '
								 CHECK (st_ndims(' || quote_ident(gcs.attname) || ') = '||gndims||')';
						constraint_successful := true;
					EXCEPTION
						WHEN check_violation THEN
							RAISE WARNING 'Not inserting ''%'' in ''%.%'' into geometry_columns: could not apply constraint CHECK (st_ndims(%) = %)', quote_ident(gcs.attname), quote_ident(gcs.nspname), quote_ident(gcs.relname), quote_ident(gcs.attname), gndims;
							gc_is_valid := false;
					END;
				END IF;

				-- Try to apply geometrytype check to column
				IF (gtype IS NOT NULL AND postgis_constraint_type(gcs.nspname, gcs.relname,gcs.attname) IS NULL ) THEN
					BEGIN
						EXECUTE 'ALTER TABLE ONLY ' || quote_ident(gcs.nspname) || '.' || quote_ident(gcs.relname) || '
						ADD CONSTRAINT ' || quote_ident('enforce_geotype_' || gcs.attname) || '
						CHECK (geometrytype(' || quote_ident(gcs.attname) || ') = ' || quote_literal(gtype) || ')';
						constraint_successful := true;
					EXCEPTION
						WHEN check_violation THEN
							-- No geometry check can be applied. This column contains a number of geometry types.
							RAISE WARNING 'Could not add geometry type check (%) to table column: %.%.%', gtype, quote_ident(gcs.nspname),quote_ident(gcs.relname),quote_ident(gcs.attname);
					END;
				END IF;
				 --only count if we were successful in applying at least one constraint
				IF constraint_successful THEN
					inserted := inserted + 1;
				END IF;
			END IF;
		END IF;

	END LOOP;

	RETURN inserted;
END]]></definition>
         <parameters>
            <parameter mode="IN" name="tbl_oid" type="oid"/>
            <parameter mode="IN" name="use_typmod" type="boolean"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="populate_geometry_columns(use_typmod boolean DEFAULT true)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: use_typmod=true - Ensures geometry columns are defined with type modifiers or have appropriate spatial constraints.]]></comment>
         <definition language="plpgsql"><![CDATA[DECLARE
	inserted	integer;
	oldcount	integer;
	probed	  integer;
	stale	   integer;
	gcs		 RECORD;
	gc		  RECORD;
	gsrid	   integer;
	gndims	  integer;
	gtype	   text;
	query	   text;
	gc_is_valid boolean;

BEGIN
	SELECT count(*) INTO oldcount FROM public.geometry_columns;
	inserted := 0;

	-- Count the number of geometry columns in all tables and views
	SELECT count(DISTINCT c.oid) INTO probed
	FROM pg_class c,
		 pg_attribute a,
		 pg_type t,
		 pg_namespace n
	WHERE c.relkind IN('r','v','f', 'p')
		AND t.typname = 'geometry'
		AND a.attisdropped = false
		AND a.atttypid = t.oid
		AND a.attrelid = c.oid
		AND c.relnamespace = n.oid
		AND n.nspname NOT ILIKE 'pg_temp%' AND c.relname != 'raster_columns' ;

	-- Iterate through all non-dropped geometry columns
	RAISE DEBUG 'Processing Tables.....';

	FOR gcs IN
	SELECT DISTINCT ON (c.oid) c.oid, n.nspname, c.relname
		FROM pg_class c,
			 pg_attribute a,
			 pg_type t,
			 pg_namespace n
		WHERE c.relkind IN( 'r', 'f', 'p')
		AND t.typname = 'geometry'
		AND a.attisdropped = false
		AND a.atttypid = t.oid
		AND a.attrelid = c.oid
		AND c.relnamespace = n.oid
		AND n.nspname NOT ILIKE 'pg_temp%' AND c.relname != 'raster_columns'
	LOOP

		inserted := inserted + public.populate_geometry_columns(gcs.oid, use_typmod);
	END LOOP;

	IF oldcount > inserted THEN
		stale = oldcount-inserted;
	ELSE
		stale = 0;
	END IF;

	RETURN 'probed:' ||probed|| ' inserted:'||inserted;
END]]></definition>
         <parameters>
            <parameter mode="IN" name="use_typmod" type="boolean"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="postgis_addbbox(geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA - Add bounding box to the geometry.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_addBBOX]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="postgis_cache_bbox()" returnType="trigger" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[cache_bbox]]></definition>
         <parameters>
            <parameter mode="IN"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="postgis_constraint_dims(geomschema text, geomtable text, geomcolumn text)" returnType="integer" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT  replace(split_part(s.consrc, ' = ', 2), ')', '')::integer
		 FROM pg_class c, pg_namespace n, pg_attribute a
		 , (SELECT connamespace, conrelid, conkey, pg_get_constraintdef(oid) As consrc
			FROM pg_constraint) AS s
		 WHERE n.nspname = $1
		 AND c.relname = $2
		 AND a.attname = $3
		 AND a.attrelid = c.oid
		 AND s.connamespace = n.oid
		 AND s.conrelid = c.oid
		 AND a.attnum = ANY (s.conkey)
		 AND s.consrc LIKE '%ndims(% = %';]]></definition>
         <parameters>
            <parameter mode="IN" name="geomschema" type="text"/>
            <parameter mode="IN" name="geomtable" type="text"/>
            <parameter mode="IN" name="geomcolumn" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="postgis_constraint_srid(geomschema text, geomtable text, geomcolumn text)" returnType="integer" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT replace(replace(split_part(s.consrc, ' = ', 2), ')', ''), '(', '')::integer
		 FROM pg_class c, pg_namespace n, pg_attribute a
		 , (SELECT connamespace, conrelid, conkey, pg_get_constraintdef(oid) As consrc
			FROM pg_constraint) AS s
		 WHERE n.nspname = $1
		 AND c.relname = $2
		 AND a.attname = $3
		 AND a.attrelid = c.oid
		 AND s.connamespace = n.oid
		 AND s.conrelid = c.oid
		 AND a.attnum = ANY (s.conkey)
		 AND s.consrc LIKE '%srid(% = %';]]></definition>
         <parameters>
            <parameter mode="IN" name="geomschema" type="text"/>
            <parameter mode="IN" name="geomtable" type="text"/>
            <parameter mode="IN" name="geomcolumn" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="postgis_constraint_type(geomschema text, geomtable text, geomcolumn text)" returnType="character varying" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT  replace(split_part(s.consrc, '''', 2), ')', '')::varchar
		 FROM pg_class c, pg_namespace n, pg_attribute a
		 , (SELECT connamespace, conrelid, conkey, pg_get_constraintdef(oid) As consrc
			FROM pg_constraint) AS s
		 WHERE n.nspname = $1
		 AND c.relname = $2
		 AND a.attname = $3
		 AND a.attrelid = c.oid
		 AND s.connamespace = n.oid
		 AND s.conrelid = c.oid
		 AND a.attnum = ANY (s.conkey)
		 AND s.consrc LIKE '%geometrytype(% = %';]]></definition>
         <parameters>
            <parameter mode="IN" name="geomschema" type="text"/>
            <parameter mode="IN" name="geomtable" type="text"/>
            <parameter mode="IN" name="geomcolumn" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="postgis_dropbbox(geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA - Drop the bounding box cache from the geometry.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_dropBBOX]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="postgis_extensions_upgrade()" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[Packages and upgrades PostGIS extensions (e.g. postgis_raster,postgis_topology, postgis_sfcgal) to latest available version.]]></comment>
         <definition language="plpgsql"><![CDATA[DECLARE
	rec record;
	sql text;
	var_schema text;
	target_version text; -- TODO: optionally take as argument
BEGIN

	FOR rec IN
		SELECT name, default_version, installed_version
		FROM pg_catalog.pg_available_extensions
		WHERE name IN (
			'postgis',
			'postgis_raster',
			'postgis_sfcgal',
			'postgis_topology',
			'postgis_tiger_geocoder'
		)
		ORDER BY length(name) -- this is to make sure 'postgis' is first !
	LOOP --{

		IF target_version IS NULL THEN
			target_version := rec.default_version;
		END IF;

		IF rec.installed_version IS NULL THEN --{
			-- If the support installed by available extension
			-- is found unpackaged, we package it
			IF --{
				 -- PostGIS is always available (this function is part of it)
				 rec.name = 'postgis'

				 -- PostGIS raster is available if type 'raster' exists
				 OR ( rec.name = 'postgis_raster' AND EXISTS (
							SELECT 1 FROM pg_catalog.pg_type
							WHERE typname = 'raster' ) )

				 -- PostGIS SFCGAL is availble if
				 -- 'postgis_sfcgal_version' function exists
				 OR ( rec.name = 'postgis_sfcgal' AND EXISTS (
							SELECT 1 FROM pg_catalog.pg_proc
							WHERE proname = 'postgis_sfcgal_version' ) )

				 -- PostGIS Topology is available if
				 -- 'topology.topology' table exists
				 -- NOTE: watch out for https://trac.osgeo.org/postgis/ticket/2503
				 OR ( rec.name = 'postgis_topology' AND EXISTS (
							SELECT 1 FROM pg_catalog.pg_class c
							JOIN pg_catalog.pg_namespace n ON (c.relnamespace = n.oid )
							WHERE n.nspname = 'topology' AND c.relname = 'topology') )

				 OR ( rec.name = 'postgis_tiger_geocoder' AND EXISTS (
							SELECT 1 FROM pg_catalog.pg_class c
							JOIN pg_catalog.pg_namespace n ON (c.relnamespace = n.oid )
							WHERE n.nspname = 'tiger' AND c.relname = 'geocode_settings') )
			THEN --}{
				-- Force install in same schema as postgis
				SELECT INTO var_schema n.nspname
				  FROM pg_namespace n, pg_proc p
				  WHERE p.proname = 'postgis_full_version'
					AND n.oid = p.pronamespace
				  LIMIT 1;
				IF rec.name NOT IN('postgis_topology', 'postgis_tiger_geocoder')
				THEN
					sql := format(
							  'CREATE EXTENSION %1$I SCHEMA %2$I VERSION unpackaged;'
							  'ALTER EXTENSION %1$I UPDATE TO %3$I',
							  rec.name, var_schema, target_version);
				ELSE
					sql := format(
							 'CREATE EXTENSION %1$I VERSION unpackaged;'
							 'ALTER EXTENSION %1$I UPDATE TO %2$I',
							 rec.name, target_version);
				END IF;
				RAISE NOTICE 'Packaging and updating %', rec.name;
				RAISE DEBUG '%', sql;
				EXECUTE sql;
			ELSE
				RAISE DEBUG 'Skipping % (not in use)', rec.name;
			END IF;
		ELSE -- IF target_version != rec.installed_version THEN --}{
			sql = '';
			-- If logged in as super user
			-- force an update regardless if at target version, no downgrade allowed
			IF (SELECT usesuper FROM pg_user WHERE usename = CURRENT_USER)
						AND pg_catalog.substring(target_version, '[0-9]+\.[0-9]+\.[0-9]+')
								>= pg_catalog.substring(rec.installed_version, '[0-9]+\.[0-9]+\.[0-9]+')
			THEN
				sql = format(
					'UPDATE pg_catalog.pg_extension SET extversion = ''ANY'' WHERE extname = %1$L;'
					'ALTER EXTENSION %1$I UPDATE TO %2$I',
					rec.name, target_version
				);
			-- sandboxed users do standard upgrade
			ELSE
				sql = format(
				'ALTER EXTENSION %1$I UPDATE TO %2$I',
				rec.name, target_version
				);
			END IF;
			RAISE NOTICE 'Updating extension % %',
				rec.name, rec.installed_version;
			RAISE DEBUG '%', sql;
			EXECUTE sql;
		END IF; --}

	END LOOP; --}

	RETURN format(
		'Upgrade to version %s completed, run SELECT postgis_full_version(); for details',
		target_version
	);


END]]></definition>
         <parameters>
            <parameter mode="IN"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="postgis_full_version()" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[Reports full PostGIS version and build configuration infos.]]></comment>
         <definition language="plpgsql"><![CDATA[DECLARE
	libver text;
	librev text;
	projver text;
	geosver text;
	sfcgalver text;
	gdalver text := NULL;
	libxmlver text;
	liblwgeomver text;
	dbproc text;
	relproc text;
	fullver text;
	rast_lib_ver text := NULL;
	rast_scr_ver text := NULL;
	topo_scr_ver text := NULL;
	json_lib_ver text;
	protobuf_lib_ver text;
	wagyu_lib_ver text;
	sfcgal_lib_ver text;
	sfcgal_scr_ver text;
	pgsql_scr_ver text;
	pgsql_ver text;
	core_is_extension bool;
BEGIN
	SELECT public.postgis_lib_version() INTO libver;
	SELECT public.postgis_proj_version() INTO projver;
	SELECT public.postgis_geos_version() INTO geosver;
	SELECT public.postgis_libjson_version() INTO json_lib_ver;
	SELECT public.postgis_libprotobuf_version() INTO protobuf_lib_ver;
	SELECT public.postgis_wagyu_version() INTO wagyu_lib_ver;
	SELECT public._postgis_scripts_pgsql_version() INTO pgsql_scr_ver;
	SELECT public._postgis_pgsql_version() INTO pgsql_ver;
	BEGIN
		SELECT public.postgis_gdal_version() INTO gdalver;
	EXCEPTION
		WHEN undefined_function THEN
			RAISE DEBUG 'Function postgis_gdal_version() not found.  Is raster support enabled and rtpostgis.sql installed?';
	END;
	BEGIN
		SELECT public.postgis_sfcgal_full_version() INTO sfcgalver;
		BEGIN
			SELECT public.postgis_sfcgal_scripts_installed() INTO sfcgal_scr_ver;
		EXCEPTION
			WHEN undefined_function THEN
				sfcgal_scr_ver := 'missing';
		END;
	EXCEPTION
		WHEN undefined_function THEN
			RAISE DEBUG 'Function postgis_sfcgal_scripts_installed() not found. Is sfcgal support enabled and sfcgal.sql installed?';
	END;
	SELECT public.postgis_liblwgeom_version() INTO liblwgeomver;
	SELECT public.postgis_libxml_version() INTO libxmlver;
	SELECT public.postgis_scripts_installed() INTO dbproc;
	SELECT public.postgis_scripts_released() INTO relproc;
	SELECT public.postgis_lib_revision() INTO librev;
	BEGIN
		SELECT topology.postgis_topology_scripts_installed() INTO topo_scr_ver;
	EXCEPTION
		WHEN undefined_function OR invalid_schema_name THEN
			RAISE DEBUG 'Function postgis_topology_scripts_installed() not found. Is topology support enabled and topology.sql installed?';
		WHEN insufficient_privilege THEN
			RAISE NOTICE 'Topology support cannot be inspected. Is current user granted USAGE on schema "topology" ?';
		WHEN OTHERS THEN
			RAISE NOTICE 'Function postgis_topology_scripts_installed() could not be called: % (%)', SQLERRM, SQLSTATE;
	END;

	BEGIN
		SELECT postgis_raster_scripts_installed() INTO rast_scr_ver;
	EXCEPTION
		WHEN undefined_function THEN
			RAISE DEBUG 'Function postgis_raster_scripts_installed() not found. Is raster support enabled and rtpostgis.sql installed?';
		WHEN OTHERS THEN
			RAISE NOTICE 'Function postgis_raster_scripts_installed() could not be called: % (%)', SQLERRM, SQLSTATE;
	END;

	BEGIN
		SELECT public.postgis_raster_lib_version() INTO rast_lib_ver;
	EXCEPTION
		WHEN undefined_function THEN
			RAISE DEBUG 'Function postgis_raster_lib_version() not found. Is raster support enabled and rtpostgis.sql installed?';
		WHEN OTHERS THEN
			RAISE NOTICE 'Function postgis_raster_lib_version() could not be called: % (%)', SQLERRM, SQLSTATE;
	END;

	fullver = 'POSTGIS="' || libver;

	IF  librev IS NOT NULL THEN
		fullver = fullver || ' ' || librev;
	END IF;

	fullver = fullver || '"';

	IF EXISTS (
		SELECT * FROM pg_catalog.pg_extension
		WHERE extname = 'postgis')
	THEN
			fullver = fullver || ' [EXTENSION]';
			core_is_extension := true;
	ELSE
			core_is_extension := false;
	END IF;

	IF liblwgeomver != relproc THEN
		fullver = fullver || ' (liblwgeom version mismatch: "' || liblwgeomver || '")';
	END IF;

	fullver = fullver || ' PGSQL="' || pgsql_scr_ver || '"';
	IF pgsql_scr_ver != pgsql_ver THEN
		fullver = fullver || ' (procs need upgrade for use with PostgreSQL "' || pgsql_ver || '")';
	END IF;

	IF  geosver IS NOT NULL THEN
		fullver = fullver || ' GEOS="' || geosver || '"';
	END IF;

	IF  sfcgalver IS NOT NULL THEN
		fullver = fullver || ' SFCGAL="' || sfcgalver || '"';
	END IF;

	IF  projver IS NOT NULL THEN
		fullver = fullver || ' PROJ="' || projver || '"';
	END IF;

	IF  gdalver IS NOT NULL THEN
		fullver = fullver || ' GDAL="' || gdalver || '"';
	END IF;

	IF  libxmlver IS NOT NULL THEN
		fullver = fullver || ' LIBXML="' || libxmlver || '"';
	END IF;

	IF json_lib_ver IS NOT NULL THEN
		fullver = fullver || ' LIBJSON="' || json_lib_ver || '"';
	END IF;

	IF protobuf_lib_ver IS NOT NULL THEN
		fullver = fullver || ' LIBPROTOBUF="' || protobuf_lib_ver || '"';
	END IF;

	IF wagyu_lib_ver IS NOT NULL THEN
		fullver = fullver || ' WAGYU="' || wagyu_lib_ver || '"';
	END IF;

	IF dbproc != relproc THEN
		fullver = fullver || ' (core procs from "' || dbproc || '" need upgrade)';
	END IF;

	IF topo_scr_ver IS NOT NULL THEN
		fullver = fullver || ' TOPOLOGY';
		IF topo_scr_ver != relproc THEN
			fullver = fullver || ' (topology procs from "' || topo_scr_ver || '" need upgrade)';
		END IF;
		IF core_is_extension AND NOT EXISTS (
			SELECT * FROM pg_catalog.pg_extension
			WHERE extname = 'postgis_topology')
		THEN
				fullver = fullver || ' [UNPACKAGED!]';
		END IF;
	END IF;

	IF rast_lib_ver IS NOT NULL THEN
		fullver = fullver || ' RASTER';
		IF rast_lib_ver != relproc THEN
			fullver = fullver || ' (raster lib from "' || rast_lib_ver || '" need upgrade)';
		END IF;
		IF core_is_extension AND NOT EXISTS (
			SELECT * FROM pg_catalog.pg_extension
			WHERE extname = 'postgis_raster')
		THEN
				fullver = fullver || ' [UNPACKAGED!]';
		END IF;
	END IF;

	IF rast_scr_ver IS NOT NULL AND rast_scr_ver != relproc THEN
		fullver = fullver || ' (raster procs from "' || rast_scr_ver || '" need upgrade)';
	END IF;

	IF sfcgal_scr_ver IS NOT NULL AND sfcgal_scr_ver != relproc THEN
		fullver = fullver || ' (sfcgal procs from "' || sfcgal_scr_ver || '" need upgrade)';
	END IF;

	-- Check for the presence of deprecated functions
	IF EXISTS ( SELECT oid FROM pg_catalog.pg_proc WHERE proname LIKE '%_deprecated_by_postgis_%' )
	THEN
		fullver = fullver || ' (deprecated functions exist, upgrade is not complete)';
	END IF;

	RETURN fullver;
END]]></definition>
         <parameters>
            <parameter mode="IN"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="postgis_geos_noop(geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[GEOSnoop]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="postgis_geos_version()" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[Returns the version number of the GEOS library.]]></comment>
         <definition language="c"><![CDATA[postgis_geos_version]]></definition>
         <parameters>
            <parameter mode="IN"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="postgis_getbbox(geometry)" returnType="box2d" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_to_BOX2DF]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="postgis_hasbbox(geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA - Returns TRUE if the bbox of this geometry is cached, FALSE otherwise.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_hasBBOX]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="postgis_index_supportfn(internal)" returnType="internal" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[postgis_index_supportfn]]></definition>
         <parameters>
            <parameter mode="IN" type="internal"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="postgis_lib_build_date()" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[Returns build date of the PostGIS library.]]></comment>
         <definition language="c"><![CDATA[postgis_lib_build_date]]></definition>
         <parameters>
            <parameter mode="IN"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="postgis_lib_revision()" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[postgis_lib_revision]]></definition>
         <parameters>
            <parameter mode="IN"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="postgis_lib_version()" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[Returns the version number of the PostGIS library.]]></comment>
         <definition language="c"><![CDATA[postgis_lib_version]]></definition>
         <parameters>
            <parameter mode="IN"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="postgis_libjson_version()" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[postgis_libjson_version]]></definition>
         <parameters>
            <parameter mode="IN"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="postgis_liblwgeom_version()" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[Returns the version number of the liblwgeom library. This should match the version of PostGIS.]]></comment>
         <definition language="c"><![CDATA[postgis_liblwgeom_version]]></definition>
         <parameters>
            <parameter mode="IN"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="postgis_libprotobuf_version()" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[postgis_libprotobuf_version]]></definition>
         <parameters>
            <parameter mode="IN"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="postgis_libxml_version()" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[Returns the version number of the libxml2 library.]]></comment>
         <definition language="c"><![CDATA[postgis_libxml_version]]></definition>
         <parameters>
            <parameter mode="IN"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="postgis_noop(geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_noop]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="postgis_proj_version()" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[Returns the version number of the PROJ4 library.]]></comment>
         <definition language="c"><![CDATA[postgis_proj_version]]></definition>
         <parameters>
            <parameter mode="IN"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="postgis_scripts_build_date()" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[Returns build date of the PostGIS scripts.]]></comment>
         <definition language="sql"><![CDATA[SELECT '2023-05-30 03:36:20'::text AS version]]></definition>
         <parameters>
            <parameter mode="IN"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="postgis_scripts_installed()" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[Returns version of the PostGIS scripts installed in this database.]]></comment>
         <definition language="sql"><![CDATA[SELECT trim('3.3.3'::text || $rev$ 2355e8e $rev$) AS version]]></definition>
         <parameters>
            <parameter mode="IN"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="postgis_scripts_released()" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[Returns the version number of the postgis.sql script released with the installed PostGIS lib.]]></comment>
         <definition language="c"><![CDATA[postgis_scripts_released]]></definition>
         <parameters>
            <parameter mode="IN"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="postgis_svn_version()" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT public._postgis_deprecate(
		'postgis_svn_version', 'postgis_lib_revision', '3.1.0');
	SELECT public.postgis_lib_revision();]]></definition>
         <parameters>
            <parameter mode="IN"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="postgis_transform_geometry(geom geometry, text, text, integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[transform_geom]]></definition>
         <parameters>
            <parameter mode="IN" name="geom" type="geometry"/>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="postgis_type_name(geomname character varying, coord_dimension integer, use_new_name boolean DEFAULT true)" returnType="character varying" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT CASE WHEN $3 THEN new_name ELSE old_name END As geomname
	FROM
	( VALUES
			('GEOMETRY', 'Geometry', 2),
			('GEOMETRY', 'GeometryZ', 3),
			('GEOMETRYM', 'GeometryM', 3),
			('GEOMETRY', 'GeometryZM', 4),

			('GEOMETRYCOLLECTION', 'GeometryCollection', 2),
			('GEOMETRYCOLLECTION', 'GeometryCollectionZ', 3),
			('GEOMETRYCOLLECTIONM', 'GeometryCollectionM', 3),
			('GEOMETRYCOLLECTION', 'GeometryCollectionZM', 4),

			('POINT', 'Point', 2),
			('POINT', 'PointZ', 3),
			('POINTM','PointM', 3),
			('POINT', 'PointZM', 4),

			('MULTIPOINT','MultiPoint', 2),
			('MULTIPOINT','MultiPointZ', 3),
			('MULTIPOINTM','MultiPointM', 3),
			('MULTIPOINT','MultiPointZM', 4),

			('POLYGON', 'Polygon', 2),
			('POLYGON', 'PolygonZ', 3),
			('POLYGONM', 'PolygonM', 3),
			('POLYGON', 'PolygonZM', 4),

			('MULTIPOLYGON', 'MultiPolygon', 2),
			('MULTIPOLYGON', 'MultiPolygonZ', 3),
			('MULTIPOLYGONM', 'MultiPolygonM', 3),
			('MULTIPOLYGON', 'MultiPolygonZM', 4),

			('MULTILINESTRING', 'MultiLineString', 2),
			('MULTILINESTRING', 'MultiLineStringZ', 3),
			('MULTILINESTRINGM', 'MultiLineStringM', 3),
			('MULTILINESTRING', 'MultiLineStringZM', 4),

			('LINESTRING', 'LineString', 2),
			('LINESTRING', 'LineStringZ', 3),
			('LINESTRINGM', 'LineStringM', 3),
			('LINESTRING', 'LineStringZM', 4),

			('CIRCULARSTRING', 'CircularString', 2),
			('CIRCULARSTRING', 'CircularStringZ', 3),
			('CIRCULARSTRINGM', 'CircularStringM' ,3),
			('CIRCULARSTRING', 'CircularStringZM', 4),

			('COMPOUNDCURVE', 'CompoundCurve', 2),
			('COMPOUNDCURVE', 'CompoundCurveZ', 3),
			('COMPOUNDCURVEM', 'CompoundCurveM', 3),
			('COMPOUNDCURVE', 'CompoundCurveZM', 4),

			('CURVEPOLYGON', 'CurvePolygon', 2),
			('CURVEPOLYGON', 'CurvePolygonZ', 3),
			('CURVEPOLYGONM', 'CurvePolygonM', 3),
			('CURVEPOLYGON', 'CurvePolygonZM', 4),

			('MULTICURVE', 'MultiCurve', 2),
			('MULTICURVE', 'MultiCurveZ', 3),
			('MULTICURVEM', 'MultiCurveM', 3),
			('MULTICURVE', 'MultiCurveZM', 4),

			('MULTISURFACE', 'MultiSurface', 2),
			('MULTISURFACE', 'MultiSurfaceZ', 3),
			('MULTISURFACEM', 'MultiSurfaceM', 3),
			('MULTISURFACE', 'MultiSurfaceZM', 4),

			('POLYHEDRALSURFACE', 'PolyhedralSurface', 2),
			('POLYHEDRALSURFACE', 'PolyhedralSurfaceZ', 3),
			('POLYHEDRALSURFACEM', 'PolyhedralSurfaceM', 3),
			('POLYHEDRALSURFACE', 'PolyhedralSurfaceZM', 4),

			('TRIANGLE', 'Triangle', 2),
			('TRIANGLE', 'TriangleZ', 3),
			('TRIANGLEM', 'TriangleM', 3),
			('TRIANGLE', 'TriangleZM', 4),

			('TIN', 'Tin', 2),
			('TIN', 'TinZ', 3),
			('TINM', 'TinM', 3),
			('TIN', 'TinZM', 4) )
			 As g(old_name, new_name, coord_dimension)
	WHERE (upper(old_name) = upper($1) OR upper(new_name) = upper($1))
		AND coord_dimension = $2;]]></definition>
         <parameters>
            <parameter mode="IN" name="geomname" type="character varying"/>
            <parameter mode="IN" name="coord_dimension" type="integer"/>
            <parameter mode="IN" name="use_new_name" type="boolean"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="postgis_typmod_dims(integer)" returnType="integer" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[postgis_typmod_dims]]></definition>
         <parameters>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="postgis_typmod_srid(integer)" returnType="integer" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[postgis_typmod_srid]]></definition>
         <parameters>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="postgis_typmod_type(integer)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[postgis_typmod_type]]></definition>
         <parameters>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="postgis_version()" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[Returns PostGIS version number and compile-time options.]]></comment>
         <definition language="c"><![CDATA[postgis_version]]></definition>
         <parameters>
            <parameter mode="IN"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="postgis_wagyu_version()" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[Returns the version number of the internal Wagyu library.]]></comment>
         <definition language="c"><![CDATA[postgis_wagyu_version]]></definition>
         <parameters>
            <parameter mode="IN"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="sms_copy_scraper_gps_data(IN _scraper_serial text, IN _scraper_id uuid, IN _day_id integer, IN _tenant_id uuid, IN _inclination_treshold integer)" securityType="INVOKER" type="PROCEDURE">
         <comment/>
         <definition language="sql"><![CDATA[INSERT INTO sms_teltonika_scraper_gps_data(tenant_id, time, id, coord, ign, dumpster_open, created_at, dozer_nearby, scraper_id, dozer_id)

    SELECT
        _tenant_id AS tenant_id,
        time,
        id,
        coord,
        ign,
        CASE
            WHEN dumpster_proximity < _inclination_treshold THEN FALSE
            ELSE TRUE
        END AS dumpster_open,
        created_at,
        FALSE AS is_loading,
        _scraper_id AS scraper_id,
        NULL AS dozer_nearby
    FROM sms_teltonika_gps_data
    WHERE serial_number = _scraper_serial
        AND time >= TO_DATE(_day_id::TEXT, 'YYYYMMDD')
        AND time < TO_DATE(_day_id::TEXT, 'YYYYMMDD') + 1
        AND tenant_id = _tenant_id
    ORDER BY time ASC]]></definition>
         <parameters>
            <parameter mode="IN" name="_scraper_serial" type="text"/>
            <parameter mode="IN" name="_scraper_id" type="uuid"/>
            <parameter mode="IN" name="_day_id" type="integer"/>
            <parameter mode="IN" name="_tenant_id" type="uuid"/>
            <parameter mode="IN" name="_inclination_treshold" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="sms_copy_scraper_gps_data_v2(IN _scraper_serial text, IN _scraper_id uuid, IN _day_id integer, IN _tenant_id uuid, IN _inclination_treshold integer)" securityType="INVOKER" type="PROCEDURE">
         <comment/>
         <definition language="sql"><![CDATA[INSERT INTO sms_teltonika_scraper_gps_data(tenant_id, time, id, coord, ign, dumpster_open, created_at, dozer_nearby, scraper_id, dozer_id)

    SELECT
        _tenant_id AS tenant_id,
        time,
        id,
        coord,
        ign,
        CASE
            WHEN dumpster_proximity < _inclination_treshold THEN TRUE
            ELSE FALSE
        END AS dumpster_open,
        created_at,
        FALSE AS is_loading,
        _scraper_id AS scraper_id,
        NULL AS dozer_nearby
    FROM sms_teltonika_gps_data
    WHERE serial_number = _scraper_serial
        AND time >= TO_DATE(_day_id::TEXT, 'YYYYMMDD')
        AND time < TO_DATE(_day_id::TEXT, 'YYYYMMDD') + 1
        AND tenant_id = _tenant_id
    ORDER BY time ASC]]></definition>
         <parameters>
            <parameter mode="IN" name="_scraper_serial" type="text"/>
            <parameter mode="IN" name="_scraper_id" type="uuid"/>
            <parameter mode="IN" name="_day_id" type="integer"/>
            <parameter mode="IN" name="_tenant_id" type="uuid"/>
            <parameter mode="IN" name="_inclination_treshold" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="sms_delete_daily_data(IN _day_id integer, IN _tenant_id uuid)" securityType="INVOKER" type="PROCEDURE">
         <comment/>
         <definition language="sql"><![CDATA[DELETE 
FROM sms_teltonika_scraper_gps_data
WHERE tenant_id = _tenant_id;

DELETE 
FROM sms_tgd_computed_info
WHERE tenant_id = _tenant_id AND day_id = _day_id;

DELETE
FROM sms_truck_move
WHERE tenant_id = _tenant_id AND day_id = _day_id;

DELETE
FROM sms_truck_cycle
WHERE tenant_id = _tenant_id AND day_id = _day_id;

DELETE
FROM sms_truck_daily_zone
WHERE tenant_id = _tenant_id AND day_id = _day_id; 

DELETE
FROM sms_loader_move
WHERE tenant_id = _tenant_id AND day_id = _day_id;

DELETE
FROM sms_loader_daily_zone
WHERE tenant_id = _tenant_id AND day_id = _day_id;

DELETE
FROM sms_scraper_move
WHERE tenant_id = _tenant_id AND day_id = _day_id;

DELETE
FROM sms_scraper_cycle
WHERE tenant_id = _tenant_id AND day_id = _day_id;

DELETE
FROM sms_scraper_daily_zone
WHERE tenant_id = _tenant_id AND day_id = _day_id;]]></definition>
         <parameters>
            <parameter mode="IN" name="_day_id" type="integer"/>
            <parameter mode="IN" name="_tenant_id" type="uuid"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="sms_insert_computed_info(IN _serial_number text, IN _day_id integer, IN _tenant_id uuid, IN _site_id uuid)" securityType="INVOKER" type="PROCEDURE">
         <comment/>
         <definition language="sql"><![CDATA[WITH
    gps AS (
        SELECT
            id,
            time,
            (
                SELECT sd.id
                FROM sms_shift_day AS sd
                LEFT JOIN sms_shift AS s ON s.id = sd.shift_id
                LEFT JOIN tenants AS t on t.id = _tenant_id
                WHERE time::timestamp AT TIME ZONE (SELECT current_setting('TIMEZONE')) AT TIME ZONE t.time_zone >= TO_TIMESTAMP(CONCAT(TO_DATE(_day_id::TEXT, 'YYYYMMDD'), ' ', sd.start_hour, ':', sd.start_minute, ':', 0), 'YYYY-MM-DD HH24:MI:SS')
                AND time::timestamp AT TIME ZONE (SELECT current_setting('TIMEZONE')) AT TIME ZONE t.time_zone < TO_TIMESTAMP(CONCAT(TO_DATE(_day_id::TEXT, 'YYYYMMDD'), ' ', sd.end_hour, ':', sd.end_minute, ':', 0), 'YYYY-MM-DD HH24:MI:SS')
                AND SUBSTRING(REVERSE(sd.day_mask::BIT(7)::VARCHAR), EXTRACT(isodow from time)::INT, 1) = '1'
                AND
                (
                    (
                        s.valid_from <= TO_DATE(_day_id::TEXT, 'YYYYMMDD') AND
                        s.valid_to > TO_DATE(_day_id::TEXT, 'YYYYMMDD')
                    ) OR
                    (
                        s.valid_from <= TO_DATE(_day_id::TEXT, 'YYYYMMDD') AND
                        s.valid_to IS NULL
                    )
                )
                AND s.tenant_id = _tenant_id
                AND sd.tenant_id = _tenant_id
                AND s.site_id = _site_id
                LIMIT 1
            ) AS shift_day_id,
            (
                SELECT sd.name
                FROM sms_shift_day AS sd
                LEFT JOIN sms_shift AS s ON s.id = sd.shift_id
                LEFT JOIN tenants AS t on t.id = _tenant_id
                WHERE time::timestamp AT TIME ZONE (SELECT current_setting('TIMEZONE')) AT TIME ZONE t.time_zone >= TO_TIMESTAMP(CONCAT(TO_DATE(_day_id::TEXT, 'YYYYMMDD'), ' ', sd.start_hour, ':', sd.start_minute, ':', 0), 'YYYY-MM-DD HH24:MI:SS')
                AND time::timestamp AT TIME ZONE (SELECT current_setting('TIMEZONE')) AT TIME ZONE t.time_zone < TO_TIMESTAMP(CONCAT(TO_DATE(_day_id::TEXT, 'YYYYMMDD'), ' ', sd.end_hour, ':', sd.end_minute, ':', 0), 'YYYY-MM-DD HH24:MI:SS')
                AND SUBSTRING(REVERSE(sd.day_mask::BIT(7)::VARCHAR), EXTRACT(isodow from time)::INT, 1) = '1'
                AND
                (
                    (
                        s.valid_from <= TO_DATE(_day_id::TEXT, 'YYYYMMDD') AND
                        s.valid_to > TO_DATE(_day_id::TEXT, 'YYYYMMDD')
                    ) OR
                    (
                        s.valid_from <= TO_DATE(_day_id::TEXT, 'YYYYMMDD') AND
                        s.valid_to IS NULL
                    )
                )
                AND s.tenant_id = _tenant_id
                AND sd.tenant_id = _tenant_id
                AND s.site_id = _site_id
                LIMIT 1
            ) AS shift_day_name,
            ST_DistanceSphere(coord, LEAD(coord, 1) OVER (ORDER BY time)) AS delta_distance,
            EXTRACT(EPOCH FROM (LEAD(time, 1) OVER (ORDER BY time) - time)) AS delta_time,
            LEAD(alt, 1) OVER (ORDER BY time) - alt AS delta_alt
        FROM sms_teltonika_gps_data
        WHERE time >= TO_DATE(_day_id::TEXT, 'YYYYMMDD') AND time < TO_DATE(_day_id::TEXT, 'YYYYMMDD') + 1 AND
        tenant_id = _tenant_id AND serial_number = _serial_number
        ORDER BY time
    )

    INSERT INTO sms_tgd_computed_info(id, tenant_id, delta_time, delta_alt, delta_distance, computed_speed, day_id, shift_day_id, shift_day_name)

    SELECT
        gps.id AS id,
        _tenant_id AS tenant_id,
        CASE
            WHEN gps.delta_time IS NULL THEN 0.00
            ELSE ROUND((gps.delta_time)::numeric, 2)
        END AS delta_time,
        gps.delta_alt,
        CASE
            WHEN gps.delta_distance IS NULL THEN 0.00
            ELSE ROUND((gps.delta_distance)::numeric, 2)
        END AS delta_distance,
        CASE
            WHEN gps.delta_distance IS NULL THEN 0.00
            ELSE ROUND((3.6 * (gps.delta_distance / gps.delta_time))::numeric, 2)
        END AS computed_speed,
        _day_id AS day_id,
        shift_day_id,
        shift_day_name
    FROM gps]]></definition>
         <parameters>
            <parameter mode="IN" name="_serial_number" type="text"/>
            <parameter mode="IN" name="_day_id" type="integer"/>
            <parameter mode="IN" name="_tenant_id" type="uuid"/>
            <parameter mode="IN" name="_site_id" type="uuid"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="sms_insert_daily_loader_data(IN _loader_serial text, IN _loader_id uuid, IN _day_id integer, IN _tenant_id uuid, IN _site_id uuid, IN _parameter_id uuid)" securityType="INVOKER" type="PROCEDURE">
         <comment/>
         <definition language="sql"><![CDATA[WITH
    -- Filter raw tracker data and compute distance and time period
    filtered AS (
        SELECT
            id,
            time,
            ST_DistanceSphere(coord, LEAD(coord, 1) OVER (ORDER BY time)) AS distance,
            EXTRACT(EPOCH FROM (LEAD(time, 1) OVER (ORDER BY time) - time)) AS duration
        FROM sms_teltonika_gps_data
        WHERE serial_number = _loader_serial::TEXT
            AND time >= TO_DATE(_day_id::TEXT, 'YYYYMMDD')
            AND time < TO_DATE(_day_id::TEXT, 'YYYYMMDD') + 1
        ORDER BY time
    ),

    -- Format distance and duration and compute and format speed from computed distance and duration
    calculated AS (
        SELECT
            gps.id,
            gps.time,
            gps.coord,
            CASE
                WHEN filtered.distance IS NULL THEN 0.00
                ELSE ROUND((filtered.distance)::numeric, 2)
            END AS filtered_distance,
            CASE
                WHEN filtered.duration IS NULL THEN 0.00
                ELSE ROUND((filtered.duration)::numeric, 2)
            END AS filtered_duration,
            CASE
                WHEN filtered.distance IS NULL THEN 0.00
                ELSE ROUND((3.6 * (filtered.distance / filtered.duration))::numeric, 2)
            END AS filtered_speed
        FROM sms_teltonika_gps_data AS gps
        JOIN filtered ON filtered.id = gps.id
    ),

    -- Categorize records by move type
    typed AS (
        SELECT
            *,
            (
                SELECT sd.id
                FROM sms_shift_day AS sd
                LEFT JOIN sms_shift AS s ON s.id = sd.shift_id
                LEFT JOIN tenants AS t on t.id = _tenant_id
                WHERE calculated.time::timestamp AT TIME ZONE (SELECT current_setting('TIMEZONE')) AT TIME ZONE t.time_zone >= TO_TIMESTAMP(CONCAT(TO_DATE(_day_id::TEXT, 'YYYYMMDD'), ' ', sd.start_hour, ':', sd.start_minute, ':', 0), 'YYYY-MM-DD HH24:MI:SS')
                AND calculated.time::timestamp AT TIME ZONE (SELECT current_setting('TIMEZONE')) AT TIME ZONE t.time_zone < TO_TIMESTAMP(CONCAT(TO_DATE(_day_id::TEXT, 'YYYYMMDD'), ' ', sd.end_hour, ':', sd.end_minute, ':', 0), 'YYYY-MM-DD HH24:MI:SS')
                AND SUBSTRING(REVERSE(sd.day_mask::BIT(7)::VARCHAR), EXTRACT(isodow from time)::INT, 1) = '1'
                AND
                (
                    (
                        s.valid_from <= TO_DATE(_day_id::TEXT, 'YYYYMMDD') AND
                        s.valid_to > TO_DATE(_day_id::TEXT, 'YYYYMMDD')
                    ) OR
                    (
                        s.valid_from <= TO_DATE(_day_id::TEXT, 'YYYYMMDD') AND
                        s.valid_to IS NULL
                    )
                )
                AND s.tenant_id = _tenant_id
                AND sd.tenant_id = _tenant_id
                AND s.site_id = _site_id
                LIMIT 1
            ) AS shift_day_id,
            (
                SELECT sd.name
                FROM sms_shift_day AS sd
                LEFT JOIN sms_shift AS s ON s.id = sd.shift_id
                LEFT JOIN tenants AS t on t.id = _tenant_id
                WHERE calculated.time::timestamp AT TIME ZONE (SELECT current_setting('TIMEZONE')) AT TIME ZONE t.time_zone >= TO_TIMESTAMP(CONCAT(TO_DATE(_day_id::TEXT, 'YYYYMMDD'), ' ', sd.start_hour, ':', sd.start_minute, ':', 0), 'YYYY-MM-DD HH24:MI:SS')
                AND calculated.time::timestamp AT TIME ZONE (SELECT current_setting('TIMEZONE')) AT TIME ZONE t.time_zone < TO_TIMESTAMP(CONCAT(TO_DATE(_day_id::TEXT, 'YYYYMMDD'), ' ', sd.end_hour, ':', sd.end_minute, ':', 0), 'YYYY-MM-DD HH24:MI:SS')
                AND SUBSTRING(REVERSE(sd.day_mask::BIT(7)::VARCHAR), EXTRACT(isodow from time)::INT, 1) = '1'
                AND
                (
                    (
                        s.valid_from <= TO_DATE(_day_id::TEXT, 'YYYYMMDD') AND
                        s.valid_to > TO_DATE(_day_id::TEXT, 'YYYYMMDD')
                    ) OR
                    (
                        s.valid_from <= TO_DATE(_day_id::TEXT, 'YYYYMMDD') AND
                        s.valid_to IS NULL
                    )
                )
                AND s.tenant_id = _tenant_id
                AND sd.tenant_id = _tenant_id
                AND s.site_id = _site_id
                LIMIT 1
            ) AS shift_day_name,
            (
                SELECT id
                FROM sms_shift_day
                WHERE EXTRACT(hour from time) * 100 + EXTRACT(minute from time) >= start_hour * 100 + start_minute
                AND EXTRACT(hour from time) * 100 + EXTRACT(minute from time) <= end_hour * 100 + end_minute
                AND day_mask = EXTRACT(isodow from time)
            ) AS shift_id,
            CASE
                WHEN filtered_speed <= 5.0 THEN 'motionless'
                WHEN filtered_speed > 5.0 THEN 'travel'
                ELSE 'unknown'
            END AS type
        FROM calculated
    ),

    -- Intersect move coordinates with fixed zones
    intersected AS (
        SELECT
            t.id,
            z.id AS zone_id
        FROM typed AS t, sms_zone AS z
        WHERE
        (
            (
                z.valid_from <= TO_DATE(_day_id::TEXT, 'YYYYMMDD') AND
                z.valid_to > TO_DATE(_day_id::TEXT, 'YYYYMMDD')
            ) OR
            (
                z.valid_from <= TO_DATE(_day_id::TEXT, 'YYYYMMDD') AND
                z.valid_to IS NULL
            )
        ) AND
        z.deleted_at IS NULL AND
        z.tenant_id = _tenant_id AND
        z.site_id = _site_id AND
        ST_IsEmpty(ST_Intersection(t.coord, ST_SetSRID(z.polygon, 4326))) = false
    ),

    -- Partition zone-intersected moves
    intersected_partitioned AS (
        SELECT
            intersected.*,
            (ROW_NUMBER() OVER (ORDER BY id) - ROW_NUMBER() OVER (PARTITION BY id ORDER BY id)) AS numberer
        FROM intersected
    ),

    -- Rank partioned zone-intersected moves
    intersected_ranked AS (
        SELECT
            intersected_partitioned.*,
            ROW_NUMBER() OVER (PARTITION BY id, numberer ORDER by id) AS rank
        FROM intersected_partitioned
        ORDER BY id
    ),

    -- Filter ranked zone-intersected moves
    intersected_filtered AS (
        SELECT *
        FROM intersected_ranked
        WHERE rank = 1
    ),

    -- Intersect move coordinates with fixed zones
    zoned AS (
        SELECT
            t.*,
            i.zone_id
        FROM typed AS t
        LEFT JOIN intersected_filtered AS i ON t.id = i.id
    ),

    -- Partition records by row numberer
    partitioned AS (
        SELECT
            zoned.*,
            (ROW_NUMBER() OVER (ORDER BY time) - ROW_NUMBER() OVER (PARTITION BY type ORDER BY time)) AS numberer
        FROM zoned
    ),

    -- Aggregate duration and distance and calculate centroid and linestring from aggregated positions
    linestring_calculated AS (
        SELECT
            time,
            type,
            numberer,
            ROW_NUMBER() OVER (PARTITION BY type, numberer ORDER by time) AS rank,
            SUM(filtered_duration) OVER (PARTITION BY type, numberer ORDER BY time DESC) AS duration,
            SUM(filtered_distance) OVER (PARTITION BY type, numberer ORDER BY time DESC) AS distance,
            ST_MakeLine(coord) OVER (PARTITION BY type, numberer ORDER BY time) as linestring,
            ST_Centroid(ST_UNION(coord) OVER (PARTITION BY type, numberer ORDER BY time)) AS centroid,
            shift_day_id,
            shift_day_name
        FROM partitioned
        ORDER BY time
    ),

    -- Filter last linestring or centroid if linestring is single point
    linestring_filtered AS (
        SELECT
            numberer,
            type,
            CASE
                WHEN ST_NumPoints(linestring) > 1 THEN linestring
                ELSE ST_Centroid(linestring)
            END AS geometry
        FROM linestring_calculated
        WHERE (numberer, rank, type) IN (SELECT numberer, MAX(rank) as rank, type FROM linestring_calculated GROUP BY type, numberer)
    ),

    -- Add geometry from linestring_filtered to linestring_calculated
    geometry_calculated AS (
        SELECT
            lc.*,
            lf.geometry
        FROM linestring_calculated AS lc
        JOIN linestring_filtered AS lf ON lc.numberer = lf.numberer AND lc.type = lf.type
    )

    /** Insert new data **/
    INSERT INTO sms_loader_move(tenant_id, loader_id, day_id, loader_parameter_id, start_date, type, duration, distance, geometry, centroid, shift_day_id, shift_day_name)

    -- Finalize selection
    SELECT
        _tenant_id AS tenant_id,
        _loader_id AS loader_id,
        _day_id AS day_id,
        _parameter_id AS loader_parameter_id,
        time AS start_date,
        type,
        duration,
        distance,
        geometry,
        centroid,
        shift_day_id,
        shift_day_name
    FROM geometry_calculated
    WHERE rank = 1]]></definition>
         <parameters>
            <parameter mode="IN" name="_loader_serial" type="text"/>
            <parameter mode="IN" name="_loader_id" type="uuid"/>
            <parameter mode="IN" name="_day_id" type="integer"/>
            <parameter mode="IN" name="_tenant_id" type="uuid"/>
            <parameter mode="IN" name="_site_id" type="uuid"/>
            <parameter mode="IN" name="_parameter_id" type="uuid"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="sms_insert_daily_scraper_data(IN _scraper_id uuid, IN _day_id integer, IN _tenant_id uuid, IN _site_id uuid, IN _parameter_id uuid)" securityType="INVOKER" type="PROCEDURE">
         <comment/>
         <definition language="sql"><![CDATA[/** Select new data **/
    WITH filtered AS (
        SELECT
            id,
            time,
            ST_DistanceSphere(coord, LEAD(coord, 1) OVER (ORDER BY time)) AS distance,
            EXTRACT(EPOCH FROM (LEAD(time, 1) OVER (ORDER BY time) - time)) AS duration,
            dumpster_open,
            dozer_nearby,
            dozer_id
        FROM sms_teltonika_scraper_gps_data
        WHERE scraper_id = _scraper_id
            AND time > TO_DATE(_day_id::TEXT, 'YYYYMMDD')
            AND time < TO_DATE(_day_id::TEXT, 'YYYYMMDD') + 1
            AND tenant_id = _tenant_id
        ORDER BY time
    ),

    -- Format distance and duration and compute and format speed from computed distance and duration
    calculated AS (
        SELECT
            gps.id,
            gps.time,
            gps.coord,
            CASE
                WHEN filtered.distance IS NULL THEN 0.00
                ELSE ROUND((filtered.distance)::numeric, 2)
            END AS filtered_distance,
            CASE
                WHEN filtered.duration IS NULL THEN 0.00
                ELSE ROUND((filtered.duration)::numeric, 2)
            END AS filtered_duration,
            CASE
                WHEN filtered.distance IS NULL THEN 0.00
                ELSE ROUND((3.6 * (filtered.distance / filtered.duration))::numeric, 2)
            END AS filtered_speed,
            gps.ign,
            filtered.dumpster_open,
            filtered.dozer_nearby,
            filtered.dozer_id
        FROM sms_teltonika_scraper_gps_data AS gps
        JOIN filtered ON filtered.id = gps.id
        ORDER BY time
    ),

    dozer_nearby_prev_next AS (
        SELECT
            *,
            LAG(dozer_nearby, 1) OVER (ORDER BY time) AS prev1,
            LAG(dozer_nearby, 2) OVER (ORDER BY time) AS prev2,
            LEAD(dozer_nearby, 1) OVER (ORDER BY time) AS next1,
            LEAD(dozer_nearby, 2) OVER (ORDER BY time) AS next2
        FROM calculated
    ),

    dozer_nearby_gaps_filled AS (
        SELECT
            id,
            time,
            coord,
            filtered_distance,
            filtered_speed,
            filtered_duration,
            ign,
            dumpster_open,
            CASE
                WHEN prev1 IS TRUE AND next1 IS TRUE THEN TRUE
                WHEN prev1 IS TRUE AND next1 IS FALSE AND next2 IS TRUE THEN TRUE
                WHEN prev2 IS TRUE AND prev1 IS FALSE AND next1 IS TRUE THEN TRUE
                ELSE dozer_nearby
            END AS dozer_nearby,
            dozer_id
        FROM dozer_nearby_prev_next
        ORDER BY time
    ),

    -- Categorize records by move type
    typed AS (
    SELECT
            *,
            (
                SELECT sd.id
                FROM sms_shift_day AS sd
                LEFT JOIN sms_shift AS s ON s.id = sd.shift_id
                LEFT JOIN tenants AS t on t.id = _tenant_id
                WHERE dozer_nearby_gaps_filled.time AT TIME ZONE t.time_zone >= TO_TIMESTAMP(CONCAT(TO_DATE(_day_id::TEXT, 'YYYYMMDD'), ' ', sd.start_hour, ':', sd.start_minute, ':', 0), 'YYYY-MM-DD HH24:MI:SS') AT TIME ZONE t.time_zone
                AND dozer_nearby_gaps_filled.time AT TIME ZONE t.time_zone <= TO_TIMESTAMP(CONCAT(TO_DATE(_day_id::TEXT, 'YYYYMMDD'), ' ', sd.end_hour, ':', sd.end_minute, ':', 0), 'YYYY-MM-DD HH24:MI:SS') AT TIME ZONE t.time_zone
                AND SUBSTRING(REVERSE(sd.day_mask::BIT(7)::VARCHAR), EXTRACT(isodow from time)::INT, 1) = '1'
                AND
                (
                    (
                        s.valid_from <= TO_DATE(_day_id::TEXT, 'YYYYMMDD') AND
                        s.valid_to > TO_DATE(_day_id::TEXT, 'YYYYMMDD')
                    ) OR
                    (
                        s.valid_from <= TO_DATE(_day_id::TEXT, 'YYYYMMDD') AND
                        s.valid_to IS NULL
                    )
                )
                AND s.tenant_id = _tenant_id
                AND sd.tenant_id = _tenant_id
                AND s.site_id = _site_id
                LIMIT 1
            ) AS shift_day_id,
            (
                SELECT sd.name
                FROM sms_shift_day AS sd
                LEFT JOIN sms_shift AS s ON s.id = sd.shift_id
                LEFT JOIN tenants AS t on t.id = _tenant_id
                WHERE dozer_nearby_gaps_filled.time::timestamp AT TIME ZONE (SELECT current_setting('TIMEZONE')) AT TIME ZONE t.time_zone >= TO_TIMESTAMP(CONCAT(TO_DATE(_day_id::TEXT, 'YYYYMMDD'), ' ', sd.start_hour, ':', sd.start_minute, ':', 0), 'YYYY-MM-DD HH24:MI:SS')
                AND dozer_nearby_gaps_filled.time::timestamp AT TIME ZONE (SELECT current_setting('TIMEZONE')) AT TIME ZONE t.time_zone < TO_TIMESTAMP(CONCAT(TO_DATE(_day_id::TEXT, 'YYYYMMDD'), ' ', sd.end_hour, ':', sd.end_minute, ':', 0), 'YYYY-MM-DD HH24:MI:SS')
                AND SUBSTRING(REVERSE(sd.day_mask::BIT(7)::VARCHAR), EXTRACT(isodow from time)::INT, 1) = '1'
                AND
                (
                    (
                        s.valid_from <= TO_DATE(_day_id::TEXT, 'YYYYMMDD') AND
                        s.valid_to > TO_DATE(_day_id::TEXT, 'YYYYMMDD')
                    ) OR
                    (
                        s.valid_from <= TO_DATE(_day_id::TEXT, 'YYYYMMDD') AND
                        s.valid_to IS NULL
                    )
                )
                AND s.tenant_id = _tenant_id
                AND sd.tenant_id = _tenant_id
                AND s.site_id = _site_id
                LIMIT 1
            ) AS shift_day_name,
            CASE
                WHEN ign IS FALSE THEN 'engine_off'
                WHEN coord IS NULL THEN 'no_gps_data'
                WHEN dozer_nearby IS TRUE THEN 'loading'
                WHEN dumpster_open IS TRUE THEN 'dumpster_open'
                WHEN filtered_speed <= 1.0 THEN 'motionless'
                WHEN filtered_speed > 1.0 THEN 'travel'
                ELSE 'unknown'
            END AS type
        FROM dozer_nearby_gaps_filled
        ORDER BY time
    ),

    active_zones AS (
        SELECT *
        FROM sms_zone
        WHERE ((valid_from <= TO_DATE(_day_id::TEXT, 'YYYYMMDD') AND valid_to > TO_DATE(_day_id::TEXT, 'YYYYMMDD')) OR
	    (valid_from <= TO_DATE(_day_id::TEXT, 'YYYYMMDD') AND valid_to IS NULL)) AND deleted_at IS NULL
    ),

    -- Intersect move coordinates with fixed zones
    intersected AS (
        SELECT
            t.id,
            z.id AS zone_id
        FROM typed AS t, sms_zone AS z
        WHERE
        (
            (
                z.valid_from <= TO_DATE(_day_id::TEXT, 'YYYYMMDD') AND
                z.valid_to > TO_DATE(_day_id::TEXT, 'YYYYMMDD')
            ) OR
            (
                z.valid_from <= TO_DATE(_day_id::TEXT, 'YYYYMMDD') AND
                z.valid_to IS NULL
            )
        ) AND 
        z.deleted_at IS NULL AND
        z.tenant_id = _tenant_id AND
        z.site_id = _site_id AND
        ST_IsEmpty(ST_Intersection(t.coord, ST_SetSRID(z.polygon, 4326))) = false
    ),

    -- Partition zone-intersected moves
    intersected_partitioned AS (
        SELECT
            intersected.*,
            (ROW_NUMBER() OVER (ORDER BY id) - ROW_NUMBER() OVER (PARTITION BY id ORDER BY id)) AS numberer
        FROM intersected
    ),

    -- Rank partioned zone-intersected moves
    intersected_ranked AS (
        SELECT
            intersected_partitioned.*,
            ROW_NUMBER() OVER (PARTITION BY id, numberer ORDER by id) AS rank
        FROM intersected_partitioned
        ORDER BY id
    ),

    -- Filter ranked zone-intersected moves
    intersected_filtered AS (
        SELECT *
        FROM intersected_ranked
        WHERE rank = 1
    ),

    -- Intersect move coordinates with fixed zones
    zoned AS (
        SELECT
            t.*,
            i.zone_id
        FROM typed AS t
        LEFT JOIN intersected_filtered AS i ON t.id = i.id
    ),

    -- Partition records by row numberer
    partitioned AS (
        SELECT
            zoned.*,
            (ROW_NUMBER() OVER (ORDER BY time) - ROW_NUMBER() OVER (PARTITION BY type ORDER BY time)) AS numberer
        FROM zoned
    ),

    -- Aggregate duration and distance and calculate centroid and linestring from aggregated positions
    linestring_calculated AS (
        SELECT
            time,
            type,
            numberer,
            ROW_NUMBER() OVER (PARTITION BY type, numberer ORDER by time) AS rank,
            SUM(filtered_duration) OVER (PARTITION BY type, numberer ORDER BY time DESC) AS duration,
            SUM(filtered_distance) OVER (PARTITION BY type, numberer ORDER BY time DESC) AS distance,
            ST_MakeLine(coord) OVER (PARTITION BY type, numberer ORDER BY time) as linestring,
            ST_Centroid(ST_UNION(coord) OVER (PARTITION BY type, numberer ORDER BY time)) AS centroid,
            zone_id,
            dozer_id,
            shift_day_id,
            shift_day_name
        FROM partitioned
        ORDER BY time
    ),

    -- Filter last linestring or centroid if linestring is single point
    linestring_filtered AS (
        SELECT
            numberer,
            type,
            CASE
                WHEN ST_NumPoints(linestring) > 1 THEN linestring
                ELSE ST_Centroid(linestring)
            END AS geometry
        FROM linestring_calculated
        WHERE (numberer, rank, type) IN (SELECT numberer, MAX(rank) as rank, type FROM linestring_calculated GROUP BY type, numberer)
    ),

    -- Add geometry from linestring_filtered to linestring_calculated
    geometry_calculated AS (
        SELECT
            lc.*,
            lf.geometry
        FROM linestring_calculated AS lc
        JOIN linestring_filtered AS lf ON lc.numberer = lf.numberer AND lc.type = lf.type
    )

    /** Insert new data **/
    INSERT INTO sms_scraper_move(tenant_id, scraper_id, dozer_id, day_id, scraper_parameter_id, start_date, type, duration, distance, geometry, centroid, zone_id, shift_day_id, shift_day_name)

    SELECT
        _tenant_id AS tenant_id,
        _scraper_id AS scraper_id,
        dozer_id,
        _day_id AS day_id,
        _parameter_id AS scraper_parameter_id,
        time AS start_date,
        type,
        duration,
        distance,
        geometry,
        centroid,
        zone_id,
        shift_day_id,
        shift_day_name
    FROM geometry_calculated
    WHERE rank = 1
    ORDER BY start_date]]></definition>
         <parameters>
            <parameter mode="IN" name="_scraper_id" type="uuid"/>
            <parameter mode="IN" name="_day_id" type="integer"/>
            <parameter mode="IN" name="_tenant_id" type="uuid"/>
            <parameter mode="IN" name="_site_id" type="uuid"/>
            <parameter mode="IN" name="_parameter_id" type="uuid"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="sms_insert_daily_scraper_data_v2(IN _scraper_id uuid, IN _day_id integer, IN _tenant_id uuid, IN _site_id uuid, IN _parameter_id uuid)" securityType="INVOKER" type="PROCEDURE">
         <comment/>
         <definition language="sql"><![CDATA[/** Select new data **/
    WITH filtered AS (
        SELECT
            id,
            time,
            ST_DistanceSphere(coord, LEAD(coord, 1) OVER (ORDER BY time)) AS distance,
            EXTRACT(EPOCH FROM (LEAD(time, 1) OVER (ORDER BY time) - time)) AS duration,
            dumpster_open,
            dozer_nearby,
            dozer_id
        FROM sms_teltonika_scraper_gps_data
        WHERE scraper_id = _scraper_id
            AND time > TO_DATE(_day_id::TEXT, 'YYYYMMDD')
            AND time < TO_DATE(_day_id::TEXT, 'YYYYMMDD') + 1
            AND tenant_id = _tenant_id
        ORDER BY time
    ),

    -- Format distance and duration and compute and format speed from computed distance and duration
    calculated AS (
        SELECT
            gps.id,
            gps.time,
            gps.coord,
            CASE
                WHEN filtered.distance IS NULL THEN 0.00
                ELSE ROUND((filtered.distance)::numeric, 2)
            END AS filtered_distance,
            CASE
                WHEN filtered.duration IS NULL THEN 0.00
                ELSE ROUND((filtered.duration)::numeric, 2)
            END AS filtered_duration,
            CASE
                WHEN filtered.distance IS NULL THEN 0.00
                ELSE ROUND((3.6 * (filtered.distance / filtered.duration))::numeric, 2)
            END AS filtered_speed,
            gps.ign,
            filtered.dumpster_open,
            filtered.dozer_nearby,
            filtered.dozer_id
        FROM sms_teltonika_scraper_gps_data AS gps
        JOIN filtered ON filtered.id = gps.id
        ORDER BY time
    ),

    dozer_nearby_prev_next AS (
        SELECT
            *,
            LAG(dozer_nearby, 1) OVER (ORDER BY time) AS prev1,
            LAG(dozer_nearby, 2) OVER (ORDER BY time) AS prev2,
            LEAD(dozer_nearby, 1) OVER (ORDER BY time) AS next1,
            LEAD(dozer_nearby, 2) OVER (ORDER BY time) AS next2
        FROM calculated
    ),

    dozer_nearby_gaps_filled AS (
        SELECT
            id,
            time,
            coord,
            filtered_distance,
            filtered_speed,
            filtered_duration,
            ign,
            dumpster_open,
            CASE
                WHEN prev1 IS TRUE AND next1 IS TRUE THEN TRUE
                WHEN prev1 IS TRUE AND next1 IS FALSE AND next2 IS TRUE THEN TRUE
                WHEN prev2 IS TRUE AND prev1 IS FALSE AND next1 IS TRUE THEN TRUE
                ELSE dozer_nearby
            END AS dozer_nearby,
            dozer_id
        FROM dozer_nearby_prev_next
        ORDER BY time
    ),

    -- Categorize records by move type
    typed AS (
    SELECT
            *,
            (
                SELECT sd.id
                FROM sms_shift_day AS sd
                LEFT JOIN sms_shift AS s ON s.id = sd.shift_id
                LEFT JOIN tenants AS t on t.id = _tenant_id
                WHERE dozer_nearby_gaps_filled.time AT TIME ZONE t.time_zone >= TO_TIMESTAMP(CONCAT(TO_DATE(_day_id::TEXT, 'YYYYMMDD'), ' ', sd.start_hour, ':', sd.start_minute, ':', 0), 'YYYY-MM-DD HH24:MI:SS') AT TIME ZONE t.time_zone
                AND dozer_nearby_gaps_filled.time AT TIME ZONE t.time_zone <= TO_TIMESTAMP(CONCAT(TO_DATE(_day_id::TEXT, 'YYYYMMDD'), ' ', sd.end_hour, ':', sd.end_minute, ':', 0), 'YYYY-MM-DD HH24:MI:SS') AT TIME ZONE t.time_zone
                AND SUBSTRING(REVERSE(sd.day_mask::BIT(7)::VARCHAR), EXTRACT(isodow from time)::INT, 1) = '1'
                AND
                (
                    (
                        s.valid_from <= TO_DATE(_day_id::TEXT, 'YYYYMMDD') AND
                        s.valid_to > TO_DATE(_day_id::TEXT, 'YYYYMMDD')
                    ) OR
                    (
                        s.valid_from <= TO_DATE(_day_id::TEXT, 'YYYYMMDD') AND
                        s.valid_to IS NULL
                    )
                )
                AND s.tenant_id = _tenant_id
                AND sd.tenant_id = _tenant_id
                AND s.site_id = _site_id
                LIMIT 1
            ) AS shift_day_id,
            (
                SELECT sd.name
                FROM sms_shift_day AS sd
                LEFT JOIN sms_shift AS s ON s.id = sd.shift_id
                LEFT JOIN tenants AS t on t.id = _tenant_id
                WHERE dozer_nearby_gaps_filled.time::timestamp AT TIME ZONE (SELECT current_setting('TIMEZONE')) AT TIME ZONE t.time_zone >= TO_TIMESTAMP(CONCAT(TO_DATE(_day_id::TEXT, 'YYYYMMDD'), ' ', sd.start_hour, ':', sd.start_minute, ':', 0), 'YYYY-MM-DD HH24:MI:SS')
                AND dozer_nearby_gaps_filled.time::timestamp AT TIME ZONE (SELECT current_setting('TIMEZONE')) AT TIME ZONE t.time_zone < TO_TIMESTAMP(CONCAT(TO_DATE(_day_id::TEXT, 'YYYYMMDD'), ' ', sd.end_hour, ':', sd.end_minute, ':', 0), 'YYYY-MM-DD HH24:MI:SS')
                AND SUBSTRING(REVERSE(sd.day_mask::BIT(7)::VARCHAR), EXTRACT(isodow from time)::INT, 1) = '1'
                AND
                (
                    (
                        s.valid_from <= TO_DATE(_day_id::TEXT, 'YYYYMMDD') AND
                        s.valid_to > TO_DATE(_day_id::TEXT, 'YYYYMMDD')
                    ) OR
                    (
                        s.valid_from <= TO_DATE(_day_id::TEXT, 'YYYYMMDD') AND
                        s.valid_to IS NULL
                    )
                )
                AND s.tenant_id = _tenant_id
                AND sd.tenant_id = _tenant_id
                AND s.site_id = _site_id
                LIMIT 1
            ) AS shift_day_name,
            CASE
                WHEN ign IS FALSE THEN 'engine_off'
                WHEN coord IS NULL THEN 'no_gps_data'
                WHEN dozer_nearby IS TRUE THEN 'loading'
                WHEN dumpster_open IS TRUE THEN 'dumpster_open'
                WHEN filtered_speed <= 1.0 THEN 'motionless'
                WHEN filtered_speed > 1.0 THEN 'travel'
                ELSE 'unknown'
            END AS type
        FROM dozer_nearby_gaps_filled
        ORDER BY time
    ),

    active_zones AS (
        SELECT *
        FROM sms_zone
        WHERE ((valid_from <= TO_DATE(_day_id::TEXT, 'YYYYMMDD') AND valid_to > TO_DATE(_day_id::TEXT, 'YYYYMMDD')) OR
	    (valid_from <= TO_DATE(_day_id::TEXT, 'YYYYMMDD') AND valid_to IS NULL)) AND deleted_at IS NULL
    ),

    -- Intersect move coordinates with fixed zones
    intersected AS (
        SELECT
            t.id,
            z.id AS zone_id
        FROM typed AS t, sms_zone AS z
        WHERE
        (
            (
                z.valid_from <= TO_DATE(_day_id::TEXT, 'YYYYMMDD') AND
                z.valid_to > TO_DATE(_day_id::TEXT, 'YYYYMMDD')
            ) OR
            (
                z.valid_from <= TO_DATE(_day_id::TEXT, 'YYYYMMDD') AND
                z.valid_to IS NULL
            )
        ) AND
        z.deleted_at IS NULL AND
        z.tenant_id = _tenant_id AND
        z.site_id = _site_id AND
        ST_IsEmpty(ST_Intersection(t.coord, ST_SetSRID(z.polygon, 4326))) = false
    ),

    -- Partition zone-intersected moves
    intersected_partitioned AS (
        SELECT
            intersected.*,
            (ROW_NUMBER() OVER (ORDER BY id) - ROW_NUMBER() OVER (PARTITION BY id ORDER BY id)) AS numberer
        FROM intersected
    ),

    -- Rank partioned zone-intersected moves
    intersected_ranked AS (
        SELECT
            intersected_partitioned.*,
            ROW_NUMBER() OVER (PARTITION BY id, numberer ORDER by id) AS rank
        FROM intersected_partitioned
        ORDER BY id
    ),

    -- Filter ranked zone-intersected moves
    intersected_filtered AS (
        SELECT *
        FROM intersected_ranked
        WHERE rank = 1
    ),

    -- Intersect move coordinates with fixed zones
    zoned AS (
        SELECT
            t.*,
            i.zone_id
        FROM typed AS t
        LEFT JOIN intersected_filtered AS i ON t.id = i.id
    ),

    -- Partition records by row numberer
    partitioned AS (
        SELECT
            zoned.*,
            (ROW_NUMBER() OVER (ORDER BY time) - ROW_NUMBER() OVER (PARTITION BY type ORDER BY time)) AS numberer
        FROM zoned
    ),

    -- Aggregate duration and distance and calculate centroid and linestring from aggregated positions
    linestring_calculated AS (
        SELECT
            time,
            type,
            numberer,
            ROW_NUMBER() OVER (PARTITION BY type, numberer ORDER by time) AS rank,
            SUM(filtered_duration) OVER (PARTITION BY type, numberer ORDER BY time DESC) AS duration,
            SUM(filtered_distance) OVER (PARTITION BY type, numberer ORDER BY time DESC) AS distance,
            ST_MakeLine(coord) OVER (PARTITION BY type, numberer ORDER BY time) as linestring,
            ST_Centroid(ST_UNION(coord) OVER (PARTITION BY type, numberer ORDER BY time)) AS centroid,
            zone_id,
            dozer_id,
            shift_day_id,
            shift_day_name
        FROM partitioned
        ORDER BY time
    ),

    -- Filter last linestring or centroid if linestring is single point
    linestring_filtered AS (
        SELECT
            numberer,
            type,
            CASE
                WHEN ST_NumPoints(linestring) > 1 THEN linestring
                ELSE ST_Centroid(linestring)
            END AS geometry
        FROM linestring_calculated
        WHERE (numberer, rank, type) IN (SELECT numberer, MAX(rank) as rank, type FROM linestring_calculated GROUP BY type, numberer)
    ),

    -- Add geometry from linestring_filtered to linestring_calculated
    geometry_calculated AS (
        SELECT
            lc.*,
            lf.geometry
        FROM linestring_calculated AS lc
        JOIN linestring_filtered AS lf ON lc.numberer = lf.numberer AND lc.type = lf.type
    )

    /** Insert new data **/
    INSERT INTO sms_scraper_move(tenant_id, scraper_id, dozer_id, day_id, scraper_parameter_id, start_date, type, duration, distance, geometry, centroid, zone_id, shift_day_id, shift_day_name)

    SELECT
        _tenant_id AS tenant_id,
        _scraper_id AS scraper_id,
        dozer_id,
        _day_id AS day_id,
        _parameter_id AS scraper_parameter_id,
        time AS start_date,
        type,
        duration,
        distance,
        geometry,
        centroid,
        zone_id,
        shift_day_id,
        shift_day_name
    FROM geometry_calculated
    WHERE rank = 1
    ORDER BY start_date]]></definition>
         <parameters>
            <parameter mode="IN" name="_scraper_id" type="uuid"/>
            <parameter mode="IN" name="_day_id" type="integer"/>
            <parameter mode="IN" name="_tenant_id" type="uuid"/>
            <parameter mode="IN" name="_site_id" type="uuid"/>
            <parameter mode="IN" name="_parameter_id" type="uuid"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="sms_insert_daily_truck_data(IN _truck_serial text, IN _truck_id uuid, IN _day_id integer, IN _inclination_treshold integer, IN _tenant_id uuid, IN _site_id uuid, IN _parameter_id uuid)" securityType="INVOKER" type="PROCEDURE">
         <comment/>
         <definition language="sql"><![CDATA[/** Select new data **/
    WITH
    -- Filter raw tracker data and compute distance, time period and dumping status
    filtered AS (
        SELECT
            id,
            time,
            ST_DistanceSphere(coord, LEAD(coord, 1) OVER (ORDER BY time)) AS distance,
            EXTRACT(EPOCH FROM (LEAD(time, 1) OVER (ORDER BY time) - time)) AS duration,
            CASE
                WHEN dumpster_proximity > _inclination_treshold THEN FALSE
                ELSE TRUE
            END
        AS is_dumping
        FROM sms_teltonika_gps_data
        WHERE serial_number = _truck_serial::TEXT
            AND time >= TO_DATE(_day_id::TEXT, 'YYYYMMDD')
            AND time < TO_DATE(_day_id::TEXT, 'YYYYMMDD') + 1
            AND tenant_id = _tenant_id
        ORDER BY time
    ),

    -- Format distance and duration and compute and format speed from computed distance and duration
    calculated AS (
        SELECT
            gps.id,
            gps.time,
            gps.coord,
            CASE
                WHEN filtered.distance IS NULL THEN 0.00
                ELSE ROUND((filtered.distance)::numeric, 2)
            END AS filtered_distance,
            CASE
                WHEN filtered.duration IS NULL THEN 0.00
                ELSE ROUND((filtered.duration)::numeric, 2)
            END AS filtered_duration,
            CASE
                WHEN filtered.distance IS NULL THEN 0.00
                ELSE ROUND((3.6 * (filtered.distance / filtered.duration))::numeric, 2)
            END AS filtered_speed,
            gps.ign,
            filtered.is_dumping
        FROM sms_teltonika_gps_data AS gps
        JOIN filtered ON filtered.id = gps.id
    ),

    -- Categorize records by move type
    typed AS (
        SELECT
            *,
            (
                SELECT sd.id
                FROM sms_shift_day AS sd
                LEFT JOIN sms_shift AS s ON s.id = sd.shift_id
                LEFT JOIN tenants AS t on t.id = _tenant_id
                WHERE calculated.time::timestamp AT TIME ZONE (SELECT current_setting('TIMEZONE')) AT TIME ZONE t.time_zone >= TO_TIMESTAMP(CONCAT(TO_DATE(_day_id::TEXT, 'YYYYMMDD'), ' ', sd.start_hour, ':', sd.start_minute, ':', 0), 'YYYY-MM-DD HH24:MI:SS')
                AND calculated.time::timestamp AT TIME ZONE (SELECT current_setting('TIMEZONE')) AT TIME ZONE t.time_zone < TO_TIMESTAMP(CONCAT(TO_DATE(_day_id::TEXT, 'YYYYMMDD'), ' ', sd.end_hour, ':', sd.end_minute, ':', 0), 'YYYY-MM-DD HH24:MI:SS')
                AND SUBSTRING(REVERSE(sd.day_mask::BIT(7)::VARCHAR), EXTRACT(isodow from time)::INT, 1) = '1'
                AND
                (
                    (
                        s.valid_from <= TO_DATE(_day_id::TEXT, 'YYYYMMDD') AND
                        s.valid_to > TO_DATE(_day_id::TEXT, 'YYYYMMDD')
                    ) OR
                    (
                        s.valid_from <= TO_DATE(_day_id::TEXT, 'YYYYMMDD') AND
                        s.valid_to IS NULL
                    )
                )
                AND s.tenant_id = _tenant_id
                AND sd.tenant_id = _tenant_id
                AND s.site_id = _site_id
                LIMIT 1
            ) AS shift_day_id,
            (
                SELECT sd.name
                FROM sms_shift_day AS sd
                LEFT JOIN sms_shift AS s ON s.id = sd.shift_id
                LEFT JOIN tenants AS t on t.id = _tenant_id
                WHERE calculated.time::timestamp AT TIME ZONE (SELECT current_setting('TIMEZONE')) AT TIME ZONE t.time_zone >= TO_TIMESTAMP(CONCAT(TO_DATE(_day_id::TEXT, 'YYYYMMDD'), ' ', sd.start_hour, ':', sd.start_minute, ':', 0), 'YYYY-MM-DD HH24:MI:SS')
                AND calculated.time::timestamp AT TIME ZONE (SELECT current_setting('TIMEZONE')) AT TIME ZONE t.time_zone < TO_TIMESTAMP(CONCAT(TO_DATE(_day_id::TEXT, 'YYYYMMDD'), ' ', sd.end_hour, ':', sd.end_minute, ':', 0), 'YYYY-MM-DD HH24:MI:SS')
                AND SUBSTRING(REVERSE(sd.day_mask::BIT(7)::VARCHAR), EXTRACT(isodow from time)::INT, 1) = '1'
                AND
                (
                    (
                        s.valid_from <= TO_DATE(_day_id::TEXT, 'YYYYMMDD') AND
                        s.valid_to > TO_DATE(_day_id::TEXT, 'YYYYMMDD')
                    ) OR
                    (
                        s.valid_from <= TO_DATE(_day_id::TEXT, 'YYYYMMDD') AND
                        s.valid_to IS NULL
                    )
                )
                AND s.tenant_id = _tenant_id
                AND sd.tenant_id = _tenant_id
                AND s.site_id = _site_id
                LIMIT 1
            ) AS shift_day_name,
            CASE
                WHEN ign IS FALSE THEN 'engine_off'
                WHEN coord IS NULL THEN 'no_gps_data'
                WHEN is_dumping IS TRUE THEN 'dumping'
                WHEN filtered_speed <= 1.0 THEN 'motionless'
                WHEN filtered_speed <= 4.0 THEN 'low_speed'
                WHEN filtered_speed > 4.0 THEN 'normal_speed'
                ELSE 'unknown'
            END AS type
        FROM calculated
    ),

    -- Intersect move coordinates with fixed zones
    intersected AS (
        SELECT
            t.id,
            z.id AS zone_id
        FROM typed AS t, sms_zone AS z
        WHERE
        (
            (
                z.valid_from <= TO_DATE(_day_id::TEXT, 'YYYYMMDD') AND 
                z.valid_to > TO_DATE(_day_id::TEXT, 'YYYYMMDD')
            ) OR
            (
                z.valid_from <= TO_DATE(_day_id::TEXT, 'YYYYMMDD') AND
                z.valid_to IS NULL
            )
        ) AND z.deleted_at IS NULL AND
        z.tenant_id = _tenant_id AND
        z.site_id = _site_id AND
        ST_IsEmpty(ST_Intersection(t.coord, ST_SetSRID(z.polygon, 4326))) = false
    ),

    -- Partition zone-intersected moves
    intersected_partitioned AS (
        SELECT
            intersected.*,
            (ROW_NUMBER() OVER (ORDER BY id) - ROW_NUMBER() OVER (PARTITION BY id ORDER BY id)) AS numberer
        FROM intersected
    ),

    -- Rank partioned zone-intersected moves
    intersected_ranked AS (
        SELECT
            intersected_partitioned.*,
            ROW_NUMBER() OVER (PARTITION BY id, numberer ORDER by id) AS rank
        FROM intersected_partitioned
        ORDER BY id
    ),

    -- Filter ranked zone-intersected moves
    intersected_filtered AS (
        SELECT *
        FROM intersected_ranked
        WHERE rank = 1
    ),

    -- Intersect move coordinates with fixed zones
    zoned AS (
        SELECT
            t.*,
            i.zone_id
        FROM typed AS t
        LEFT JOIN intersected_filtered AS i ON t.id = i.id
    ),

    -- Partition records by row numberer
    partitioned AS (
        SELECT
            zoned.*,
            (ROW_NUMBER() OVER (ORDER BY time) - ROW_NUMBER() OVER (PARTITION BY type ORDER BY time)) AS numberer
        FROM zoned
    ),

    -- Aggregate duration and distance and calculate centroid and linestring from aggregated positions
    linestring_calculated AS (
        SELECT
            time,
            type,
            numberer,
            ROW_NUMBER() OVER (PARTITION BY type, numberer ORDER by time) AS rank,
            SUM(filtered_duration) OVER (PARTITION BY type, numberer ORDER BY time DESC) AS duration,
            SUM(filtered_distance) OVER (PARTITION BY type, numberer ORDER BY time DESC) AS distance,
            ST_MakeLine(coord) OVER (PARTITION BY type, numberer ORDER BY time) as linestring,
            ST_Centroid(ST_UNION(coord) OVER (PARTITION BY type, numberer ORDER BY time)) AS centroid,
            zone_id,
            shift_day_id,
            shift_day_name
        FROM partitioned
        ORDER BY time
    ),

    -- Filter last linestring or centroid if linestring is single point
    linestring_filtered AS (
        SELECT
            numberer,
            type,
            CASE
                WHEN ST_NumPoints(linestring) > 1 THEN linestring
                ELSE ST_Centroid(linestring)
            END AS geometry
        FROM linestring_calculated
        WHERE (numberer, rank, type) IN (SELECT numberer, MAX(rank) as rank, type FROM linestring_calculated GROUP BY type, numberer)
    ),

    -- Add geometry from linestring_filtered to linestring_calculated
    geometry_calculated AS (
        SELECT
            lc.*,
            lf.geometry
        FROM linestring_calculated AS lc
        JOIN linestring_filtered AS lf ON lc.numberer = lf.numberer AND lc.type = lf.type
    )

    /** Insert new data **/
    INSERT INTO sms_truck_move(tenant_id, truck_id, day_id, truck_parameter_id, start_date, type, duration, distance, geometry, centroid, zone_id, shift_day_id, shift_day_name)

    -- Finalize selection
    SELECT
        _tenant_id AS tenant_id,
        _truck_id AS truck_id,
        _day_id AS day_id,
        _parameter_id AS truck_parameter_id,
        time AS start_date,
        type,
        duration,
        distance,
        geometry,
        centroid,
        zone_id,
        shift_day_id,
        shift_day_name
    FROM geometry_calculated
    WHERE rank = 1]]></definition>
         <parameters>
            <parameter mode="IN" name="_truck_serial" type="text"/>
            <parameter mode="IN" name="_truck_id" type="uuid"/>
            <parameter mode="IN" name="_day_id" type="integer"/>
            <parameter mode="IN" name="_inclination_treshold" type="integer"/>
            <parameter mode="IN" name="_tenant_id" type="uuid"/>
            <parameter mode="IN" name="_site_id" type="uuid"/>
            <parameter mode="IN" name="_parameter_id" type="uuid"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="sms_insert_loader_daily_zone_data(IN _day_id integer, IN _tenant_id uuid)" securityType="INVOKER" type="PROCEDURE">
         <comment/>
         <definition language="sql"><![CDATA[WITH clusters AS (
        SELECT 
            id,
            centroid,
            type,
            ST_ClusterDBSCAN(centroid, eps := 0.0003, minPoints := 1) OVER (ORDER BY start_date) cluster_id
        FROM sms_loader_move
        WHERE type = 'motionless' AND day_id = _day_id AND tenant_id = _tenant_id
    ),

    move_clusters AS (
        SELECT
            slm.*,
            clusters.cluster_id
        FROM sms_loader_move AS slm
        LEFT JOIN clusters ON clusters.id = slm.id
    ),

    polygons AS (
        SELECT
            gen_random_uuid() AS id,
            ST_ConvexHull(ST_COLLECT(moves.centroid)) AS polygon
        FROM clusters
        JOIN sms_loader_move AS moves ON moves.id = clusters.id
        GROUP BY clusters.cluster_id
    ),

    zones AS (
        SELECT
            *,
            ST_CENTROID(polygon) AS center
        FROM polygons WHERE polygon IS NOT NULL

    )

    INSERT INTO sms_loader_daily_zone(id, tenant_id, day_id, name, polygon, center)
    SELECT
        id,
        _tenant_id,
        _day_id,
        CONCAT(_day_id::TEXT, '_daily_zone'),
        polygon,
        center
    FROM zones;

    UPDATE sms_loader_move
    SET start_daily_zone_id = intersections.zone_id
    FROM (SELECT 
            tm.id,
            tdz.id AS zone_id
        FROM sms_loader_daily_zone AS tdz, sms_loader_move AS tm
        WHERE ST_INTERSECTS(tdz.polygon, tm.centroid) = true
            AND tm.type = 'motionless'
            AND tm.day_id = _day_id AND tdz.day_id = _day_id
        ) AS intersections
    WHERE sms_loader_move.id = intersections.id;]]></definition>
         <parameters>
            <parameter mode="IN" name="_day_id" type="integer"/>
            <parameter mode="IN" name="_tenant_id" type="uuid"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="sms_insert_truck_daily_zone_data(IN _day_id integer, IN _tenant_id uuid, IN _eps numeric, IN _buffer_radius numeric)" securityType="INVOKER" type="PROCEDURE">
         <comment/>
         <definition language="sql"><![CDATA[WITH clusters AS (
        SELECT
            id,
            centroid,
            type,
            ST_ClusterDBSCAN(ST_Transform(centroid, 3857), eps := _eps, minPoints := 1) OVER (ORDER BY start_date) cluster_id
        FROM sms_truck_move
        WHERE (type = 'motionless' OR type = 'loading' OR type = 'dumping')
            AND day_id = _day_id
            AND tenant_id = _tenant_id
    ),

    geometries AS (
        SELECT
            gen_random_uuid() AS id,
            ST_ConvexHull(ST_COLLECT(moves.centroid)) AS geometry
        FROM clusters
        JOIN sms_truck_move AS moves ON moves.id = clusters.id
        GROUP BY clusters.cluster_id
    ),

    polygons AS (
        SELECT id,
        CASE
            WHEN ST_GeometryType(geometry) = 'ST_LineString' THEN ST_Buffer(geometry, _buffer_radius, 'endcap=round join=round')
            WHEN ST_GeometryType(geometry) = 'ST_Point' THEN ST_Buffer(geometry, _buffer_radius, 'quad_segs=8')
            ELSE geometry
        END AS polygon
        FROM geometries
    ),

    daily_zones AS (
        SELECT
            *,
            ST_CENTROID(polygon) AS center,
            _tenant_id AS tenant_id,
            _day_id AS day_id,
            CONCAT(_day_id::TEXT, '_daily_zone') AS name
        FROM polygons
    ),

    active_zones AS (
        SELECT *
        FROM sms_zone
        WHERE ((valid_from <= TO_DATE(_day_id::TEXT, 'YYYYMMDD') AND valid_to > TO_DATE(_day_id::TEXT, 'YYYYMMDD')) OR 
	    (valid_from <= TO_DATE(_day_id::TEXT, 'YYYYMMDD') AND valid_to IS NULL)) AND (deleted_at > TO_DATE(_day_id::TEXT, 'YYYYMMDD') OR deleted_at IS NULL)
    ),

    zone_intersections AS (
        SELECT
            dz.id AS daily_zone_id,
            z.id AS zone_id,
            ST_Area(ST_Intersection(dz.polygon, ST_SetSRID(z.polygon, 4326))) AS surface
        FROM daily_zones AS dz, active_zones AS z
        WHERE ST_IsEmpty(ST_Intersection(dz.polygon, ST_SetSRID(z.polygon, 4326))) = false
            AND dz.day_id = _day_id
            AND z.tenant_id = _tenant_id
            AND dz.tenant_id = _tenant_id
    ),

    filtered_zone_intersections AS (
        SELECT a.*
        FROM zone_intersections AS a
        INNER JOIN (
            SELECT zone_id, MAX(surface) AS surface
            FROM zone_intersections
            GROUP BY zone_id
        ) AS b on a.zone_id = b.zone_id AND a.surface = b.surface
    )

    INSERT INTO sms_truck_daily_zone(tenant_id, day_id, name, polygon, center, zone_id)
    SELECT
        dz.tenant_id,
        dz.day_id,
        dz.name,
        dz.polygon,
        dz.center,
        fzi.zone_id
    FROM daily_zones AS dz
    LEFT JOIN filtered_zone_intersections AS fzi ON dz.id = fzi.daily_zone_id;

    UPDATE sms_truck_move
    SET start_daily_zone_id = daily_intersections.daily_zone_id
    FROM (SELECT
            tm.id AS truck_move_id,
            tdz.id AS daily_zone_id
        FROM sms_truck_daily_zone AS tdz, sms_truck_move AS tm
        WHERE ST_INTERSECTS(tdz.polygon, tm.centroid) = true
            AND (tm.type = 'motionless' OR tm.type = 'loading' OR tm.type = 'dumping')
            AND tm.day_id = _day_id AND tdz.day_id = _day_id
            AND tm.tenant_id = _tenant_id AND tdz.tenant_id = _tenant_id
        ) AS daily_intersections
    WHERE sms_truck_move.id = daily_intersections.truck_move_id;]]></definition>
         <parameters>
            <parameter mode="IN" name="_day_id" type="integer"/>
            <parameter mode="IN" name="_tenant_id" type="uuid"/>
            <parameter mode="IN" name="_eps" type="numeric"/>
            <parameter mode="IN" name="_buffer_radius" type="numeric"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="sms_kpi_insert_computed_site_data(IN _from_day_id integer, IN _to_day_id integer, IN _tenant_id uuid)" securityType="INVOKER" type="PROCEDURE">
         <comment/>
         <definition language="sql"><![CDATA[DELETE 
	FROM sms_kpi_sites
	WHERE tenant_id = _tenant_id AND day_id >= _from_day_id AND day_id <= _to_day_id;

	WITH 
	days AS (
		SELECT to_char(ref_date, 'YYYYMMDD')::INT AS day_id
		FROM generate_series(TO_DATE(_from_day_id::TEXT, 'YYYYMMDD'), TO_DATE(_to_day_id::TEXT, 'YYYYMMDD'), '1 day') AS ref_date
	)
	,machine_site AS (
		SELECT sm.id
			,sm.tenant_id
			,sm."name" AS NAME
			,sm.serial_number
			,sm."type"
			,smsa.site_id
			,ss."name" AS site_name
			,d.day_id
		FROM sms_machine sm
		LEFT JOIN sms_machine_site_association smsa ON sm.id = smsa.machine_id
			AND sm.tenant_id = smsa.tenant_id
		INNER JOIN days d ON d.day_id >= to_char(smsa.valid_from::TIMESTAMP, 'YYYYMMDD')::INT
			AND d.day_id <= to_char(coalesce(smsa.valid_to, now())::TIMESTAMP, 'YYYYMMDD')::INT
		INNER JOIN sms_site ss ON smsa.site_id = ss.id
		WHERE sm.deleted_at IS NULL
			AND smsa.deleted_at IS NULL 
			AND ss.deleted_at IS NULL
			AND sm.tenant_id = _tenant_id
	)
	,machine_cycles AS (
		SELECT stc.day_id
			,stc.tenant_id
			,stc.truck_id AS machine_id
			,count(stc.id) AS cycles
		FROM sms_truck_cycle stc
		INNER JOIN days d ON d.day_id::INT >= stc.day_id
			AND d.day_id::INT <= stc.day_id
		WHERE stc.unknown_load = false
			AND stc.tenant_id = _tenant_id
		GROUP BY stc.day_id
			,stc.tenant_id
			,stc.truck_id
		UNION
		SELECT ssc.day_id
			,ssc.tenant_id
			,ssc.scraper_id AS machine_id
			,count(ssc.id) AS cycles
		FROM sms_scraper_cycle ssc
		INNER JOIN days d ON d.day_id::INT >= ssc.day_id
			AND d.day_id::INT <= ssc.day_id
		WHERE ssc.unknown_load = false
			AND ssc.unknown_dump = false
			AND ssc.tenant_id = _tenant_id
		GROUP BY ssc.day_id
			,ssc.tenant_id
			,ssc.scraper_id
	)
	,machine_parameters AS (
		SELECT sm.id AS machine_id
			,sm.tenant_id
			,CASE 
				WHEN sm."type" = 1
					OR sm."type" = 7
					THEN truck_parameters.day_id
				WHEN sm."type" = 2
					THEN loader_parameters.day_id
				WHEN sm."type" = 3
					THEN dozer_parameters.day_id
				WHEN sm."type" = 6
					THEN scraper_parameters.day_id
				ELSE other_parameters.day_id
				END AS day_id
			,CASE 
				WHEN sm."type" = 1
					OR sm."type" = 7
					THEN truck_parameters.cost_per_hour
				WHEN sm."type" = 2
					THEN loader_parameters.cost_per_hour
				WHEN sm."type" = 3
					THEN dozer_parameters.cost_per_hour
				WHEN sm."type" = 6
					THEN scraper_parameters.cost_per_hour
				ELSE other_parameters.cost_per_hour
				END AS cost_per_hour
			,CASE 
				WHEN sm."type" = 1
					OR sm."type" = 7
					THEN truck_parameters.theoretical_consumption
				WHEN sm."type" = 2
					THEN loader_parameters.theoretical_consumption
				WHEN sm."type" = 3
					THEN dozer_parameters.theoretical_consumption
				WHEN sm."type" = 6
					THEN scraper_parameters.theoretical_consumption
				ELSE other_parameters.theoretical_consumption
				END AS theoretical_consumption
			,CASE 
				WHEN sm."type" = 1
					OR sm."type" = 7
					THEN truck_parameters.kg_co2_per_liter
				WHEN sm."type" = 2
					THEN loader_parameters.kg_co2_per_liter
				WHEN sm."type" = 3
					THEN dozer_parameters.kg_co2_per_liter
				WHEN sm."type" = 6
					THEN scraper_parameters.kg_co2_per_liter
				ELSE other_parameters.kg_co2_per_liter
				END AS kg_co2_per_liter
			,CASE 
				WHEN sm."type" = 1
					OR sm."type" = 7
					THEN truck_parameters.tonne
				WHEN sm."type" = 6
					THEN scraper_parameters.tonne
				ELSE NULL
				END AS tonne
			,CASE 
				WHEN sm."type" = 1
					OR sm."type" = 7
					THEN truck_parameters.volume
				WHEN sm."type" = 6
					THEN scraper_parameters.volume
				ELSE NULL
				END AS volume
		FROM sms_machine sm
		LEFT JOIN (
			SELECT stp.*
				,d.day_id
			FROM sms_truck_parameters stp
			INNER JOIN days d ON d.day_id >= to_char(stp.valid_from::TIMESTAMP, 'YYYYMMDD')::INT
				AND d.day_id <= to_char(coalesce(stp.valid_to, now())::TIMESTAMP, 'YYYYMMDD')::INT
			WHERE stp.deleted_at IS NULL
			) truck_parameters ON truck_parameters.machine_id = sm.id
			AND truck_parameters.tenant_id = sm.tenant_id
		LEFT JOIN (
			SELECT slp.*
				,d.day_id
			FROM sms_loader_parameters slp
			INNER JOIN days d ON d.day_id >= to_char(slp.valid_from::TIMESTAMP, 'YYYYMMDD')::INT
				AND d.day_id <= to_char(coalesce(slp.valid_to, now())::TIMESTAMP, 'YYYYMMDD')::INT
			WHERE slp.deleted_at IS NULL
			) loader_parameters ON loader_parameters.machine_id = sm.id
			AND loader_parameters.tenant_id = sm.tenant_id
		LEFT JOIN (
			SELECT ssp.*
				,d.day_id
			FROM sms_scraper_parameters ssp
			INNER JOIN days d ON d.day_id >= to_char(ssp.valid_from::TIMESTAMP, 'YYYYMMDD')::INT
				AND d.day_id <= to_char(coalesce(ssp.valid_to, now())::TIMESTAMP, 'YYYYMMDD')::INT
			WHERE ssp.deleted_at IS NULL
			) scraper_parameters ON scraper_parameters.machine_id = sm.id
			AND scraper_parameters.tenant_id = sm.tenant_id
		LEFT JOIN (
			SELECT sop.*
				,d.day_id
			FROM sms_other_parameters sop
			INNER JOIN days d ON d.day_id >= to_char(sop.valid_from::TIMESTAMP, 'YYYYMMDD')::INT
				AND d.day_id <= to_char(coalesce(sop.valid_to, now())::TIMESTAMP, 'YYYYMMDD')::INT
			WHERE sop.deleted_at IS NULL
			) other_parameters ON other_parameters.machine_id = sm.id
			AND other_parameters.tenant_id = sm.tenant_id
		LEFT JOIN (
			SELECT sdp.*
				,d.day_id
			FROM sms_dozer_parameters sdp
			INNER JOIN days d ON d.day_id >= to_char(sdp.valid_from::TIMESTAMP, 'YYYYMMDD')::INT
				AND d.day_id <= to_char(coalesce(sdp.valid_to, now())::TIMESTAMP, 'YYYYMMDD')::INT
			WHERE sdp.deleted_at IS NULL
			) dozer_parameters ON dozer_parameters.machine_id = sm.id
			AND dozer_parameters.tenant_id = sm.tenant_id
		WHERE sm.deleted_at IS NULL AND sm.tenant_id = _tenant_id
	)
	,machine_gps_data AS (
		SELECT stgd.id AS id
			,stgd.TIME
			,to_char(stgd.TIME, 'YYYYMMDD')::INT AS day_id
			,stgd.serial_number AS tracker
			,stgd.tenant_id AS tenant_id
			,smtt.machine_id AS machine_id
			,stci.delta_time
			,stci.delta_distance
		FROM sms_teltonika_gps_data stgd
		LEFT JOIN sms_tgd_computed_info stci ON stgd.id = stci.id
		LEFT JOIN sms_machine_teltonika_tracker smtt ON stgd."time" >= smtt.valid_from
			AND stgd."time" < coalesce(smtt.valid_to, now())
			AND stgd.serial_number = smtt.tracker_serial
			AND stgd.tenant_id = smtt.tenant_id
		INNER JOIN sms_machine sm ON smtt.machine_id = sm.id
		WHERE stgd.TIME >= TO_TIMESTAMP(CONCAT(TO_DATE(_from_day_id::TEXT, 'YYYYMMDD'), ' 00:00:00'), 'YYYY-MM-DD HH24:MI:SS')
			AND stgd.TIME <= TO_TIMESTAMP(CONCAT(TO_DATE(_to_day_id::TEXT, 'YYYYMMDD'), ' 23:59:59'), 'YYYY-MM-DD HH24:MI:SS')
			AND smtt.deleted_at IS NULL
			AND sm.deleted_at IS NULL
			AND stgd.tenant_id = _tenant_id
			AND stgd.ign = true
	)
	,computed_machine_gps_data AS (
	 	SELECT count(mgd.id) AS gpscount
			,mgd.tracker
			,mgd.tenant_id
			,mgd.day_id
			,mgd.machine_id
			,sum(mgd.delta_time) AS computed_duration
			,sum(mgd.delta_distance) AS computed_distance
		FROM machine_gps_data mgd
		WHERE mgd.day_id IS NOT NULL
		GROUP BY mgd.tracker
			,mgd.tenant_id
			,mgd.day_id
			,mgd.machine_id
	)
	,machine_site_gps AS (
		SELECT coalesce(ms.id, cmgd.machine_id) AS id
			,coalesce(ms.day_id, cmgd.day_id) AS day_id
			,coalesce(ms.tenant_id, cmgd.tenant_id) AS tenant_id
			,ms.site_id AS site_id
			,ms.site_name as site_name
			,CASE 
				WHEN cmgd.gpscount > 0
					THEN 1
				ELSE 0
				END AS active
			,cmgd.machine_id
			,ms.serial_number
			,ms."name"
			,ms."type"
			,cmgd.computed_duration
			,cmgd.computed_distance
		FROM machine_site ms
		FULL JOIN computed_machine_gps_data cmgd ON ms.id = cmgd.machine_id
			AND ms.day_id = cmgd.day_id
			AND ms.tenant_id = cmgd.tenant_id
			--WHERE ms.day_id IS NOT NULL
	)
	,machine_statistic AS (
		SELECT msg.active AS machine_active
			,msg.day_id
			,msg.tenant_id
			,msg.site_id
			,msg.site_name as site_name
			,msg.id AS machine_id
			,msg."type" AS machine_type
			,msg."name" AS machine_name
			,sum(msg.computed_duration) AS computed_duration
			,sum(msg.computed_distance) AS computed_distance
			,mp.cost_per_hour
			,mp.theoretical_consumption
			,mp.kg_co2_per_liter
			,mp.volume
			,mc.cycles
		FROM machine_site_gps msg 
		LEFT JOIN machine_parameters mp ON msg.day_id = mp.day_id
			AND msg.id = mp.machine_id
		LEFT JOIN machine_cycles mc ON msg.day_id = mc.day_id
			AND msg.id = mc.machine_id
		WHERE msg.day_id IS NOT NULL
		GROUP BY msg.id
			,msg.tenant_id
			,msg.site_id
			,msg.site_name
			,msg.active
			,msg."name"
			,msg."type"
			,msg.day_id
			,mp.cost_per_hour
			,mp.theoretical_consumption
			,mp.kg_co2_per_liter
			,mp.volume
			,mc.cycles
		ORDER BY msg.day_id
	)
		
	INSERT INTO sms_kpi_sites (day_id, tenant_id, site_id, site_name, machines_count, machines_count_active, machines_volume, machines_fuel_used, machines_co2_equivalent, machines_hours_operating, machines_cost)
		
	SELECT ms.day_id
		,ms.tenant_id
		,ms.site_id
		,ms.site_name
		,count(ms.machine_id) AS machines_count
		,sum(ms.machine_active) AS machines_count_active
		,sum(ms.volume * ms.cycles) AS machines_volume
		,sum(ms.computed_duration / 3600 * ms.theoretical_consumption) AS machines_fuel_used
		,sum(ms.computed_duration / 3600 * ms.theoretical_consumption * ms.kg_co2_per_liter) AS machines_co2_equivalent
		,sum(ms.computed_duration / 3600) AS machines_hours_operating
		,sum(ms.computed_duration / 3600 * ms.cost_per_hour) AS machines_cost
	FROM machine_statistic ms
	GROUP BY ms.day_id
		,ms.tenant_id
		,ms.site_id
		,ms.site_name
	ORDER BY ms.day_id;]]></definition>
         <parameters>
            <parameter mode="IN" name="_from_day_id" type="integer"/>
            <parameter mode="IN" name="_to_day_id" type="integer"/>
            <parameter mode="IN" name="_tenant_id" type="uuid"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="sms_kpi_insert_machine_cycle_data(IN _from_day_id integer, IN _to_day_id integer, IN _tenant_id uuid)" securityType="INVOKER" type="PROCEDURE">
         <comment/>
         <definition language="sql"><![CDATA[DELETE 
	FROM sms_kpi_machines_cycles
	WHERE tenant_id = _tenant_id AND day_id >= _from_day_id AND day_id <= _to_day_id;

	WITH 
	all_cycles AS (
		SELECT DISTINCT stc.day_id
			,stc.tenant_id
			,smsa.site_id AS site_id
			,ss.NAME AS site_name
			,stc.shift_day_id AS shift_id
			,stc.shift_day_name AS shift_name
			,stc.cycle_day_id
			,stc.start_date AS cycle_date_start
			,stc.local_hour AS cycle_hour_start
			,stc.total_cycle_time AS cycle_time
			,stc.truck_id AS dumper_id
			,smd."type" AS dumper_type_id
			,smtd."name" AS dumper_type
			,smd."name" AS dumper_name
			,stc.loader_id AS loader_id
			,sml."type" AS loader_type_id
			,smtl."name" AS loader_type
			,sml."name" AS loader_name
			,stc.dump_zone_id AS zone_dumping_id
			,szd.NAME AS zone_dumping_name
			,stc.load_zone_id AS zone_loading_id
			,szl.NAME AS zone_loading_name
			,stc.distance_loaded + stc.distance_empty AS dumper_distance
			,stc.distance_loaded AS dumper_distance_loaded
			,stc.distance_empty AS dumper_distance_empty
			,(stc.travel_time_empty + stc.travel_time_loaded + stc.waiting_on_track_empty + stc.waiting_on_track_loaded + stc.loading_time + stc.dumping_time + stc.waiting_for_loading_time + stc.waiting_for_dumping_time) AS dumper_time_operating
			,stc.travel_time_empty AS dumper_time_travelling_empty
			,stc.travel_time_loaded AS dumper_time_travelling_loaded
			,stc.waiting_on_track_empty AS dumper_time_waiting_empty
			,stc.waiting_on_track_loaded AS dumper_time_waiting_loaded
			,stc.stopped_engine_off_time AS dumper_time_engine_off
			,stc.loading_time AS dumper_time_loading
			,stc.dumping_time AS dumper_time_dumping
			,stc.waiting_for_loading_time AS dumper_time_waiting_loading
			,stc.waiting_for_dumping_time AS dumper_time_waiting_dumping
			,stp.volume AS dumper_volume_theoretical
			,stc.unknown_load AS dumper_operation_loader_unknown
		FROM sms_truck_cycle stc
		LEFT JOIN sms_machine smd ON stc.truck_id = smd.id
			AND stc.tenant_id = smd.tenant_id
		LEFT JOIN sms_machine_type smtd ON smd."type" = smtd.id
			AND smd.tenant_id = smtd.tenant_id
		LEFT JOIN sms_machine sml ON stc.loader_id = sml.id
			AND stc.tenant_id = sml.tenant_id
		LEFT JOIN sms_machine_type smtl ON sml."type" = smtl.id
			AND sml.tenant_id = smtl.tenant_id
		LEFT JOIN sms_zone szd ON stc.dump_zone_id = szd.id
			AND stc.tenant_id = szd.tenant_id
		LEFT JOIN sms_zone szl ON stc.load_zone_id = szl.id
			AND stc.tenant_id = szl.tenant_id
		LEFT JOIN sms_truck_parameters stp ON stc.truck_parameter_id = stp.id
			AND stc.tenant_id = stp.tenant_id
		LEFT JOIN sms_machine_site_association smsa ON stc.truck_id = smsa.machine_id
			AND stc.tenant_id = smsa.tenant_id
			AND stc.day_id >= to_char(smsa.valid_from::TIMESTAMP, 'YYYYMMDD')::INT
			AND stc.day_id <= to_char(coalesce(smsa.valid_to, now())::TIMESTAMP, 'YYYYMMDD')::INT
			AND smsa.deleted_at IS NULL
		LEFT JOIN sms_site ss ON smsa.site_id = ss.id
			AND smsa.tenant_id = ss.tenant_id
			AND ss.deleted_at IS NULL
		WHERE stc.day_id >= _from_day_id AND stc.day_id <= _to_day_id
		
		UNION
		
		SELECT DISTINCT ssc.day_id
			,ssc.tenant_id
			,smsa.site_id AS site_id
			,ss.NAME AS site_name
			,ssc.shift_day_id AS shift_id
			,ssc.shift_day_name AS shift_name
			,ssc.cycle_day_id
			,ssc.start_date AS cycle_date_start
			,ssc.local_hour AS cycle_hour_start
			,ssc.total_cycle_time AS cycle_time
			,ssc.scraper_id AS dumper_id
			,smd."type" AS dumper_type_id
			,smtd."name" AS dumper_type
			,smd."name" AS dumper_name
			,ssc.dozer_id AS loader_id
			,sml."type" AS loader_type_id
			,smtl."name" AS loader_type
			,sml."name" AS loader_name
			,ssc.dump_zone_id AS zone_dumping_id
			,szd.NAME AS zone_dumping_name
			,ssc.load_zone_id AS zone_loading_id
			,szl.NAME AS zone_loading_name
			,ssc.distance_loaded + ssc.distance_empty AS dumper_distance
			,ssc.distance_loaded AS dumper_distance_loaded
			,ssc.distance_empty AS dumper_distance_empty
			,(ssc.travel_time_empty + ssc.travel_time_loaded + ssc.waiting_on_track_empty + ssc.waiting_on_track_loaded + ssc.loading_time + ssc.dumping_time + ssc.waiting_for_loading_time + ssc.waiting_for_dumping_time) AS dumper_time_operating
			,ssc.travel_time_empty AS dumper_time_travelling_empty
			,ssc.travel_time_loaded AS dumper_time_travelling_loaded
			,ssc.waiting_on_track_empty AS dumper_time_waiting_empty
			,ssc.waiting_on_track_loaded AS dumper_time_waiting_loaded
			,ssc.stopped_engine_off_time AS dumper_time_engine_off
			,ssc.loading_time AS dumper_time_loading
			,ssc.dumping_time AS dumper_time_dumping
			,ssc.waiting_for_loading_time AS dumper_time_waiting_loading
			,ssc.waiting_for_dumping_time AS dumper_time_waiting_dumping
			,ssp.volume AS dumper_volume_theoretical
			,ssc.unknown_load AS dumper_operation_loader_unknown
		FROM sms_scraper_cycle ssc
		LEFT JOIN sms_machine smd ON ssc.scraper_id = smd.id
			AND ssc.tenant_id = smd.tenant_id
		LEFT JOIN sms_machine_type smtd ON smd."type" = smtd.id
			AND smd.tenant_id = smtd.tenant_id
		LEFT JOIN sms_machine sml ON ssc.dozer_id = sml.id
			AND ssc.tenant_id = sml.tenant_id
		LEFT JOIN sms_machine_type smtl ON sml."type" = smtl.id
			AND sml.tenant_id = smtl.tenant_id
		LEFT JOIN sms_zone szd ON ssc.dump_zone_id = szd.id
			AND ssc.tenant_id = szd.tenant_id
		LEFT JOIN sms_zone szl ON ssc.load_zone_id = szl.id
			AND ssc.tenant_id = szl.tenant_id
		LEFT JOIN sms_scraper_parameters ssp ON ssc.scraper_parameter_id = ssp.id
			AND ssc.tenant_id = ssp.tenant_id
		LEFT JOIN sms_machine_site_association smsa ON ssc.scraper_id = smsa.machine_id
			AND ssc.tenant_id = smsa.tenant_id
			AND ssc.day_id >= to_char(smsa.valid_from::TIMESTAMP, 'YYYYMMDD')::INT
			AND ssc.day_id <= to_char(coalesce(smsa.valid_to, now())::TIMESTAMP, 'YYYYMMDD')::INT
			AND smsa.deleted_at IS NULL
		LEFT JOIN sms_site ss ON smsa.site_id = ss.id
			AND smsa.tenant_id = ss.tenant_id
			AND ss.deleted_at IS NULL
		WHERE ssc.day_id >= _from_day_id AND ssc.day_id <= _to_day_id
	)
		
	INSERT INTO sms_kpi_machines_cycles (day_id, tenant_id, site_id, site_name, shift_id, shift_name, 
		cycle_day_id, cycle_date_start, cycle_hour_start, cycle_time, dumper_id, dumper_type_id, 
		dumper_type, dumper_name, loader_id, loader_type_id, loader_type, loader_name, zone_loading_id, 
		zone_loading_name, zone_dumping_id, zone_dumping_name, dumper_distance, dumper_distance_empty, 
		dumper_distance_loaded, dumper_time_operating, dumper_time_travelling_empty, 
		dumper_time_travelling_loaded, dumper_time_waiting_empty, dumper_time_waiting_loaded, 
		dumper_time_engine_off, dumper_time_loading, dumper_time_dumping, dumper_time_waiting_loading, 
		dumper_time_waiting_dumping, dumper_volume_theoretical, dumper_operation_loader_unknown)
		
	SELECT day_id, tenant_id, site_id, site_name, shift_id, shift_name, cycle_day_id, cycle_date_start, 
		cycle_hour_start, cycle_time, dumper_id, dumper_type_id, dumper_type, dumper_name, loader_id, 
		loader_type_id, loader_type, loader_name, zone_loading_id, zone_loading_name, zone_dumping_id, 
		zone_dumping_name, dumper_distance, dumper_distance_empty, dumper_distance_loaded, 
		dumper_time_operating, dumper_time_travelling_empty, dumper_time_travelling_loaded, 
		dumper_time_waiting_empty, dumper_time_waiting_loaded, dumper_time_engine_off, dumper_time_loading, 
		dumper_time_dumping, dumper_time_waiting_loading, dumper_time_waiting_dumping, 
		dumper_volume_theoretical, dumper_operation_loader_unknown
	FROM all_cycles
	ORDER BY day_id;]]></definition>
         <parameters>
            <parameter mode="IN" name="_from_day_id" type="integer"/>
            <parameter mode="IN" name="_to_day_id" type="integer"/>
            <parameter mode="IN" name="_tenant_id" type="uuid"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="sms_kpi_insert_site_machine_data(IN _from_day_id integer, IN _to_day_id integer, IN _tenant_id uuid)" securityType="INVOKER" type="PROCEDURE">
         <comment/>
         <definition language="sql"><![CDATA[DELETE 
	FROM sms_kpi_sites_machines
	WHERE tenant_id = _tenant_id AND day_id >= _from_day_id AND day_id <= _to_day_id;

	WITH days AS (
		SELECT to_char(ref_date, 'YYYYMMDD')::INT AS day_id
		FROM generate_series(TO_DATE(_from_day_id::TEXT, 'YYYYMMDD'), TO_DATE(_to_day_id::TEXT, 'YYYYMMDD'), '1 day') AS ref_date
	)
	,machine_site AS (
		SELECT sm.id
			,sm.tenant_id
			,smsa.site_id
			,ss."name" AS site_name
			,d.day_id
		FROM sms_machine sm
		LEFT JOIN sms_machine_site_association smsa ON sm.id = smsa.machine_id
			AND sm.tenant_id = smsa.tenant_id
		INNER JOIN days d ON d.day_id >= to_char(smsa.valid_from::TIMESTAMP, 'YYYYMMDD')::INT
			AND d.day_id <= to_char(coalesce(smsa.valid_to, now())::TIMESTAMP, 'YYYYMMDD')::INT
		INNER JOIN sms_site ss ON smsa.site_id = ss.id
		WHERE sm.deleted_at IS NULL
			AND smsa.deleted_at IS NULL
			AND ss.deleted_at IS NULL
			AND sm.tenant_id = _tenant_id
	)
	,machine_parameters AS (
		SELECT sm.id AS machine_id
			,sm.tenant_id
			,CASE 
				WHEN sm."type" = 1
					OR sm."type" = 7
					THEN truck_parameters.day_id
				WHEN sm."type" = 2
					THEN loader_parameters.day_id
				WHEN sm."type" = 3
					THEN dozer_parameters.day_id
				WHEN sm."type" = 6
					THEN scraper_parameters.day_id
				ELSE other_parameters.day_id
				END AS day_id
			,CASE 
				WHEN sm."type" = 1
					OR sm."type" = 7
					THEN truck_parameters.cost_per_hour
				WHEN sm."type" = 2
					THEN loader_parameters.cost_per_hour
				WHEN sm."type" = 3
					THEN dozer_parameters.cost_per_hour
				WHEN sm."type" = 6
					THEN scraper_parameters.cost_per_hour
				ELSE other_parameters.cost_per_hour
				END AS cost_per_hour
			,CASE 
				WHEN sm."type" = 1
					OR sm."type" = 7
					THEN truck_parameters.theoretical_consumption
				WHEN sm."type" = 2
					THEN loader_parameters.theoretical_consumption
				WHEN sm."type" = 3
					THEN dozer_parameters.theoretical_consumption
				WHEN sm."type" = 6
					THEN scraper_parameters.theoretical_consumption
				ELSE other_parameters.theoretical_consumption
				END AS theoretical_consumption
			,CASE 
				WHEN sm."type" = 1
					OR sm."type" = 7
					THEN truck_parameters.kg_co2_per_liter
				WHEN sm."type" = 2
					THEN loader_parameters.kg_co2_per_liter
				WHEN sm."type" = 3
					THEN dozer_parameters.kg_co2_per_liter
				WHEN sm."type" = 6
					THEN scraper_parameters.kg_co2_per_liter
				ELSE other_parameters.kg_co2_per_liter
				END AS kg_co2_per_liter
			,CASE 
				WHEN sm."type" = 1
					OR sm."type" = 7
					THEN truck_parameters.tonne
				WHEN sm."type" = 6
					THEN scraper_parameters.tonne
				ELSE NULL
				END AS tonne
			,CASE 
				WHEN sm."type" = 1
					OR sm."type" = 7
					THEN truck_parameters.volume
				WHEN sm."type" = 6
					THEN scraper_parameters.volume
				ELSE NULL
				END AS volume
		FROM sms_machine sm
		LEFT JOIN (
			SELECT stp.*
				,d.day_id
			FROM sms_truck_parameters stp
			INNER JOIN days d ON d.day_id >= to_char(stp.valid_from::TIMESTAMP, 'YYYYMMDD')::INT
				AND d.day_id <= to_char(coalesce(stp.valid_to, now())::TIMESTAMP, 'YYYYMMDD')::INT
			WHERE stp.deleted_at IS NULL
			) truck_parameters ON truck_parameters.machine_id = sm.id
			AND truck_parameters.tenant_id = sm.tenant_id
		LEFT JOIN (
			SELECT slp.*
				,d.day_id
			FROM sms_loader_parameters slp
			INNER JOIN days d ON d.day_id >= to_char(slp.valid_from::TIMESTAMP, 'YYYYMMDD')::INT
				AND d.day_id <= to_char(coalesce(slp.valid_to, now())::TIMESTAMP, 'YYYYMMDD')::INT
			WHERE slp.deleted_at IS NULL
			) loader_parameters ON loader_parameters.machine_id = sm.id
			AND loader_parameters.tenant_id = sm.tenant_id
		LEFT JOIN (
			SELECT ssp.*
				,d.day_id
			FROM sms_scraper_parameters ssp
			INNER JOIN days d ON d.day_id >= to_char(ssp.valid_from::TIMESTAMP, 'YYYYMMDD')::INT
				AND d.day_id <= to_char(coalesce(ssp.valid_to, now())::TIMESTAMP, 'YYYYMMDD')::INT
			WHERE ssp.deleted_at IS NULL
			) scraper_parameters ON scraper_parameters.machine_id = sm.id
			AND scraper_parameters.tenant_id = sm.tenant_id
		LEFT JOIN (
			SELECT sop.*
				,d.day_id
			FROM sms_other_parameters sop
			INNER JOIN days d ON d.day_id >= to_char(sop.valid_from::TIMESTAMP, 'YYYYMMDD')::INT
				AND d.day_id <= to_char(coalesce(sop.valid_to, now())::TIMESTAMP, 'YYYYMMDD')::INT
			WHERE sop.deleted_at IS NULL
			) other_parameters ON other_parameters.machine_id = sm.id
			AND other_parameters.tenant_id = sm.tenant_id
		LEFT JOIN (
			SELECT sdp.*
				,d.day_id
			FROM sms_dozer_parameters sdp
			INNER JOIN days d ON d.day_id >= to_char(sdp.valid_from::TIMESTAMP, 'YYYYMMDD')::INT
				AND d.day_id <= to_char(coalesce(sdp.valid_to, now())::TIMESTAMP, 'YYYYMMDD')::INT
			WHERE sdp.deleted_at IS NULL
			) dozer_parameters ON dozer_parameters.machine_id = sm.id
			AND dozer_parameters.tenant_id = sm.tenant_id
		WHERE sm.deleted_at IS NULL
			AND sm.tenant_id = _tenant_id
	)
	,machine_tracker AS (
		SELECT sm.id AS machine_id
			,sm."name" AS NAME
			,sm.serial_number
			,sm."type"
			,sm.model
			,sm.make
			,sm.tenant_id
			,she.id AS hiboo_id
			,she.serial_number AS hiboo_serial_number
			,she."name" AS hiboo_name
			,smtt.tracker_serial
			,d.day_id
		FROM sms_machine sm
		LEFT JOIN sms_machine_teltonika_tracker smtt ON sm.id = smtt.machine_id
			AND sm.tenant_id = smtt.tenant_id
		INNER JOIN days d ON d.day_id >= to_char(smtt.valid_from::TIMESTAMP, 'YYYYMMDD')::INT
			AND d.day_id <= to_char(coalesce(smtt.valid_to, now())::TIMESTAMP, 'YYYYMMDD')::INT
		LEFT JOIN sms_hiboo_equipment she ON sm.serial_number = she.serial_number
			AND sm.tenant_id = she.tenant_id
		WHERE sm.deleted_at IS NULL
			AND smtt.deleted_at IS NULL
			AND sm.tenant_id = _tenant_id
	)
	,tracker_gps_data AS (
		SELECT stgd.id AS id
			,stgd.TIME
			,stgd.ign
			,to_char(stgd.TIME, 'YYYYMMDD')::INT AS day_id
			,stgd.serial_number AS tracker
			,stgd.tenant_id AS tenant_id
			,stci.delta_time
			,stci.delta_distance
		FROM sms_teltonika_gps_data stgd
		LEFT JOIN sms_tgd_computed_info stci ON stgd.id = stci.id
		WHERE stgd.TIME >= TO_TIMESTAMP(CONCAT (TO_DATE(_from_day_id::TEXT, 'YYYYMMDD'),' 00:00:00'), 'YYYY-MM-DD HH24:MI:SS')
			AND stgd.TIME <= TO_TIMESTAMP(CONCAT (TO_DATE(_to_day_id::TEXT, 'YYYYMMDD'),' 23:59:59'), 'YYYY-MM-DD HH24:MI:SS')
			AND stgd.tenant_id = _tenant_id
	)
	,computed_tracker_gps_data AS (
		SELECT count(tgd.id) AS gpscount
			,tgd.tracker
			,tgd.tenant_id
			,tgd.day_id
			,sum(CASE 
				WHEN tgd.ign = true
					THEN tgd.delta_time
				ELSE NULL
				END) AS computed_duration
			,sum(CASE 
				WHEN tgd.ign = true
					THEN tgd.delta_distance
				ELSE NULL
				END) AS computed_distance
		FROM tracker_gps_data tgd
		WHERE tgd.day_id IS NOT NULL
		GROUP BY tgd.tracker
			,tgd.tenant_id
			,tgd.day_id
	)
	,machine_tracker_gps_data AS (
		SELECT mt.machine_id
			,mt."name" AS NAME
			,mt.serial_number
			,mt."type"
			,mt.model
			,mt.make
			,mt.hiboo_id
			,mt.hiboo_serial_number
			,mt.hiboo_name
			,coalesce(mt.tracker_serial, ctgd.tracker) AS tracker
			,coalesce(mt.tenant_id, ctgd.tenant_id) AS tenant_id
			,coalesce(mt.day_id, ctgd.day_id) AS day_id
			,ctgd.gpscount
			,ctgd.computed_duration
			,ctgd.computed_distance
		FROM machine_tracker mt
		LEFT JOIN computed_tracker_gps_data ctgd ON mt.tracker_serial = ctgd.tracker
			AND mt.day_id = ctgd.day_id
			AND mt.tenant_id = ctgd.tenant_id
	)
	,machine_tracker_site_gps AS (
		SELECT coalesce(ms.id, mtgd.machine_id) AS machine_id
			,coalesce(ms.day_id, mtgd.day_id) AS day_id
			,coalesce(ms.tenant_id, mtgd.tenant_id) AS tenant_id
			,ms.site_id AS site_id
			,ms.site_name AS site_name
			,mtgd.gpscount
			,mtgd.serial_number
			,mtgd."name"
			,mtgd."type"
			,mtgd.model
			,mtgd.make
			,mtgd.tracker
			,mtgd.computed_duration
			,mtgd.computed_distance
			,mtgd.hiboo_id
			,mtgd.hiboo_serial_number
			,mtgd.hiboo_name
		FROM machine_tracker_gps_data mtgd
		FULL JOIN machine_site ms ON ms.id = mtgd.machine_id
			AND ms.day_id = mtgd.day_id
			AND ms.tenant_id = mtgd.tenant_id
	)
	,machine_statistic AS (
		SELECT mtsg.gpscount
			,mtsg.day_id
			,mtsg.tenant_id
			,mtsg.site_id
			,mtsg.site_name AS site_name
			,mtsg.machine_id AS machine_id
			,mtsg."type" AS machine_type
			,mtsg."name" AS machine_name
			,mtsg.model AS machine_model
			,mtsg.make AS machine_make
			,mtsg.serial_number
			,mtsg.hiboo_id
			,mtsg.hiboo_serial_number
			,mtsg.hiboo_name
			,mtsg.tracker
			,sum(mtsg.computed_duration) AS computed_duration
			,sum(mtsg.computed_distance) AS computed_distance
			,mp.cost_per_hour
			,mp.theoretical_consumption
			,mp.kg_co2_per_liter
			,mp.volume
		FROM machine_tracker_site_gps mtsg
		LEFT JOIN machine_parameters mp ON mtsg.day_id = mp.day_id
			AND mtsg.machine_id = mp.machine_id
		WHERE mtsg.day_id IS NOT NULL
		GROUP BY mtsg.machine_id
			,mtsg.tenant_id
			,mtsg.site_id
			,mtsg.site_name
			,mtsg.gpscount
			,mtsg."name"
			,mtsg."type"
			,mtsg.model
			,mtsg.make
			,mtsg.serial_number
			,mtsg.hiboo_id
			,mtsg.hiboo_serial_number
			,mtsg.hiboo_name
			,mtsg.tracker
			,mtsg.day_id
			,mp.cost_per_hour
			,mp.theoretical_consumption
			,mp.kg_co2_per_liter
			,mp.volume
		ORDER BY mtsg.day_id
	)
	,hiboo AS (
		SELECT *
		FROM sms_hiboo_daily_data shdd
		WHERE shdd.calendar_day_id >= _from_day_id
			AND shdd.calendar_day_id <= _to_day_id
			AND shdd.tenant_id = _tenant_id
	)
	,machine_waitings AS (
		SELECT stc.truck_id AS machine_id
			,stc.tenant_id
			,stc.day_id
			,SUM(stc.waiting_on_track_empty + stc.waiting_on_track_loaded + stc.waiting_for_loading_time + stc.waiting_for_dumping_time) AS hours_idling
		FROM sms_truck_cycle stc
		GROUP BY stc.truck_id
			,stc.tenant_id
			,stc.day_id
	
		UNION
	
		SELECT ssc.scraper_id AS machine_id
			,ssc.tenant_id
			,ssc.day_id
			,SUM(ssc.waiting_on_track_empty + ssc.waiting_on_track_loaded + ssc.waiting_for_loading_time + ssc.waiting_for_dumping_time) AS hours_idling
		FROM sms_scraper_cycle ssc
		GROUP BY ssc.scraper_id
			,ssc.tenant_id
			,ssc.day_id
	)

	INSERT INTO PUBLIC.sms_kpi_sites_machines (
		day_id
		,tenant_id
		,site_id
		,site_name
		,machine_id
		,machine_type_id
		,machine_type
		,machine_name
		,machine_make
		,machine_model
		,machine_sn
		,tracker_gps_count_teltonika
		,tracker_sn_hiboo
		,tracker_name_hiboo
		,tracker_sn_teltonika
		,tracker_id_teltonika
		,machine_hours_operating
		,machine_hours_idle
		,machine_hours_working
		,machine_fuel_used
		,machine_distance
		,machine_fuel_consumption
		,machine_hours_idling_percentage
		,machine_co2_equivalent
		,hiboo_hours_operating
		,hiboo_hours_idle
		,hiboo_hours_working
		,hiboo_fuel_used
		,hiboo_distance
		,hiboo_fuel_consumption
		,hiboo_hours_idling_percentage
		,hiboo_co2_equivalent
		)
	SELECT ms.day_id
		,ms.tenant_id
		,ms.site_id
		,ms.site_name
		,ms.machine_id
		,ms.machine_type AS machine_type_id
		,smt.NAME AS machine_type
		,ms.machine_name
		,ms.machine_make
		,ms.machine_model
		,ms.serial_number AS machine_sn
		,ms.gpscount AS tracker_gps_count_teltonika
		,ms.hiboo_serial_number AS tracker_sn_hiboo
		,ms.hiboo_name AS tracker_name_hiboo
		,ms.tracker AS tracker_sn_teltonika
		,NULL AS tracker_id_teltonika
		,ms.computed_duration / 3600::NUMERIC AS machines_hours_operating
		,mw.hours_idling / 3600::NUMERIC AS machines_hours_idle
		,(ms.computed_duration - mw.hours_idling) / 3600::NUMERIC AS machines_hours_working
		,(ms.computed_duration / 3600 * ms.theoretical_consumption) AS machine_fuel_used
		,ms.computed_distance AS machine_distance
		,CASE 
			WHEN ms.computed_duration IS NOT NULL
				AND coalesce(ms.computed_duration, 0) > 0
				THEN (ms.computed_duration / 3600 * ms.theoretical_consumption) / (ms.computed_duration / 3600)
			ELSE NULL
			END AS machine_fuel_consumption
		,CASE 
			WHEN mw.hours_idling IS NOT NULL
				AND coalesce(ms.computed_duration, 0) > 0
				THEN mw.hours_idling / ms.computed_duration * 100
			ELSE NULL
			END AS machine_hours_idling_percentage
		,(ms.computed_duration / 3600 * ms.theoretical_consumption * ms.kg_co2_per_liter) AS machine_co2_equivalent
		,h.operating_hours AS hiboo_hours_operating
		,h.idle_hours AS hiboo_hours_idle
		,h.working_hours AS hiboo_hours_working
		,h.fuel_used AS hiboo_fuel_used
		,h.distance * 1000 AS hiboo_distance
		,CASE 
			WHEN h.fuel_used IS NOT NULL
				AND coalesce(h.operating_hours, 0) > 0
				THEN h.fuel_used / h.operating_hours
			ELSE NULL
			END AS hiboo_fuel_consumption
		,CASE 
			WHEN h.idle_hours IS NOT NULL
				AND coalesce(h.operating_hours, 0) > 0
				THEN h.idle_hours / h.operating_hours * 100
			ELSE NULL
			END AS hiboo_hours_idling_percentage
		,h.fuel_used * ms.kg_co2_per_liter AS hiboo_co2_equivalent
	FROM machine_statistic ms
	INNER JOIN sms_machine_type smt ON ms.machine_type = smt.id
		AND ms.tenant_id = smt.tenant_id
	LEFT JOIN hiboo h ON ms.hiboo_id = h.equipment_id
		AND ms.day_id = h.calendar_day_id
		AND ms.tenant_id = h.tenant_id
	LEFT JOIN machine_waitings mw ON ms.machine_id = mw.machine_id
		AND ms.tenant_id = mw.tenant_id
		AND ms.day_id = mw.day_id
	ORDER BY ms.day_id;]]></definition>
         <parameters>
            <parameter mode="IN" name="_from_day_id" type="integer"/>
            <parameter mode="IN" name="_to_day_id" type="integer"/>
            <parameter mode="IN" name="_tenant_id" type="uuid"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="sms_update_scraper_gps_data(IN _scraper_id uuid, IN _dozer_serial text, IN _dozer_id uuid, IN _day_id integer, IN _tenant_id uuid, IN _inclination_treshold integer, IN _distance_treshold integer, IN _azimuth_treshold integer)" securityType="INVOKER" type="PROCEDURE">
         <comment/>
         <definition language="sql"><![CDATA[WITH scraper_raw_gps AS (
        SELECT
            id AS scraper_gps_id,
            time,
            coord AS scraper_coord,
            LEAD(coord, 1) OVER (ORDER BY time) AS next_scraper_coord,
            dumpster_open
        FROM sms_teltonika_scraper_gps_data
        WHERE scraper_id = _scraper_id
            AND time > TO_DATE(_day_id::TEXT, 'YYYYMMDD')
            AND time < TO_DATE(_day_id::TEXT, 'YYYYMMDD') + 1
            AND tenant_id = _tenant_id
        ORDER BY time ASC
    ),

    scraper_azimuth_calculated AS (
        SELECT
            scraper_gps_id,
            time,
            scraper_coord,
            next_scraper_coord,
            dumpster_open,
            CASE
                WHEN ST_Equals(scraper_coord, next_scraper_coord) THEN 0
                ELSE DEGREES(ST_AZIMUTH(scraper_coord, next_scraper_coord))
            END AS scraper_azimuth
        FROM scraper_raw_gps
    ),

    dozer_raw_gps AS (
        SELECT
            id AS dozer_gps_id,
            time,
            coord AS dozer_coord,
            LEAD(coord, 1) OVER (ORDER BY time) AS next_dozer_coord
        FROM sms_teltonika_gps_data
        WHERE serial_number = _dozer_serial
            AND time > TO_DATE(_day_id::TEXT, 'YYYYMMDD')
            AND time < TO_DATE(_day_id::TEXT, 'YYYYMMDD') + 1
            AND tenant_id = _tenant_id
        ORDER BY time ASC
    ),

    dozer_azimuth_calculated AS (
        SELECT
            dozer_gps_id,
            time,
            dozer_coord,
            next_dozer_coord,
            CASE
                WHEN ST_Equals(dozer_coord, next_dozer_coord) THEN 0
                ELSE DEGREES(ST_AZIMUTH(dozer_coord, next_dozer_coord))
            END AS dozer_azimuth
        FROM dozer_raw_gps
    ),

    paired AS (
        SELECT
            *,
            (
                SELECT dozer_gps_id
                FROM dozer_azimuth_calculated
                WHERE time >= (scraper_azimuth_calculated.time - INTERVAL '5 second') AND time <= (scraper_azimuth_calculated.time + INTERVAL '5 second')
                LIMIT 1
            ),
            (
                SELECT dozer_coord
                FROM dozer_azimuth_calculated
                WHERE time >= (scraper_azimuth_calculated.time - INTERVAL '5 second') AND time <= (scraper_azimuth_calculated.time + INTERVAL '5 second')
                LIMIT 1
            ),
            (
                SELECT dozer_azimuth
                FROM dozer_azimuth_calculated
                WHERE time >= (scraper_azimuth_calculated.time - INTERVAL '5 second') AND time <= (scraper_azimuth_calculated.time + INTERVAL '5 second')
                LIMIT 1
            )
        FROM scraper_azimuth_calculated
    ),

    calculated AS (
        SELECT
            *,
            CASE
                WHEN scraper_coord IS NULL THEN NULL
                WHEN dozer_coord IS NULL THEN NULL
                ELSE ST_DistanceSphere(scraper_coord, dozer_coord)
            END AS machine_distance,
            CASE
                WHEN scraper_azimuth IS NULL THEN NULL
                WHEN dozer_azimuth IS NULL THEN NULL
                WHEN scraper_azimuth = 0 AND dozer_azimuth = 0 THEN NULL
                ELSE ABS(scraper_azimuth - dozer_azimuth)
            END AS azimuth_delta
        FROM paired
    ),

    loading_detected AS (
        SELECT
            scraper_gps_id,
            CASE
                WHEN dumpster_open IS TRUE AND machine_distance <= _distance_treshold AND azimuth_delta <= _azimuth_treshold THEN TRUE
                ELSE FALSE
            END AS dozer_nearby
        FROM calculated
    )

    UPDATE sms_teltonika_scraper_gps_data
    SET dozer_nearby = loading_detected.dozer_nearby, dozer_id = _dozer_id
    FROM loading_detected
    WHERE sms_teltonika_scraper_gps_data.id = loading_detected.scraper_gps_id
        AND loading_detected.dozer_nearby IS TRUE;]]></definition>
         <parameters>
            <parameter mode="IN" name="_scraper_id" type="uuid"/>
            <parameter mode="IN" name="_dozer_serial" type="text"/>
            <parameter mode="IN" name="_dozer_id" type="uuid"/>
            <parameter mode="IN" name="_day_id" type="integer"/>
            <parameter mode="IN" name="_tenant_id" type="uuid"/>
            <parameter mode="IN" name="_inclination_treshold" type="integer"/>
            <parameter mode="IN" name="_distance_treshold" type="integer"/>
            <parameter mode="IN" name="_azimuth_treshold" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="sms_update_scraper_gps_data_v2(IN _scraper_id uuid, IN _dozer_serial text, IN _dozer_id uuid, IN _day_id integer, IN _tenant_id uuid, IN _distance_treshold integer, IN _azimuth_treshold integer)" securityType="INVOKER" type="PROCEDURE">
         <comment/>
         <definition language="sql"><![CDATA[WITH scraper_raw_gps AS (
        SELECT
            id AS scraper_gps_id,
            time,
            coord AS scraper_coord,
            LEAD(coord, 1) OVER (ORDER BY time) AS next_scraper_coord,
            dumpster_open
        FROM sms_teltonika_scraper_gps_data
        WHERE scraper_id = _scraper_id
            AND time > TO_DATE(_day_id::TEXT, 'YYYYMMDD')
            AND time < TO_DATE(_day_id::TEXT, 'YYYYMMDD') + 1
            AND tenant_id = _tenant_id
        ORDER BY time ASC
    ),

    scraper_azimuth_calculated AS (
        SELECT
            scraper_gps_id,
            time,
            scraper_coord,
            next_scraper_coord,
            dumpster_open,
            CASE
                WHEN ST_Equals(scraper_coord, next_scraper_coord) THEN 0
                ELSE DEGREES(ST_AZIMUTH(scraper_coord, next_scraper_coord))
            END AS scraper_azimuth
        FROM scraper_raw_gps
    ),

    scraper_azimuth_prev AS (
        SELECT
            *,
            LAG(scraper_azimuth, 1) OVER (ORDER BY time) AS scraper_azimuth_prev1,
            LAG(scraper_azimuth, 2) OVER (ORDER BY time) AS scraper_azimuth_prev2,
            LAG(scraper_azimuth, 3) OVER (ORDER BY time) AS scraper_azimuth_prev3
        FROM scraper_azimuth_calculated
    ),

    scraper_azimuth_gaps_filled AS (
        SELECT
            scraper_gps_id,
            time,
            scraper_coord,
            next_scraper_coord,
            dumpster_open,
            CASE
                WHEN scraper_azimuth = 0 AND scraper_azimuth_prev1 <> 0 THEN scraper_azimuth_prev1
                WHEN scraper_azimuth = 0 AND scraper_azimuth_prev1 = 0 THEN scraper_azimuth_prev2
                WHEN scraper_azimuth = 0 AND scraper_azimuth_prev1 = 0 AND scraper_azimuth_prev2 = 0 THEN scraper_azimuth_prev3
                ELSE scraper_azimuth
            END AS scraper_azimuth
        FROM scraper_azimuth_prev
        ORDER BY time
    ),

    dozer_raw_gps AS (
        SELECT
            id AS dozer_gps_id,
            time,
            coord AS dozer_coord,
            LEAD(coord, 1) OVER (ORDER BY time) AS next_dozer_coord
        FROM sms_teltonika_gps_data
        WHERE serial_number = _dozer_serial
            AND time > TO_DATE(_day_id::TEXT, 'YYYYMMDD')
            AND time < TO_DATE(_day_id::TEXT, 'YYYYMMDD') + 1
            AND tenant_id = _tenant_id
        ORDER BY time ASC
    ),

    dozer_azimuth_calculated AS (
        SELECT
            dozer_gps_id,
            time,
            dozer_coord,
            next_dozer_coord,
            CASE
                WHEN ST_Equals(dozer_coord, next_dozer_coord) THEN 0
                ELSE DEGREES(ST_AZIMUTH(dozer_coord, next_dozer_coord))
            END AS dozer_azimuth
        FROM dozer_raw_gps
    ),

    dozer_azimuth_prev AS (
        SELECT
            *,
            LAG(dozer_azimuth, 1) OVER (ORDER BY time) AS dozer_azimuth_prev1,
            LAG(dozer_azimuth, 2) OVER (ORDER BY time) AS dozer_azimuth_prev2,
            LAG(dozer_azimuth, 3) OVER (ORDER BY time) AS dozer_azimuth_prev3
        FROM dozer_azimuth_calculated
    ),

    dozer_azimuth_gaps_filled AS (
        SELECT
            dozer_gps_id,
            time,
            dozer_coord,
            next_dozer_coord,
            CASE
                WHEN dozer_azimuth = 0 AND dozer_azimuth_prev1 <> 0 THEN dozer_azimuth_prev1
                WHEN dozer_azimuth = 0 AND dozer_azimuth_prev1 = 0 AND dozer_azimuth_prev2 <> 0 THEN dozer_azimuth_prev2
                WHEN dozer_azimuth = 0 AND dozer_azimuth_prev1 = 0 AND dozer_azimuth_prev2 = 0 THEN dozer_azimuth_prev3
                ELSE dozer_azimuth
            END AS dozer_azimuth
        FROM dozer_azimuth_prev
        ORDER BY time
    ),

    paired AS (
        SELECT
            *,
            (
                SELECT dozer_gps_id
                FROM dozer_azimuth_gaps_filled
                WHERE time >= (scraper_azimuth_gaps_filled.time - INTERVAL '5 second') AND time <= (scraper_azimuth_gaps_filled.time + INTERVAL '5 second')
                LIMIT 1
            ),
            (
                SELECT dozer_coord
                FROM dozer_azimuth_gaps_filled
                WHERE time >= (scraper_azimuth_gaps_filled.time - INTERVAL '5 second') AND time <= (scraper_azimuth_gaps_filled.time + INTERVAL '5 second')
                LIMIT 1
            ),
            (
                SELECT dozer_azimuth
                FROM dozer_azimuth_gaps_filled
                WHERE time >= (scraper_azimuth_gaps_filled.time - INTERVAL '5 second') AND time <= (scraper_azimuth_gaps_filled.time + INTERVAL '5 second')
                LIMIT 1
            )
        FROM scraper_azimuth_gaps_filled
    ),

    calculated AS (
        SELECT
            *,
            CASE
                WHEN scraper_coord IS NULL THEN NULL
                WHEN dozer_coord IS NULL THEN NULL
                ELSE ST_DistanceSphere(scraper_coord, dozer_coord)
            END AS machine_distance,
            CASE
                WHEN scraper_azimuth IS NULL THEN NULL
                WHEN dozer_azimuth IS NULL THEN NULL
                WHEN scraper_azimuth = 0 AND dozer_azimuth = 0 THEN NULL
                ELSE ABS(scraper_azimuth - dozer_azimuth)
            END AS azimuth_delta
        FROM paired
    ),

    dozer_nearby_detected AS (
        SELECT
            *,
            CASE
                WHEN machine_distance <= _distance_treshold AND azimuth_delta <= _azimuth_treshold THEN TRUE
                ELSE FALSE
            END AS dozer_nearby
        FROM calculated
    ),

    dozer_nearby_prev_next AS (
        SELECT
            *,
            LAG(dozer_nearby, 1) OVER (ORDER BY time) AS prev1,
            LAG(dozer_nearby, 2) OVER (ORDER BY time) AS prev2,
            LAG(dozer_nearby, 3) OVER (ORDER BY time) AS prev3,
            LEAD(dozer_nearby, 1) OVER (ORDER BY time) AS next1,
            LEAD(dozer_nearby, 2) OVER (ORDER BY time) AS next2,
            LEAD(dozer_nearby, 3) OVER (ORDER BY time) AS next3
        FROM dozer_nearby_detected

    ),

    dozer_nearby_gaps_filled AS (
        SELECT
            scraper_gps_id,
            CASE
                WHEN prev1 IS TRUE AND next1 IS TRUE THEN TRUE
                WHEN prev1 IS TRUE AND next1 IS FALSE AND next2 IS TRUE THEN TRUE
                WHEN prev1 IS TRUE AND next1 IS FALSE AND next2 IS TRUE THEN TRUE
                WHEN prev1 IS TRUE AND next1 IS FALSE AND next2 IS FALSE AND next3 IS TRUE THEN TRUE
                WHEN prev1 IS FALSE AND prev2 IS TRUE AND next1 IS FALSE AND next2 IS TRUE THEN TRUE
                WHEN prev1 IS FALSE AND prev2 IS FALSE AND prev3 IS TRUE AND next1 IS TRUE THEN TRUE
                WHEN prev1 IS FALSE AND prev2 IS TRUE AND next1 IS TRUE THEN TRUE
                WHEN prev1 IS FALSE AND next1 IS FALSE THEN FALSE -- removing short loadings
                ELSE dozer_nearby
            END AS dozer_nearby
        FROM dozer_nearby_prev_next
    )

    UPDATE sms_teltonika_scraper_gps_data
    SET dozer_nearby = dozer_nearby_gaps_filled.dozer_nearby, dozer_id = _dozer_id
    FROM dozer_nearby_gaps_filled
    WHERE sms_teltonika_scraper_gps_data.id = dozer_nearby_gaps_filled.scraper_gps_id
    AND dozer_nearby_gaps_filled.dozer_nearby IS TRUE;]]></definition>
         <parameters>
            <parameter mode="IN" name="_scraper_id" type="uuid"/>
            <parameter mode="IN" name="_dozer_serial" type="text"/>
            <parameter mode="IN" name="_dozer_id" type="uuid"/>
            <parameter mode="IN" name="_day_id" type="integer"/>
            <parameter mode="IN" name="_tenant_id" type="uuid"/>
            <parameter mode="IN" name="_distance_treshold" type="integer"/>
            <parameter mode="IN" name="_azimuth_treshold" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="sms_update_truck_loading_data(IN _truck_id uuid, IN _loader_serial text, IN _loader_id uuid, IN _day_id integer, IN _truck_volume numeric, IN _loader_volume numeric, IN _loading_time integer, IN _load_time_coef numeric, IN _max_distance integer)" securityType="INVOKER" type="PROCEDURE">
         <comment/>
         <definition language="sql"><![CDATA[WITH distance_data AS (
    WITH loader_centroids AS (
        WITH motionless_data AS (
        SELECT
                id,
                type,
                centroid AS motionless_centroid,
                start_date,
                duration
            FROM sms_truck_move AS move_data
            WHERE truck_id = _truck_id
                AND day_id = _day_id
                AND type = 'motionless'
                AND duration >= (_truck_volume / _loader_volume) * _loading_time * _load_time_coef
    )

        SELECT
            *,
            (
                SELECT
                    ST_Centroid(ST_UNION(coord)) AS centroid
                FROM sms_teltonika_gps_data
                WHERE serial_number = _loader_serial AND time > (motionless_data.start_date - INTERVAL '10 second') AND time < (motionless_data.start_date + (motionless_data.duration + 10) * INTERVAL '1 second')
            ) AS centroid
        FROM motionless_data
    )

    SELECT
        id,
     CASE
            WHEN centroid IS NULL THEN NULL
        ELSE ST_DistanceSphere(motionless_centroid, centroid)
     END AS distance
    FROM loader_centroids
)

UPDATE sms_truck_move 
SET type = 'loading', loader_id = _loader_id
FROM distance_data
WHERE sms_truck_move.id = distance_data.id AND distance_data.distance <= _max_distance]]></definition>
         <parameters>
            <parameter mode="IN" name="_truck_id" type="uuid"/>
            <parameter mode="IN" name="_loader_serial" type="text"/>
            <parameter mode="IN" name="_loader_id" type="uuid"/>
            <parameter mode="IN" name="_day_id" type="integer"/>
            <parameter mode="IN" name="_truck_volume" type="numeric"/>
            <parameter mode="IN" name="_loader_volume" type="numeric"/>
            <parameter mode="IN" name="_loading_time" type="integer"/>
            <parameter mode="IN" name="_load_time_coef" type="numeric"/>
            <parameter mode="IN" name="_max_distance" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="spheroid_in(cstring)" returnType="spheroid" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[ellipsoid_in]]></definition>
         <parameters>
            <parameter mode="IN" type="cstring"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="spheroid_out(spheroid)" returnType="cstring" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[ellipsoid_out]]></definition>
         <parameters>
            <parameter mode="IN" type="spheroid"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_3dclosestpoint(geom1 geometry, geom2 geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g1, g2 - Returns the 3D point on g1 that is closest to g2. This is the first point of the 3D shortest line.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_closestpoint3d]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_3ddfullywithin(geom1 geometry, geom2 geometry, double precision)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_dfullywithin3d]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_3ddistance(geom1 geometry, geom2 geometry)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g1, g2 - Returns the 3D cartesian minimum distance (based on spatial ref) between two geometries in projected units.]]></comment>
         <definition language="c"><![CDATA[ST_3DDistance]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_3ddwithin(geom1 geometry, geom2 geometry, double precision)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_dwithin3d]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_3dextent(geometry)" returnType="box3d" securityType="INVOKER" type="AGGREGATE">
         <comment><![CDATA[args: geomfield - Aggregate function that returns the 3D bounding box of geometries.]]></comment>
         <definition language="internal"><![CDATA[aggregate_dummy]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_3dintersects(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[ST_3DIntersects]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_3dlength(geometry)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: a_3dlinestring - Returns the 3D length of a linear geometry.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_length_linestring]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_3dlineinterpolatepoint(geometry, double precision)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: a_linestring, a_fraction - Returns a point interpolated along a 3D line at a fractional location.]]></comment>
         <definition language="c"><![CDATA[ST_3DLineInterpolatePoint]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_3dlongestline(geom1 geometry, geom2 geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g1, g2 - Returns the 3D longest line between two geometries]]></comment>
         <definition language="c"><![CDATA[LWGEOM_longestline3d]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_3dmakebox(geom1 geometry, geom2 geometry)" returnType="box3d" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: point3DLowLeftBottom, point3DUpRightTop - Creates a BOX3D defined by two 3D point geometries.]]></comment>
         <definition language="c"><![CDATA[BOX3D_construct]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_3dmaxdistance(geom1 geometry, geom2 geometry)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g1, g2 - Returns the 3D cartesian maximum distance (based on spatial ref) between two geometries in projected units.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_maxdistance3d]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_3dperimeter(geometry)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA - Returns the 3D perimeter of a polygonal geometry.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_perimeter_poly]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_3dshortestline(geom1 geometry, geom2 geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g1, g2 - Returns the 3D shortest line between two geometries]]></comment>
         <definition language="c"><![CDATA[LWGEOM_shortestline3d]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_addmeasure(geometry, double precision, double precision)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom_mline, measure_start, measure_end - Interpolates measures along a linear geometry.]]></comment>
         <definition language="c"><![CDATA[ST_AddMeasure]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_addpoint(geom1 geometry, geom2 geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: linestring, point - Add a point to a LineString.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_addpoint]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_addpoint(geom1 geometry, geom2 geometry, integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: linestring, point, position = -1 - Add a point to a LineString.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_addpoint]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_affine(geometry, double precision, double precision, double precision, double precision, double precision, double precision)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA, a, b, d, e, xoff, yoff - Apply a 3D affine transformation to a geometry.]]></comment>
         <definition language="sql"><![CDATA[SELECT public.ST_Affine($1,  $2, $3, 0,  $4, $5, 0,  0, 0, 1,  $6, $7, 0)]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_affine(geometry, double precision, double precision, double precision, double precision, double precision, double precision, double precision, double precision, double precision, double precision, double precision, double precision)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA, a, b, c, d, e, f, g, h, i, xoff, yoff, zoff - Apply a 3D affine transformation to a geometry.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_affine]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_angle(line1 geometry, line2 geometry)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: line1, line2 - Returns the angle between two vectors defined by 3 or 4 points, or 2 lines.]]></comment>
         <definition language="sql"><![CDATA[SELECT ST_Angle(St_StartPoint($1), ST_EndPoint($1), St_StartPoint($2), ST_EndPoint($2))]]></definition>
         <parameters>
            <parameter mode="IN" name="line1" type="geometry"/>
            <parameter mode="IN" name="line2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_angle(pt1 geometry, pt2 geometry, pt3 geometry, pt4 geometry DEFAULT '0101000000000000000000F87F000000000000F87F'::geometry)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: point1, point2, point3, point4 - Returns the angle between two vectors defined by 3 or 4 points, or 2 lines.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_angle]]></definition>
         <parameters>
            <parameter mode="IN" name="pt1" type="geometry"/>
            <parameter mode="IN" name="pt2" type="geometry"/>
            <parameter mode="IN" name="pt3" type="geometry"/>
            <parameter mode="IN" name="pt4" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_area(geog geography, use_spheroid boolean DEFAULT true)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geog, use_spheroid=true - Returns the area of a polygonal geometry.]]></comment>
         <definition language="c"><![CDATA[geography_area]]></definition>
         <parameters>
            <parameter mode="IN" name="geog" type="geography"/>
            <parameter mode="IN" name="use_spheroid" type="boolean"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_area(geometry)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g1 - Returns the area of a polygonal geometry.]]></comment>
         <definition language="c"><![CDATA[ST_Area]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_area(text)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT public.ST_Area($1::public.geometry);]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_area2d(geometry)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[ST_Area]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_asbinary(geography)" returnType="bytea" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_asBinary]]></definition>
         <parameters>
            <parameter mode="IN" type="geography"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_asbinary(geography, text)" returnType="bytea" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_asBinary]]></definition>
         <parameters>
            <parameter mode="IN" type="geography"/>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_asbinary(geometry)" returnType="bytea" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_asBinary]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_asbinary(geometry, text)" returnType="bytea" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_asBinary]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_asencodedpolyline(geom geometry, nprecision integer DEFAULT 5)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_asEncodedPolyline]]></definition>
         <parameters>
            <parameter mode="IN" name="geom" type="geometry"/>
            <parameter mode="IN" name="nprecision" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_asewkb(geometry)" returnType="bytea" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[WKBFromLWGEOM]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_asewkb(geometry, text)" returnType="bytea" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[WKBFromLWGEOM]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_asewkt(geography)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_asEWKT]]></definition>
         <parameters>
            <parameter mode="IN" type="geography"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_asewkt(geography, integer)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_asEWKT]]></definition>
         <parameters>
            <parameter mode="IN" type="geography"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_asewkt(geometry)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_asEWKT]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_asewkt(geometry, integer)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_asEWKT]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_asewkt(text)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT public.ST_AsEWKT($1::public.geometry);]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_asflatgeobuf(anyelement)" returnType="bytea" securityType="INVOKER" type="AGGREGATE">
         <comment/>
         <definition language="internal"><![CDATA[aggregate_dummy]]></definition>
         <parameters>
            <parameter mode="IN" type="anyelement"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_asflatgeobuf(anyelement, boolean)" returnType="bytea" securityType="INVOKER" type="AGGREGATE">
         <comment/>
         <definition language="internal"><![CDATA[aggregate_dummy]]></definition>
         <parameters>
            <parameter mode="IN" type="anyelement"/>
            <parameter mode="IN" type="boolean"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_asflatgeobuf(anyelement, boolean, text)" returnType="bytea" securityType="INVOKER" type="AGGREGATE">
         <comment/>
         <definition language="internal"><![CDATA[aggregate_dummy]]></definition>
         <parameters>
            <parameter mode="IN" type="anyelement"/>
            <parameter mode="IN" type="boolean"/>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_asgeobuf(anyelement)" returnType="bytea" securityType="INVOKER" type="AGGREGATE">
         <comment/>
         <definition language="internal"><![CDATA[aggregate_dummy]]></definition>
         <parameters>
            <parameter mode="IN" type="anyelement"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_asgeobuf(anyelement, text)" returnType="bytea" securityType="INVOKER" type="AGGREGATE">
         <comment/>
         <definition language="internal"><![CDATA[aggregate_dummy]]></definition>
         <parameters>
            <parameter mode="IN" type="anyelement"/>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_asgeojson(geog geography, maxdecimaldigits integer DEFAULT 9, options integer DEFAULT 0)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geography_as_geojson]]></definition>
         <parameters>
            <parameter mode="IN" name="geog" type="geography"/>
            <parameter mode="IN" name="maxdecimaldigits" type="integer"/>
            <parameter mode="IN" name="options" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_asgeojson(geom geometry, maxdecimaldigits integer DEFAULT 9, options integer DEFAULT 8)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_asGeoJson]]></definition>
         <parameters>
            <parameter mode="IN" name="geom" type="geometry"/>
            <parameter mode="IN" name="maxdecimaldigits" type="integer"/>
            <parameter mode="IN" name="options" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="st_asgeojson(r record, geom_column text DEFAULT ''::text, maxdecimaldigits integer DEFAULT 9, pretty_bool boolean DEFAULT false)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[ST_AsGeoJsonRow]]></definition>
         <parameters>
            <parameter mode="IN" name="r" type="record"/>
            <parameter mode="IN" name="geom_column" type="text"/>
            <parameter mode="IN" name="maxdecimaldigits" type="integer"/>
            <parameter mode="IN" name="pretty_bool" type="boolean"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_asgeojson(text)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT public.ST_AsGeoJson($1::public.geometry, 9, 0);]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_asgml(geog geography, maxdecimaldigits integer DEFAULT 15, options integer DEFAULT 0, nprefix text DEFAULT 'gml'::text, id text DEFAULT ''::text)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geography_as_gml]]></definition>
         <parameters>
            <parameter mode="IN" name="geog" type="geography"/>
            <parameter mode="IN" name="maxdecimaldigits" type="integer"/>
            <parameter mode="IN" name="options" type="integer"/>
            <parameter mode="IN" name="nprefix" type="text"/>
            <parameter mode="IN" name="id" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_asgml(geom geometry, maxdecimaldigits integer DEFAULT 15, options integer DEFAULT 0)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_asGML]]></definition>
         <parameters>
            <parameter mode="IN" name="geom" type="geometry"/>
            <parameter mode="IN" name="maxdecimaldigits" type="integer"/>
            <parameter mode="IN" name="options" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_asgml(text)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT public._ST_AsGML(2,$1::public.geometry,15,0, NULL, NULL);]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_asgml(version integer, geog geography, maxdecimaldigits integer DEFAULT 15, options integer DEFAULT 0, nprefix text DEFAULT 'gml'::text, id text DEFAULT ''::text)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geography_as_gml]]></definition>
         <parameters>
            <parameter mode="IN" name="version" type="integer"/>
            <parameter mode="IN" name="geog" type="geography"/>
            <parameter mode="IN" name="maxdecimaldigits" type="integer"/>
            <parameter mode="IN" name="options" type="integer"/>
            <parameter mode="IN" name="nprefix" type="text"/>
            <parameter mode="IN" name="id" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_asgml(version integer, geom geometry, maxdecimaldigits integer DEFAULT 15, options integer DEFAULT 0, nprefix text DEFAULT NULL::text, id text DEFAULT NULL::text)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_asGML]]></definition>
         <parameters>
            <parameter mode="IN" name="version" type="integer"/>
            <parameter mode="IN" name="geom" type="geometry"/>
            <parameter mode="IN" name="maxdecimaldigits" type="integer"/>
            <parameter mode="IN" name="options" type="integer"/>
            <parameter mode="IN" name="nprefix" type="text"/>
            <parameter mode="IN" name="id" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_ashexewkb(geometry)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_asHEXEWKB]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_ashexewkb(geometry, text)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_asHEXEWKB]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_askml(geog geography, maxdecimaldigits integer DEFAULT 15, nprefix text DEFAULT ''::text)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geography_as_kml]]></definition>
         <parameters>
            <parameter mode="IN" name="geog" type="geography"/>
            <parameter mode="IN" name="maxdecimaldigits" type="integer"/>
            <parameter mode="IN" name="nprefix" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_askml(geom geometry, maxdecimaldigits integer DEFAULT 15, nprefix text DEFAULT ''::text)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_asKML]]></definition>
         <parameters>
            <parameter mode="IN" name="geom" type="geometry"/>
            <parameter mode="IN" name="maxdecimaldigits" type="integer"/>
            <parameter mode="IN" name="nprefix" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_askml(text)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT public.ST_AsKML($1::public.geometry, 15);]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_aslatlontext(geom geometry, tmpl text DEFAULT ''::text)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_to_latlon]]></definition>
         <parameters>
            <parameter mode="IN" name="geom" type="geometry"/>
            <parameter mode="IN" name="tmpl" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_asmarc21(geom geometry, format text DEFAULT 'hdddmmss'::text)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[ST_AsMARC21]]></definition>
         <parameters>
            <parameter mode="IN" name="geom" type="geometry"/>
            <parameter mode="IN" name="format" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_asmvt(anyelement)" returnType="bytea" securityType="INVOKER" type="AGGREGATE">
         <comment/>
         <definition language="internal"><![CDATA[aggregate_dummy]]></definition>
         <parameters>
            <parameter mode="IN" type="anyelement"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_asmvt(anyelement, text)" returnType="bytea" securityType="INVOKER" type="AGGREGATE">
         <comment/>
         <definition language="internal"><![CDATA[aggregate_dummy]]></definition>
         <parameters>
            <parameter mode="IN" type="anyelement"/>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_asmvt(anyelement, text, integer)" returnType="bytea" securityType="INVOKER" type="AGGREGATE">
         <comment/>
         <definition language="internal"><![CDATA[aggregate_dummy]]></definition>
         <parameters>
            <parameter mode="IN" type="anyelement"/>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_asmvt(anyelement, text, integer, text)" returnType="bytea" securityType="INVOKER" type="AGGREGATE">
         <comment/>
         <definition language="internal"><![CDATA[aggregate_dummy]]></definition>
         <parameters>
            <parameter mode="IN" type="anyelement"/>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="integer"/>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_asmvt(anyelement, text, integer, text, text)" returnType="bytea" securityType="INVOKER" type="AGGREGATE">
         <comment/>
         <definition language="internal"><![CDATA[aggregate_dummy]]></definition>
         <parameters>
            <parameter mode="IN" type="anyelement"/>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="integer"/>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_asmvtgeom(geom geometry, bounds box2d, extent integer DEFAULT 4096, buffer integer DEFAULT 256, clip_geom boolean DEFAULT true)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[ST_AsMVTGeom]]></definition>
         <parameters>
            <parameter mode="IN" name="geom" type="geometry"/>
            <parameter mode="IN" name="bounds" type="box2d"/>
            <parameter mode="IN" name="extent" type="integer"/>
            <parameter mode="IN" name="buffer" type="integer"/>
            <parameter mode="IN" name="clip_geom" type="boolean"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_assvg(geog geography, rel integer DEFAULT 0, maxdecimaldigits integer DEFAULT 15)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geography_as_svg]]></definition>
         <parameters>
            <parameter mode="IN" name="geog" type="geography"/>
            <parameter mode="IN" name="rel" type="integer"/>
            <parameter mode="IN" name="maxdecimaldigits" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_assvg(geom geometry, rel integer DEFAULT 0, maxdecimaldigits integer DEFAULT 15)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_asSVG]]></definition>
         <parameters>
            <parameter mode="IN" name="geom" type="geometry"/>
            <parameter mode="IN" name="rel" type="integer"/>
            <parameter mode="IN" name="maxdecimaldigits" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_assvg(text)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT public.ST_AsSVG($1::public.geometry,0,15);]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_astext(geography)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_asText]]></definition>
         <parameters>
            <parameter mode="IN" type="geography"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_astext(geography, integer)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_asText]]></definition>
         <parameters>
            <parameter mode="IN" type="geography"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_astext(geometry)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_asText]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_astext(geometry, integer)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_asText]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_astext(text)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT public.ST_AsText($1::public.geometry);]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_astwkb(geom geometry, prec integer DEFAULT NULL::integer, prec_z integer DEFAULT NULL::integer, prec_m integer DEFAULT NULL::integer, with_sizes boolean DEFAULT NULL::boolean, with_boxes boolean DEFAULT NULL::boolean)" returnType="bytea" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[TWKBFromLWGEOM]]></definition>
         <parameters>
            <parameter mode="IN" name="geom" type="geometry"/>
            <parameter mode="IN" name="prec" type="integer"/>
            <parameter mode="IN" name="prec_z" type="integer"/>
            <parameter mode="IN" name="prec_m" type="integer"/>
            <parameter mode="IN" name="with_sizes" type="boolean"/>
            <parameter mode="IN" name="with_boxes" type="boolean"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_astwkb(geom geometry[], ids bigint[], prec integer DEFAULT NULL::integer, prec_z integer DEFAULT NULL::integer, prec_m integer DEFAULT NULL::integer, with_sizes boolean DEFAULT NULL::boolean, with_boxes boolean DEFAULT NULL::boolean)" returnType="bytea" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[TWKBFromLWGEOMArray]]></definition>
         <parameters>
            <parameter mode="IN" name="geom" type="geometry[]"/>
            <parameter mode="IN" name="ids" type="bigint[]"/>
            <parameter mode="IN" name="prec" type="integer"/>
            <parameter mode="IN" name="prec_z" type="integer"/>
            <parameter mode="IN" name="prec_m" type="integer"/>
            <parameter mode="IN" name="with_sizes" type="boolean"/>
            <parameter mode="IN" name="with_boxes" type="boolean"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_asx3d(geom geometry, maxdecimaldigits integer DEFAULT 15, options integer DEFAULT 0)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT public._ST_AsX3D(3,$1,$2,$3,'');]]></definition>
         <parameters>
            <parameter mode="IN" name="geom" type="geometry"/>
            <parameter mode="IN" name="maxdecimaldigits" type="integer"/>
            <parameter mode="IN" name="options" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_azimuth(geog1 geography, geog2 geography)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: origin, target - Returns the north-based azimuth of a line between two points.]]></comment>
         <definition language="c"><![CDATA[geography_azimuth]]></definition>
         <parameters>
            <parameter mode="IN" name="geog1" type="geography"/>
            <parameter mode="IN" name="geog2" type="geography"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_azimuth(geom1 geometry, geom2 geometry)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: origin, target - Returns the north-based azimuth of a line between two points.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_azimuth]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_bdmpolyfromtext(text, integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="plpgsql"><![CDATA[DECLARE
	geomtext alias for $1;
	srid alias for $2;
	mline public.geometry;
	geom public.geometry;
BEGIN
	mline := public.ST_MultiLineStringFromText(geomtext, srid);

	IF mline IS NULL
	THEN
		RAISE EXCEPTION 'Input is not a MultiLinestring';
	END IF;

	geom := public.ST_Multi(public.ST_BuildArea(mline));

	RETURN geom;
END;]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_bdpolyfromtext(text, integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="plpgsql"><![CDATA[DECLARE
	geomtext alias for $1;
	srid alias for $2;
	mline public.geometry;
	geom public.geometry;
BEGIN
	mline := public.ST_MultiLineStringFromText(geomtext, srid);

	IF mline IS NULL
	THEN
		RAISE EXCEPTION 'Input is not a MultiLinestring';
	END IF;

	geom := public.ST_BuildArea(mline);

	IF public.GeometryType(geom) != 'POLYGON'
	THEN
		RAISE EXCEPTION 'Input returns more then a single polygon, try using BdMPolyFromText instead';
	END IF;

	RETURN geom;
END;]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_boundary(geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA - Returns the boundary of a geometry.]]></comment>
         <definition language="c"><![CDATA[boundary]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_boundingdiagonal(geom geometry, fits boolean DEFAULT false)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom, fits=false - Returns the diagonal of a geometrys bounding box.]]></comment>
         <definition language="c"><![CDATA[ST_BoundingDiagonal]]></definition>
         <parameters>
            <parameter mode="IN" name="geom" type="geometry"/>
            <parameter mode="IN" name="fits" type="boolean"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_box2dfromgeohash(text, integer DEFAULT NULL::integer)" returnType="box2d" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[box2d_from_geohash]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_buffer(geography, double precision)" returnType="geography" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT public.geography(public.ST_Transform(public.ST_Buffer(public.ST_Transform(public.geometry($1), public._ST_BestSRID($1)), $2), public.ST_SRID($1)))]]></definition>
         <parameters>
            <parameter mode="IN" type="geography"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_buffer(geography, double precision, integer)" returnType="geography" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g1, radius_of_buffer, num_seg_quarter_circle - Computes a geometry covering all points within a given distance from a geometry.]]></comment>
         <definition language="sql"><![CDATA[SELECT public.geography(public.ST_Transform(public.ST_Buffer(public.ST_Transform(public.geometry($1), public._ST_BestSRID($1)), $2, $3), public.ST_SRID($1)))]]></definition>
         <parameters>
            <parameter mode="IN" type="geography"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_buffer(geography, double precision, text)" returnType="geography" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g1, radius_of_buffer, buffer_style_parameters - Computes a geometry covering all points within a given distance from a geometry.]]></comment>
         <definition language="sql"><![CDATA[SELECT public.geography(public.ST_Transform(public.ST_Buffer(public.ST_Transform(public.geometry($1), public._ST_BestSRID($1)), $2, $3), public.ST_SRID($1)))]]></definition>
         <parameters>
            <parameter mode="IN" type="geography"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_buffer(geom geometry, radius double precision, options text DEFAULT ''::text)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g1, radius_of_buffer, buffer_style_parameters = ' - Computes a geometry covering all points within a given distance from a geometry.]]></comment>
         <definition language="c"><![CDATA[buffer]]></definition>
         <parameters>
            <parameter mode="IN" name="geom" type="geometry"/>
            <parameter mode="IN" name="radius" type="double precision"/>
            <parameter mode="IN" name="options" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_buffer(geom geometry, radius double precision, quadsegs integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g1, radius_of_buffer, num_seg_quarter_circle - Computes a geometry covering all points within a given distance from a geometry.]]></comment>
         <definition language="sql"><![CDATA[SELECT public.ST_Buffer($1, $2, CAST('quad_segs='||CAST($3 AS text) as text))]]></definition>
         <parameters>
            <parameter mode="IN" name="geom" type="geometry"/>
            <parameter mode="IN" name="radius" type="double precision"/>
            <parameter mode="IN" name="quadsegs" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_buffer(text, double precision)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT public.ST_Buffer($1::public.geometry, $2);]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_buffer(text, double precision, integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT public.ST_Buffer($1::public.geometry, $2, $3);]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_buffer(text, double precision, text)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT public.ST_Buffer($1::public.geometry, $2, $3);]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_buildarea(geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom - Creates a polygonal geometry formed by the linework of a geometry.]]></comment>
         <definition language="c"><![CDATA[ST_BuildArea]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_centroid(geography, use_spheroid boolean DEFAULT true)" returnType="geography" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g1, use_spheroid=true - Returns the geometric center of a geometry.]]></comment>
         <definition language="c"><![CDATA[geography_centroid]]></definition>
         <parameters>
            <parameter mode="IN" type="geography"/>
            <parameter mode="IN" name="use_spheroid" type="boolean"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_centroid(geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g1 - Returns the geometric center of a geometry.]]></comment>
         <definition language="c"><![CDATA[centroid]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_centroid(text)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT public.ST_Centroid($1::public.geometry);]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_chaikinsmoothing(geometry, integer DEFAULT 1, boolean DEFAULT false)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom, nIterations = 1, preserveEndPoints = false - Returns a smoothed version of a geometry, using the Chaikin algorithm]]></comment>
         <definition language="c"><![CDATA[LWGEOM_ChaikinSmoothing]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="integer"/>
            <parameter mode="IN" type="boolean"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_cleangeometry(geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[ST_CleanGeometry]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_clipbybox2d(geom geometry, box box2d)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom, box - Computes the portion of a geometry falling within a rectangle.]]></comment>
         <definition language="c"><![CDATA[ST_ClipByBox2d]]></definition>
         <parameters>
            <parameter mode="IN" name="geom" type="geometry"/>
            <parameter mode="IN" name="box" type="box2d"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_closestpoint(geom1 geometry, geom2 geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom1, geom2 - Returns the 2D point on g1 that is closest to g2. This is the first point of the shortest line from one geometry to the other.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_closestpoint]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_closestpointofapproach(geometry, geometry)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: track1, track2 - Returns a measure at the closest point of approach of two trajectories.]]></comment>
         <definition language="c"><![CDATA[ST_ClosestPointOfApproach]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_clusterdbscan(geometry, eps double precision, minpoints integer)" returnType="integer" securityType="INVOKER" type="WINDOW">
         <comment><![CDATA[args: geom, eps, minpoints - Window function that returns a cluster id for each input geometry using the DBSCAN algorithm.]]></comment>
         <definition language="c"><![CDATA[ST_ClusterDBSCAN]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" name="eps" type="double precision"/>
            <parameter mode="IN" name="minpoints" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_clusterintersecting(geometry)" returnType="geometry[]" securityType="INVOKER" type="AGGREGATE">
         <comment><![CDATA[args: g - Aggregate function that clusters the input geometries into connected sets.]]></comment>
         <definition language="internal"><![CDATA[aggregate_dummy]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_clusterintersecting(geometry[])" returnType="geometry[]" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[clusterintersecting_garray]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry[]"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="st_clusterkmeans(geom geometry, k integer, max_radius double precision DEFAULT NULL::double precision)" returnType="integer" securityType="INVOKER" type="WINDOW">
         <comment><![CDATA[args: geom, number_of_clusters, max_radius - Window function that returns a cluster id for each input geometry using the K-means algorithm.]]></comment>
         <definition language="c"><![CDATA[ST_ClusterKMeans]]></definition>
         <parameters>
            <parameter mode="IN" name="geom" type="geometry"/>
            <parameter mode="IN" name="k" type="integer"/>
            <parameter mode="IN" name="max_radius" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_clusterwithin(geometry, double precision)" returnType="geometry[]" securityType="INVOKER" type="AGGREGATE">
         <comment><![CDATA[args: g, distance - Aggregate function that clusters the input geometries by separation distance.]]></comment>
         <definition language="internal"><![CDATA[aggregate_dummy]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_clusterwithin(geometry[], double precision)" returnType="geometry[]" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[cluster_within_distance_garray]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry[]"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_collect(geom1 geometry, geom2 geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g1, g2 - Creates a GeometryCollection or Multi* geometry from a set of geometries.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_collect]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_collect(geometry)" returnType="geometry" securityType="INVOKER" type="AGGREGATE">
         <comment><![CDATA[args: g1field - Creates a GeometryCollection or Multi* geometry from a set of geometries.]]></comment>
         <definition language="internal"><![CDATA[aggregate_dummy]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_collect(geometry[])" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g1_array - Creates a GeometryCollection or Multi* geometry from a set of geometries.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_collect_garray]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry[]"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_collectionextract(geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: collection - Given a geometry collection, returns a multi-geometry containing only elements of a specified type.]]></comment>
         <definition language="c"><![CDATA[ST_CollectionExtract]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_collectionextract(geometry, integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: collection, type - Given a geometry collection, returns a multi-geometry containing only elements of a specified type.]]></comment>
         <definition language="c"><![CDATA[ST_CollectionExtract]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_collectionhomogenize(geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: collection - Returns the simplest representation of a geometry collection.]]></comment>
         <definition language="c"><![CDATA[ST_CollectionHomogenize]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_combinebbox(box2d, geometry)" returnType="box2d" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[BOX2D_combine]]></definition>
         <parameters>
            <parameter mode="IN" type="box2d"/>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_combinebbox(box3d, box3d)" returnType="box3d" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[BOX3D_combine_BOX3D]]></definition>
         <parameters>
            <parameter mode="IN" type="box3d"/>
            <parameter mode="IN" type="box3d"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_combinebbox(box3d, geometry)" returnType="box3d" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[BOX3D_combine]]></definition>
         <parameters>
            <parameter mode="IN" type="box3d"/>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_concavehull(param_geom geometry, param_pctconvex double precision, param_allow_holes boolean DEFAULT false)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: param_geom, param_pctconvex, param_allow_holes = false - Computes a possibly concave geometry that encloses all input geometry vertices]]></comment>
         <definition language="plpgsql"><![CDATA[DECLARE
		var_convhull public.geometry := public.ST_ForceSFS(public.ST_ConvexHull(param_geom));
		var_param_geom public.geometry := public.ST_ForceSFS(param_geom);
		var_initarea float := public.ST_Area(var_convhull);
		var_newarea float := var_initarea;
		var_div integer := 6; 
		var_tempgeom public.geometry;
		var_tempgeom2 public.geometry;
		var_cent public.geometry;
		var_geoms public.geometry[4]; 
		var_enline public.geometry;
		var_resultgeom public.geometry;
		var_atempgeoms public.geometry[];
		var_buf float := 1; 
	BEGIN
		-- We start with convex hull as our base
		var_resultgeom := var_convhull;

		IF param_pctconvex = 1 THEN
			-- this is the same as asking for the convex hull
			return var_resultgeom;
		ELSIF public.ST_GeometryType(var_param_geom) = 'ST_Polygon' THEN -- it is as concave as it is going to get
			IF param_allow_holes THEN -- leave the holes
				RETURN var_param_geom;
			ELSE -- remove the holes
				var_resultgeom := public.ST_MakePolygon(public.ST_ExteriorRing(var_param_geom));
				RETURN var_resultgeom;
			END IF;
		END IF;
		IF public.ST_Dimension(var_resultgeom) > 1 AND param_pctconvex BETWEEN 0 and 0.99 THEN
		-- get linestring that forms envelope of geometry
			var_enline := public.ST_Boundary(public.ST_Envelope(var_param_geom));
			var_buf := public.ST_Length(var_enline)/1000.0;
			IF public.ST_GeometryType(var_param_geom) = 'ST_MultiPoint' AND public.ST_NumGeometries(var_param_geom) BETWEEN 4 and 200 THEN
			-- we make polygons out of points since they are easier to cave in.
			-- Note we limit to between 4 and 200 points because this process is slow and gets quadratically slow
				var_buf := sqrt(public.ST_Area(var_convhull)*0.8/(public.ST_NumGeometries(var_param_geom)*public.ST_NumGeometries(var_param_geom)));
				var_atempgeoms := ARRAY(SELECT geom FROM public.ST_DumpPoints(var_param_geom));
				-- 5 and 10 and just fudge factors
				var_tempgeom := public.ST_Union(ARRAY(SELECT geom
						FROM (
						-- fuse near neighbors together
						SELECT DISTINCT ON (i) i,  public.ST_Distance(var_atempgeoms[i],var_atempgeoms[j]), public.ST_Buffer(public.ST_MakeLine(var_atempgeoms[i], var_atempgeoms[j]) , var_buf*5, 'quad_segs=3') As geom
								FROM generate_series(1,array_upper(var_atempgeoms, 1)) As i
									INNER JOIN generate_series(1,array_upper(var_atempgeoms, 1)) As j
										ON (
								 NOT public.ST_Intersects(var_atempgeoms[i],var_atempgeoms[j])
									AND public.ST_DWithin(var_atempgeoms[i],var_atempgeoms[j], var_buf*10)
									)
								UNION ALL
						-- catch the ones with no near neighbors
								SELECT i, 0, public.ST_Buffer(var_atempgeoms[i] , var_buf*10, 'quad_segs=3') As geom
								FROM generate_series(1,array_upper(var_atempgeoms, 1)) As i
									LEFT JOIN generate_series(ceiling(array_upper(var_atempgeoms,1)/2)::integer,array_upper(var_atempgeoms, 1)) As j
										ON (
								 NOT public.ST_Intersects(var_atempgeoms[i],var_atempgeoms[j])
									AND public.ST_DWithin(var_atempgeoms[i],var_atempgeoms[j], var_buf*10)
									)
									WHERE j IS NULL
								ORDER BY 1, 2
							) As foo	) );
				IF public.ST_IsValid(var_tempgeom) AND public.ST_GeometryType(var_tempgeom) = 'ST_Polygon' THEN
					var_tempgeom := public.ST_ForceSFS(public.ST_Intersection(var_tempgeom, var_convhull));
					IF param_allow_holes THEN
						var_param_geom := var_tempgeom;
					ELSIF public.ST_GeometryType(var_tempgeom) = 'ST_Polygon' THEN
						var_param_geom := public.ST_ForceSFS(public.ST_MakePolygon(public.ST_ExteriorRing(var_tempgeom)));
					ELSE
						var_param_geom := public.ST_ForceSFS(public.ST_ConvexHull(var_param_geom));
					END IF;
					-- make sure result covers original (#3638)
					var_param_geom := public.ST_Union(param_geom, var_param_geom);
					return var_param_geom;
				ELSIF public.ST_IsValid(var_tempgeom) THEN
					var_param_geom := public.ST_ForceSFS(public.ST_Intersection(var_tempgeom, var_convhull));
				END IF;
			END IF;

			IF public.ST_GeometryType(var_param_geom) = 'ST_Polygon' THEN
				IF NOT param_allow_holes THEN
					var_param_geom := public.ST_ForceSFS(public.ST_MakePolygon(public.ST_ExteriorRing(var_param_geom)));
				END IF;
				-- make sure result covers original (#3638)
				--var_param_geom := public.ST_Union(param_geom, var_param_geom);
				return var_param_geom;
			END IF;
			var_cent := public.ST_Centroid(var_param_geom);
			IF (public.ST_XMax(var_enline) - public.ST_XMin(var_enline) ) > var_buf AND (public.ST_YMax(var_enline) - public.ST_YMin(var_enline) ) > var_buf THEN
					IF public.ST_Dwithin(public.ST_Centroid(var_convhull) , public.ST_Centroid(public.ST_Envelope(var_param_geom)), var_buf/2) THEN
				-- If the geometric dimension is > 1 and the object is symettric (cutting at centroid will not work -- offset a bit)
						var_cent := public.ST_Translate(var_cent, (public.ST_XMax(var_enline) - public.ST_XMin(var_enline))/1000,  (public.ST_YMAX(var_enline) - public.ST_YMin(var_enline))/1000);
					ELSE
						-- uses closest point on geometry to centroid. I can't explain why we are doing this
						var_cent := public.ST_ClosestPoint(var_param_geom,var_cent);
					END IF;
					IF public.ST_DWithin(var_cent, var_enline,var_buf) THEN
						var_cent := public.ST_centroid(public.ST_Envelope(var_param_geom));
					END IF;
					-- break envelope into 4 triangles about the centroid of the geometry and returned the clipped geometry in each quadrant
					FOR i in 1 .. 4 LOOP
					   var_geoms[i] := public.ST_MakePolygon(public.ST_MakeLine(ARRAY[public.ST_PointN(var_enline,i), public.ST_PointN(var_enline,i+1), var_cent, public.ST_PointN(var_enline,i)]));
					   var_geoms[i] := public.ST_ForceSFS(public.ST_Intersection(var_param_geom, public.ST_Buffer(var_geoms[i],var_buf)));
					   IF public.ST_IsValid(var_geoms[i]) THEN

					   ELSE
							var_geoms[i] := public.ST_BuildArea(public.ST_MakeLine(ARRAY[public.ST_PointN(var_enline,i), public.ST_PointN(var_enline,i+1), var_cent, public.ST_PointN(var_enline,i)]));
					   END IF;
					END LOOP;
					var_tempgeom := public.ST_Union(ARRAY[public.ST_ConvexHull(var_geoms[1]), public.ST_ConvexHull(var_geoms[2]) , public.ST_ConvexHull(var_geoms[3]), public.ST_ConvexHull(var_geoms[4])]);
					--RAISE NOTICE 'Curr vex % ', public.ST_AsText(var_tempgeom);
					IF public.ST_Area(var_tempgeom) <= var_newarea AND public.ST_IsValid(var_tempgeom)  THEN --AND public.ST_GeometryType(var_tempgeom) ILIKE '%Polygon'

						var_tempgeom := public.ST_Buffer(public.ST_ConcaveHull(var_geoms[1],least(param_pctconvex + param_pctconvex/var_div),true),var_buf, 'quad_segs=2');
						FOR i IN 1 .. 4 LOOP
							var_geoms[i] := public.ST_Buffer(public.ST_ConcaveHull(var_geoms[i],least(param_pctconvex + param_pctconvex/var_div),true), var_buf, 'quad_segs=2');
							IF public.ST_IsValid(var_geoms[i]) Then
								var_tempgeom := public.ST_Union(var_tempgeom, var_geoms[i]);
							ELSE
								RAISE NOTICE 'Not valid % %', i, public.ST_AsText(var_tempgeom);
								var_tempgeom := public.ST_Union(var_tempgeom, public.ST_ConvexHull(var_geoms[i]));
							END IF;
						END LOOP;

						--RAISE NOTICE 'Curr concave % ', public.ST_AsText(var_tempgeom);
						IF public.ST_IsValid(var_tempgeom) THEN
							var_resultgeom := var_tempgeom;
						END IF;
						var_newarea := public.ST_Area(var_resultgeom);
					ELSIF public.ST_IsValid(var_tempgeom) THEN
						var_resultgeom := var_tempgeom;
					END IF;

					IF public.ST_NumGeometries(var_resultgeom) > 1  THEN
						var_tempgeom := public._ST_ConcaveHull(var_resultgeom);
						IF public.ST_IsValid(var_tempgeom) AND public.ST_GeometryType(var_tempgeom) ILIKE 'ST_Polygon' THEN
							var_resultgeom := var_tempgeom;
						ELSE
							var_resultgeom := public.ST_Buffer(var_tempgeom,var_buf, 'quad_segs=2');
						END IF;
					END IF;
					IF param_allow_holes = false THEN
					-- only keep exterior ring since we do not want holes
						var_resultgeom := public.ST_MakePolygon(public.ST_ExteriorRing(var_resultgeom));
					END IF;
				ELSE
					var_resultgeom := public.ST_Buffer(var_resultgeom,var_buf);
				END IF;
				var_resultgeom := public.ST_ForceSFS(public.ST_Intersection(var_resultgeom, public.ST_ConvexHull(var_param_geom)));
			ELSE
				-- dimensions are too small to cut
				var_resultgeom := public._ST_ConcaveHull(var_param_geom);
			END IF;

			RETURN var_resultgeom;
	END;]]></definition>
         <parameters>
            <parameter mode="IN" name="param_geom" type="geometry"/>
            <parameter mode="IN" name="param_pctconvex" type="double precision"/>
            <parameter mode="IN" name="param_allow_holes" type="boolean"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_contains(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[contains]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_containsproperly(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[containsproperly]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_convexhull(geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA - Computes the convex hull of a geometry.]]></comment>
         <definition language="c"><![CDATA[convexhull]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_coorddim(geometry geometry)" returnType="smallint" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA - Return the coordinate dimension of a geometry.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_ndims]]></definition>
         <parameters>
            <parameter mode="IN" name="geometry" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_coveredby(geog1 geography, geog2 geography)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geography_coveredby]]></definition>
         <parameters>
            <parameter mode="IN" name="geog1" type="geography"/>
            <parameter mode="IN" name="geog2" type="geography"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_coveredby(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[coveredby]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_coveredby(text, text)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT public.ST_CoveredBy($1::public.geometry, $2::public.geometry);]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_covers(geog1 geography, geog2 geography)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geography_covers]]></definition>
         <parameters>
            <parameter mode="IN" name="geog1" type="geography"/>
            <parameter mode="IN" name="geog2" type="geography"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_covers(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[covers]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_covers(text, text)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT public.ST_Covers($1::public.geometry, $2::public.geometry);]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_cpawithin(geometry, geometry, double precision)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: track1, track2, dist - Tests if the closest point of approach of two trajectoriesis within the specified distance.]]></comment>
         <definition language="c"><![CDATA[ST_CPAWithin]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_crosses(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[crosses]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_curvetoline(geom geometry, tol double precision DEFAULT 32, toltype integer DEFAULT 0, flags integer DEFAULT 0)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: curveGeom, tolerance, tolerance_type, flags - Converts a geometry containing curves to a linear geometry.]]></comment>
         <definition language="c"><![CDATA[ST_CurveToLine]]></definition>
         <parameters>
            <parameter mode="IN" name="geom" type="geometry"/>
            <parameter mode="IN" name="tol" type="double precision"/>
            <parameter mode="IN" name="toltype" type="integer"/>
            <parameter mode="IN" name="flags" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_delaunaytriangles(g1 geometry, tolerance double precision DEFAULT 0.0, flags integer DEFAULT 0)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g1, tolerance, flags - Returns the Delaunay triangulation of the vertices of a geometry.]]></comment>
         <definition language="c"><![CDATA[ST_DelaunayTriangles]]></definition>
         <parameters>
            <parameter mode="IN" name="g1" type="geometry"/>
            <parameter mode="IN" name="tolerance" type="double precision"/>
            <parameter mode="IN" name="flags" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_dfullywithin(geom1 geometry, geom2 geometry, double precision)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_dfullywithin]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_difference(geom1 geometry, geom2 geometry, gridsize double precision DEFAULT '-1.0'::numeric)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA, geomB, gridSize = -1 - Computes a geometry representing the part of geometry A that does not intersect geometry B.]]></comment>
         <definition language="c"><![CDATA[ST_Difference]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
            <parameter mode="IN" name="gridsize" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_dimension(geometry)" returnType="integer" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g - Returns the topological dimension of a geometry.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_dimension]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_disjoint(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[disjoint]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_distance(geog1 geography, geog2 geography, use_spheroid boolean DEFAULT true)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geog1, geog2, use_spheroid=true - Returns the distance between two geometry or geography values.]]></comment>
         <definition language="c"><![CDATA[geography_distance]]></definition>
         <parameters>
            <parameter mode="IN" name="geog1" type="geography"/>
            <parameter mode="IN" name="geog2" type="geography"/>
            <parameter mode="IN" name="use_spheroid" type="boolean"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_distance(geom1 geometry, geom2 geometry)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g1, g2 - Returns the distance between two geometry or geography values.]]></comment>
         <definition language="c"><![CDATA[ST_Distance]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_distance(text, text)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT public.ST_Distance($1::public.geometry, $2::public.geometry);]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_distancecpa(geometry, geometry)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: track1, track2 - Returns the distance between the closest point of approach of two trajectories.]]></comment>
         <definition language="c"><![CDATA[ST_DistanceCPA]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_distancesphere(geom1 geometry, geom2 geometry)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[select public.ST_distance( public.geography($1), public.geography($2),false)]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_distancesphere(geom1 geometry, geom2 geometry, radius double precision)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomlonlatA, geomlonlatB, radius=6371008 - Returns minimum distance in meters between two lon/lat geometries using a spherical earth model.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_distance_sphere]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
            <parameter mode="IN" name="radius" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_distancespheroid(geom1 geometry, geom2 geometry)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_distance_ellipsoid]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_distancespheroid(geom1 geometry, geom2 geometry, spheroid)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomlonlatA, geomlonlatB, measurement_spheroid=WGS84 - Returns the minimum distance between two lon/lat geometries using a spheroidal earth model.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_distance_ellipsoid]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
            <parameter mode="IN" type="spheroid"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_dump(geometry)" returnType="SETOF geometry_dump" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g1 - Returns a set of geometry_dump rows for the components of a geometry.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_dump]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_dumppoints(geometry)" returnType="SETOF geometry_dump" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom - Returns a set of geometry_dump rows for the coordinates in a geometry.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_dumppoints]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_dumprings(geometry)" returnType="SETOF geometry_dump" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: a_polygon - Returns a set of geometry_dump rows for the exterior and interior rings of a Polygon.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_dump_rings]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_dumpsegments(geometry)" returnType="SETOF geometry_dump" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom - Returns a set of geometry_dump rows for the segments in a geometry.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_dumpsegments]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_dwithin(geog1 geography, geog2 geography, tolerance double precision, use_spheroid boolean DEFAULT true)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geography_dwithin]]></definition>
         <parameters>
            <parameter mode="IN" name="geog1" type="geography"/>
            <parameter mode="IN" name="geog2" type="geography"/>
            <parameter mode="IN" name="tolerance" type="double precision"/>
            <parameter mode="IN" name="use_spheroid" type="boolean"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_dwithin(geom1 geometry, geom2 geometry, double precision)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_dwithin]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_dwithin(text, text, double precision)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT public.ST_DWithin($1::public.geometry, $2::public.geometry, $3);]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_endpoint(geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g - Returns the last point of a LineString or CircularLineString.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_endpoint_linestring]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_envelope(geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g1 - Returns a geometry representing the bounding box of a geometry.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_envelope]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_equals(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[ST_Equals]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="st_estimatedextent(text, text)" returnType="box2d" securityType="DEFINER" type="FUNCTION">
         <comment><![CDATA[args: table_name, geocolumn_name - Returns the estimated extent of a spatial table.]]></comment>
         <definition language="c"><![CDATA[gserialized_estimated_extent]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="st_estimatedextent(text, text, text)" returnType="box2d" securityType="DEFINER" type="FUNCTION">
         <comment><![CDATA[args: schema_name, table_name, geocolumn_name - Returns the estimated extent of a spatial table.]]></comment>
         <definition language="c"><![CDATA[gserialized_estimated_extent]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="st_estimatedextent(text, text, text, boolean)" returnType="box2d" securityType="DEFINER" type="FUNCTION">
         <comment><![CDATA[args: schema_name, table_name, geocolumn_name, parent_only - Returns the estimated extent of a spatial table.]]></comment>
         <definition language="c"><![CDATA[gserialized_estimated_extent]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="boolean"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_expand(box box2d, dx double precision, dy double precision)" returnType="box2d" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: box, dx, dy - Returns a bounding box expanded from another bounding box or a geometry.]]></comment>
         <definition language="c"><![CDATA[BOX2D_expand]]></definition>
         <parameters>
            <parameter mode="IN" name="box" type="box2d"/>
            <parameter mode="IN" name="dx" type="double precision"/>
            <parameter mode="IN" name="dy" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_expand(box box3d, dx double precision, dy double precision, dz double precision DEFAULT 0)" returnType="box3d" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: box, dx, dy, dz=0 - Returns a bounding box expanded from another bounding box or a geometry.]]></comment>
         <definition language="c"><![CDATA[BOX3D_expand]]></definition>
         <parameters>
            <parameter mode="IN" name="box" type="box3d"/>
            <parameter mode="IN" name="dx" type="double precision"/>
            <parameter mode="IN" name="dy" type="double precision"/>
            <parameter mode="IN" name="dz" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_expand(box2d, double precision)" returnType="box2d" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: box, units_to_expand - Returns a bounding box expanded from another bounding box or a geometry.]]></comment>
         <definition language="c"><![CDATA[BOX2D_expand]]></definition>
         <parameters>
            <parameter mode="IN" type="box2d"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_expand(box3d, double precision)" returnType="box3d" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: box, units_to_expand - Returns a bounding box expanded from another bounding box or a geometry.]]></comment>
         <definition language="c"><![CDATA[BOX3D_expand]]></definition>
         <parameters>
            <parameter mode="IN" type="box3d"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_expand(geom geometry, dx double precision, dy double precision, dz double precision DEFAULT 0, dm double precision DEFAULT 0)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom, dx, dy, dz=0, dm=0 - Returns a bounding box expanded from another bounding box or a geometry.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_expand]]></definition>
         <parameters>
            <parameter mode="IN" name="geom" type="geometry"/>
            <parameter mode="IN" name="dx" type="double precision"/>
            <parameter mode="IN" name="dy" type="double precision"/>
            <parameter mode="IN" name="dz" type="double precision"/>
            <parameter mode="IN" name="dm" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_expand(geometry, double precision)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom, units_to_expand - Returns a bounding box expanded from another bounding box or a geometry.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_expand]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_extent(geometry)" returnType="box2d" securityType="INVOKER" type="AGGREGATE">
         <comment><![CDATA[args: geomfield - Aggregate function that returns the bounding box of geometries.]]></comment>
         <definition language="internal"><![CDATA[aggregate_dummy]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_exteriorring(geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: a_polygon - Returns a LineString representing the exterior ring of a Polygon.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_exteriorring_polygon]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_filterbym(geometry, double precision, double precision DEFAULT NULL::double precision, boolean DEFAULT false)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom, min, max = null, returnM = false - Removes vertices based on their M value]]></comment>
         <definition language="c"><![CDATA[LWGEOM_FilterByM]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="boolean"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="st_findextent(text, text)" returnType="box2d" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="plpgsql"><![CDATA[DECLARE
	tablename alias for $1;
	columnname alias for $2;
	myrec RECORD;

BEGIN
	FOR myrec IN EXECUTE 'SELECT public.ST_Extent("' || columnname || '") As extent FROM "' || tablename || '"' LOOP
		return myrec.extent;
	END LOOP;
END;]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="st_findextent(text, text, text)" returnType="box2d" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="plpgsql"><![CDATA[DECLARE
	schemaname alias for $1;
	tablename alias for $2;
	columnname alias for $3;
	myrec RECORD;
BEGIN
	FOR myrec IN EXECUTE 'SELECT public.ST_Extent("' || columnname || '") As extent FROM "' || schemaname || '"."' || tablename || '"' LOOP
		return myrec.extent;
	END LOOP;
END;]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_flipcoordinates(geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom - Returns a version of a geometry with X and Y axis flipped.]]></comment>
         <definition language="c"><![CDATA[ST_FlipCoordinates]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_force2d(geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA - Force the geometries into a "2-dimensional mode".]]></comment>
         <definition language="c"><![CDATA[LWGEOM_force_2d]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_force3d(geom geometry, zvalue double precision DEFAULT 0.0)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA, Zvalue = 0.0 - Force the geometries into XYZ mode. This is an alias for ST_Force3DZ.]]></comment>
         <definition language="sql"><![CDATA[SELECT public.ST_Force3DZ($1, $2)]]></definition>
         <parameters>
            <parameter mode="IN" name="geom" type="geometry"/>
            <parameter mode="IN" name="zvalue" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_force3dm(geom geometry, mvalue double precision DEFAULT 0.0)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA, Mvalue = 0.0 - Force the geometries into XYM mode.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_force_3dm]]></definition>
         <parameters>
            <parameter mode="IN" name="geom" type="geometry"/>
            <parameter mode="IN" name="mvalue" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_force3dz(geom geometry, zvalue double precision DEFAULT 0.0)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA, Zvalue = 0.0 - Force the geometries into XYZ mode.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_force_3dz]]></definition>
         <parameters>
            <parameter mode="IN" name="geom" type="geometry"/>
            <parameter mode="IN" name="zvalue" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_force4d(geom geometry, zvalue double precision DEFAULT 0.0, mvalue double precision DEFAULT 0.0)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA, Zvalue = 0.0, Mvalue = 0.0 - Force the geometries into XYZM mode.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_force_4d]]></definition>
         <parameters>
            <parameter mode="IN" name="geom" type="geometry"/>
            <parameter mode="IN" name="zvalue" type="double precision"/>
            <parameter mode="IN" name="mvalue" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_forcecollection(geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA - Convert the geometry into a GEOMETRYCOLLECTION.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_force_collection]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_forcecurve(geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g - Upcast a geometry into its curved type, if applicable.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_force_curve]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_forcepolygonccw(geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom - Orients all exterior rings counter-clockwise and all interior rings clockwise.]]></comment>
         <definition language="sql"><![CDATA[SELECT public.ST_Reverse(public.ST_ForcePolygonCW($1))]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_forcepolygoncw(geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom - Orients all exterior rings clockwise and all interior rings counter-clockwise.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_force_clockwise_poly]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_forcerhr(geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g - Force the orientation of the vertices in a polygon to follow the Right-Hand-Rule.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_force_clockwise_poly]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_forcesfs(geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA - Force the geometries to use SFS 1.1 geometry types only.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_force_sfs]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_forcesfs(geometry, version text)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA, version - Force the geometries to use SFS 1.1 geometry types only.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_force_sfs]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" name="version" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_frechetdistance(geom1 geometry, geom2 geometry, double precision DEFAULT '-1'::integer)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g1, g2, densifyFrac = -1 - Returns the Fréchet distance between two geometries.]]></comment>
         <definition language="c"><![CDATA[ST_FrechetDistance]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_fromflatgeobuf(anyelement, bytea)" returnType="SETOF anyelement" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[pgis_fromflatgeobuf]]></definition>
         <parameters>
            <parameter mode="IN" type="anyelement"/>
            <parameter mode="IN" type="bytea"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_fromflatgeobuftotable(text, text, bytea)" returnType="void" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[pgis_tablefromflatgeobuf]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="bytea"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="st_generatepoints(area geometry, npoints integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g, npoints - Generates random points contained in a Polygon or MultiPolygon.]]></comment>
         <definition language="c"><![CDATA[ST_GeneratePoints]]></definition>
         <parameters>
            <parameter mode="IN" name="area" type="geometry"/>
            <parameter mode="IN" name="npoints" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_generatepoints(area geometry, npoints integer, seed integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g, npoints, seed - Generates random points contained in a Polygon or MultiPolygon.]]></comment>
         <definition language="c"><![CDATA[ST_GeneratePoints]]></definition>
         <parameters>
            <parameter mode="IN" name="area" type="geometry"/>
            <parameter mode="IN" name="npoints" type="integer"/>
            <parameter mode="IN" name="seed" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_geogfromtext(text)" returnType="geography" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geography_from_text]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_geogfromwkb(bytea)" returnType="geography" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geography_from_binary]]></definition>
         <parameters>
            <parameter mode="IN" type="bytea"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_geographyfromtext(text)" returnType="geography" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geography_from_text]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_geohash(geog geography, maxchars integer DEFAULT 0)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[ST_GeoHash]]></definition>
         <parameters>
            <parameter mode="IN" name="geog" type="geography"/>
            <parameter mode="IN" name="maxchars" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_geohash(geom geometry, maxchars integer DEFAULT 0)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[ST_GeoHash]]></definition>
         <parameters>
            <parameter mode="IN" name="geom" type="geometry"/>
            <parameter mode="IN" name="maxchars" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_geomcollfromtext(text)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT CASE
	WHEN public.geometrytype(public.ST_GeomFromText($1)) = 'GEOMETRYCOLLECTION'
	THEN public.ST_GeomFromText($1)
	ELSE NULL END]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_geomcollfromtext(text, integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT CASE
	WHEN public.geometrytype(public.ST_GeomFromText($1, $2)) = 'GEOMETRYCOLLECTION'
	THEN public.ST_GeomFromText($1,$2)
	ELSE NULL END]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_geomcollfromwkb(bytea)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT CASE
	WHEN public.geometrytype(public.ST_GeomFromWKB($1)) = 'GEOMETRYCOLLECTION'
	THEN public.ST_GeomFromWKB($1)
	ELSE NULL END]]></definition>
         <parameters>
            <parameter mode="IN" type="bytea"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_geomcollfromwkb(bytea, integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT CASE
	WHEN public.geometrytype(public.ST_GeomFromWKB($1, $2)) = 'GEOMETRYCOLLECTION'
	THEN public.ST_GeomFromWKB($1, $2)
	ELSE NULL END]]></definition>
         <parameters>
            <parameter mode="IN" type="bytea"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_geometricmedian(g geometry, tolerance double precision DEFAULT NULL::double precision, max_iter integer DEFAULT 10000, fail_if_not_converged boolean DEFAULT false)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom, tolerance = NULL, max_iter = 10000, fail_if_not_converged = false - Returns the geometric median of a MultiPoint.]]></comment>
         <definition language="c"><![CDATA[ST_GeometricMedian]]></definition>
         <parameters>
            <parameter mode="IN" name="g" type="geometry"/>
            <parameter mode="IN" name="tolerance" type="double precision"/>
            <parameter mode="IN" name="max_iter" type="integer"/>
            <parameter mode="IN" name="fail_if_not_converged" type="boolean"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_geometryfromtext(text)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_from_text]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_geometryfromtext(text, integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_from_text]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_geometryn(geometry, integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA, n - Return an element of a geometry collection.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_geometryn_collection]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_geometrytype(geometry)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g1 - Returns the SQL-MM type of a geometry as text.]]></comment>
         <definition language="c"><![CDATA[geometry_geometrytype]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_geomfromewkb(bytea)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOMFromEWKB]]></definition>
         <parameters>
            <parameter mode="IN" type="bytea"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_geomfromewkt(text)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[parse_WKT_lwgeom]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_geomfromgeohash(text, integer DEFAULT NULL::integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT CAST(public.ST_Box2dFromGeoHash($1, $2) AS geometry);]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_geomfromgeojson(json)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT public.ST_GeomFromGeoJson($1::text)]]></definition>
         <parameters>
            <parameter mode="IN" type="json"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_geomfromgeojson(jsonb)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT public.ST_GeomFromGeoJson($1::text)]]></definition>
         <parameters>
            <parameter mode="IN" type="jsonb"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_geomfromgeojson(text)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geom_from_geojson]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_geomfromgml(text)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT public._ST_GeomFromGML($1, 0)]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_geomfromgml(text, integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geom_from_gml]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_geomfromkml(text)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geom_from_kml]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_geomfrommarc21(marc21xml text)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[ST_GeomFromMARC21]]></definition>
         <parameters>
            <parameter mode="IN" name="marc21xml" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_geomfromtext(text)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_from_text]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_geomfromtext(text, integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_from_text]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_geomfromtwkb(bytea)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOMFromTWKB]]></definition>
         <parameters>
            <parameter mode="IN" type="bytea"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_geomfromwkb(bytea)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_from_WKB]]></definition>
         <parameters>
            <parameter mode="IN" type="bytea"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_geomfromwkb(bytea, integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT public.ST_SetSRID(public.ST_GeomFromWKB($1), $2)]]></definition>
         <parameters>
            <parameter mode="IN" type="bytea"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_gmltosql(text)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT public._ST_GeomFromGML($1, 0)]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_gmltosql(text, integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geom_from_gml]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_hasarc(geometry geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA - Tests if a geometry contains a circular arc]]></comment>
         <definition language="c"><![CDATA[LWGEOM_has_arc]]></definition>
         <parameters>
            <parameter mode="IN" name="geometry" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_hausdorffdistance(geom1 geometry, geom2 geometry)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g1, g2 - Returns the Hausdorff distance between two geometries.]]></comment>
         <definition language="c"><![CDATA[hausdorffdistance]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_hausdorffdistance(geom1 geometry, geom2 geometry, double precision)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g1, g2, densifyFrac - Returns the Hausdorff distance between two geometries.]]></comment>
         <definition language="c"><![CDATA[hausdorffdistancedensify]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_hexagon(size double precision, cell_i integer, cell_j integer, origin geometry DEFAULT '010100000000000000000000000000000000000000'::geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: size, cell_i, cell_j, origin - Returns a single hexagon, using the provided edge size and cell coordinate within the hexagon grid space.]]></comment>
         <definition language="c"><![CDATA[ST_Hexagon]]></definition>
         <parameters>
            <parameter mode="IN" name="size" type="double precision"/>
            <parameter mode="IN" name="cell_i" type="integer"/>
            <parameter mode="IN" name="cell_j" type="integer"/>
            <parameter mode="IN" name="origin" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_hexagongrid(size double precision, bounds geometry, OUT geom geometry, OUT i integer, OUT j integer)" returnType="SETOF record" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: size, bounds - Returns a set of hexagons and cell indices that completely cover the bounds of the geometry argument.]]></comment>
         <definition language="c"><![CDATA[ST_ShapeGrid]]></definition>
         <parameters>
            <parameter mode="IN" name="size" type="double precision"/>
            <parameter mode="IN" name="bounds" type="geometry"/>
            <parameter mode="OUT" name="geom" type="geometry"/>
            <parameter mode="OUT" name="i" type="integer"/>
            <parameter mode="OUT" name="j" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_interiorringn(geometry, integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: a_polygon, n - Returns the Nth interior ring (hole) of a Polygon.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_interiorringn_polygon]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_interpolatepoint(line geometry, point geometry)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: linear_geom_with_measure, point - Returns the interpolated measure of a geometry closest to a point.]]></comment>
         <definition language="c"><![CDATA[ST_InterpolatePoint]]></definition>
         <parameters>
            <parameter mode="IN" name="line" type="geometry"/>
            <parameter mode="IN" name="point" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_intersection(geography, geography)" returnType="geography" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geogA, geogB - Computes a geometry representing the shared portion of geometries A and B.]]></comment>
         <definition language="sql"><![CDATA[SELECT public.geography(public.ST_Transform(public.ST_Intersection(public.ST_Transform(public.geometry($1), public._ST_BestSRID($1, $2)), public.ST_Transform(public.geometry($2), public._ST_BestSRID($1, $2))), public.ST_SRID($1)))]]></definition>
         <parameters>
            <parameter mode="IN" type="geography"/>
            <parameter mode="IN" type="geography"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_intersection(geom1 geometry, geom2 geometry, gridsize double precision DEFAULT '-1'::integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA, geomB, gridSize = -1 - Computes a geometry representing the shared portion of geometries A and B.]]></comment>
         <definition language="c"><![CDATA[ST_Intersection]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
            <parameter mode="IN" name="gridsize" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_intersection(text, text)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT public.ST_Intersection($1::public.geometry, $2::public.geometry);]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_intersects(geog1 geography, geog2 geography)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[geography_intersects]]></definition>
         <parameters>
            <parameter mode="IN" name="geog1" type="geography"/>
            <parameter mode="IN" name="geog2" type="geography"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_intersects(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[ST_Intersects]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_intersects(text, text)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT public.ST_Intersects($1::public.geometry, $2::public.geometry);]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_isclosed(geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g - Tests if a LineStringss start and end points are coincident. For a PolyhedralSurface tests if it is closed (volumetric).]]></comment>
         <definition language="c"><![CDATA[LWGEOM_isclosed]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_iscollection(geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g - Tests if a geometry is a geometry collection type.]]></comment>
         <definition language="c"><![CDATA[ST_IsCollection]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_isempty(geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA - Tests if a geometry is empty.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_isempty]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_ispolygonccw(geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom - Tests if Polygons have exterior rings oriented counter-clockwise and interior rings oriented clockwise.]]></comment>
         <definition language="c"><![CDATA[ST_IsPolygonCCW]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_ispolygoncw(geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom - Tests if Polygons have exterior rings oriented clockwise and interior rings oriented counter-clockwise.]]></comment>
         <definition language="c"><![CDATA[ST_IsPolygonCW]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_isring(geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g - Tests if a LineString is closed and simple.]]></comment>
         <definition language="c"><![CDATA[isring]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_issimple(geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA - Tests if a geometry has no points of self-intersection or self-tangency.]]></comment>
         <definition language="c"><![CDATA[issimple]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_isvalid(geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g - Tests if a geometry is well-formed in 2D.]]></comment>
         <definition language="c"><![CDATA[isvalid]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_isvalid(geometry, integer)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g, flags - Tests if a geometry is well-formed in 2D.]]></comment>
         <definition language="sql"><![CDATA[SELECT (public.ST_isValidDetail($1, $2)).valid]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_isvaliddetail(geom geometry, flags integer DEFAULT 0)" returnType="valid_detail" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom, flags - Returns a valid_detail row stating if a geometry is valid or if not a reason and a location.]]></comment>
         <definition language="c"><![CDATA[isvaliddetail]]></definition>
         <parameters>
            <parameter mode="IN" name="geom" type="geometry"/>
            <parameter mode="IN" name="flags" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_isvalidreason(geometry)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA - Returns text stating if a geometry is valid, or a reason for invalidity.]]></comment>
         <definition language="c"><![CDATA[isvalidreason]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_isvalidreason(geometry, integer)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA, flags - Returns text stating if a geometry is valid, or a reason for invalidity.]]></comment>
         <definition language="sql"><![CDATA[SELECT CASE WHEN valid THEN 'Valid Geometry' ELSE reason END FROM (
		SELECT (public.ST_isValidDetail($1, $2)).*
	) foo]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_isvalidtrajectory(geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: line - Tests if the geometry is a valid trajectory.]]></comment>
         <definition language="c"><![CDATA[ST_IsValidTrajectory]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_length(geog geography, use_spheroid boolean DEFAULT true)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geog, use_spheroid=true - Returns the 2D length of a linear geometry.]]></comment>
         <definition language="c"><![CDATA[geography_length]]></definition>
         <parameters>
            <parameter mode="IN" name="geog" type="geography"/>
            <parameter mode="IN" name="use_spheroid" type="boolean"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_length(geometry)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: a_2dlinestring - Returns the 2D length of a linear geometry.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_length2d_linestring]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_length(text)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT public.ST_Length($1::public.geometry);]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_length2d(geometry)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: a_2dlinestring - Returns the 2D length of a linear geometry. Alias for ST_Length]]></comment>
         <definition language="c"><![CDATA[LWGEOM_length2d_linestring]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_length2dspheroid(geometry, spheroid)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_length2d_ellipsoid]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="spheroid"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_lengthspheroid(geometry, spheroid)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: a_geometry, a_spheroid - Returns the 2D or 3D length/perimeter of a lon/lat geometry on a spheroid.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_length_ellipsoid_linestring]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="spheroid"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_letters(letters text, font json DEFAULT NULL::json)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args:  letters,  font - Returns the input letters rendered as geometry with a default start position at the origin and default text height of 100.]]></comment>
         <definition language="plpgsql"><![CDATA[DECLARE
  letterarray text[];
  letter text;
  geom geometry;
  prevgeom geometry = NULL;
  adjustment float8 = 0.0;
  position float8 = 0.0;
  text_height float8 = 100.0;
  width float8;
  m_width float8;
  spacing float8;
  dist float8;
  wordarr geometry[];
  wordgeom geometry;
  -- geometry has been run through replace(encode(st_astwkb(geom),'base64'), E'\n', '')
  font_default_height float8 = 1000.0;
  font_default json = '{
  "!":"BgACAQhUrgsTFOQCABQAExELiwi5AgAJiggBYQmJCgAOAg4CDAIOBAoEDAYKBgoGCggICAgICAgGCgYKBgoGCgQMBAoECgQMAgoADAIKAAoADAEKAAwBCgMKAQwDCgMKAwoFCAUKBwgHBgcIBwYJBgkECwYJBAsCDQILAg0CDQANAQ0BCwELAwsDCwUJBQkFCQcHBwcHBwcFCQUJBQkFCQMLAwkDCQMLAQkACwEJAAkACwIJAAsCCQQJAgsECQQJBAkGBwYJCAcIBQgHCAUKBQoDDAUKAQwDDgEMAQ4BDg==",
  "&":"BgABAskBygP+BowEAACZAmcAANsCAw0FDwUNBQ0FDQcLBw0HCwcLCQsJCwkLCQkJCwsJCwkLCQ0HCwcNBw8HDQUPBQ8DDwMRAw8DEQERAREBEQERABcAFQIXAhUCEwQVBBMGEwYTBhEIEQgPChEKDwoPDA0MDQwNDgsOCRAJEAkQBxAHEgUSBRQFFAMUAxQBFgEWARgAigEAFAISABICEgQQAhAEEAQQBg4GEAoOCg4MDg4ODgwSDgsMCwoJDAcMBwwFDgUMAw4DDgEOARABDgEQARIBEAASAHgAIAQeBB4GHAgaChoMGA4WDhYQFBISEhISDhQQFAwWDBYKFgoYBhgIGAQYBBgCGgAaABgBGAMYAxYHFgUWCRYJFAsUCxIPEg0SERARDhMOFQwVDBcIGQYbBhsCHQIfAR+dAgAADAAKAQoBCgEIAwgFBgUGBQYHBAUEBwQHAgcCBwIHAAcABwAHAQcBBwMHAwUDBwUFBQUHBQUBBwMJAQkBCQAJAJcBAAUCBQAFAgUEBQIDBAUEAwQDBgMEAQYDBgEGAAgBBgAKSeECAJ8BFi84HUQDQCAAmAKNAQAvExMx",
  "\"":"BgACAQUmwguEAgAAkwSDAgAAlAQBBfACAIACAACTBP8BAACUBA==",
  "''":"BgABAQUmwguEAgAAkwSDAgAAlAQ=",
  "(":"BgABAUOQBNwLDScNKw0rCysLLwsxCTEJMwc1BzcHNwM7AzsDPwE/AEEANwI1AjMEMwIzBjEGLwYvCC0ILQgrCCkKKQonCicMJbkCAAkqCSoHLAksBywFLgcuBS4FMAMwAzADMgEwATQBMgA0ADwCOgI6BDoEOAY4BjYINgg2CjQKMgoyCjIMMAwwDi7AAgA=",
  ")":"BgABAUMQ3Au6AgAOLQwvDC8KMQoxCjEKMwg1CDUGNQY3BDcEOQI5AjkAOwAzATEBMQExAy8DLwMvBS8FLQctBS0HKwktBykJKwkpswIADCYKKAooCioIKggsCC4ILgYwBjAGMgQ0AjQCNAI2ADgAQgFAAz4DPAM8BzgHOAc2CTQJMgsyCzALLg0sDSoNKg==",
  "+":"BgABAQ3IBOwGALcBuAEAANUBtwEAALcB0wEAALgBtwEAANYBuAEAALgB1AEA",
  "/":"BgABAQVCAoIDwAuyAgCFA78LrQIA",
  "4":"BgABAhDkBr4EkgEAEREApwJ/AADxARIR5QIAEhIA9AHdAwAA7ALIA9AG6gIAEREA8QYFqwIAAIIDwwH/AgABxAEA",
  "v":"BgABASDmA5AEPu4CROwBExb6AgAZFdMC0wgUFaECABIU0wLWCBcW+AIAExVE6wEEFQQXBBUEFwQVBBUEFwQVBBUEFwQVBBUEFwQXBBUEFwYA",
  ",":"BgABAWMYpAEADgIOAgwCDgQMBAoGDAYKBgoICAgICAgICAoGCgYKBAoEDAQKBAoCDAIKAgwCCgAKAAwACgEMAQoBCgMMAwoDCgUKBQgFCgUIBwYJCAcGCQYJBAsGCQQLAg0CCwINAg0AAwABAAMAAwADAQMAAwADAAMBBQAFAQcBBwEHAwcBCQMJAQsDCwMLAw0FDQMNBQ8FDwURBxMFEwkTBxcJFwkXswEAIMgBCQYJBgkGBwYJCAcIBQgHCgUKBQoFDAEMAwwBDgEOABA=",
  "-":"BgABAQUq0AMArALEBAAAqwLDBAA=",
  ".":"BgABAWFOrAEADgIOAg4CDgQMBAoGDAYKBgoICAgKCAgIBgoGCgYKBgoEDAQKBAwECgIMAAwCDAAMAAwBCgAMAQoDDAMKAwoDCgUKBQgFCgUIBwgJBgcICQYJBgsGCQQLAg0CDQINAA0ADQENAQ0BCwMNAwkFCwUJBQkHBwcJBwUHBwkFCQUJBQkDCwMJAwsDCQELAAsBCwALAAsCCQALAgkECwQJBAkECQYJBgcGBwgJBgcKBQgHCgUKBQwFCgEOAwwBDgEOAA4=",
  "0":"BgABAoMB+APaCxwAHAEaARoDFgMYBRYFFAcUBxIJEgkQCRALEAsOCwwNDA0MDQoPCg0IDwgPBhEGDwYRBA8EEQIRAhMCEQITABMA4QUAEQETAREBEQMRAxEFEQURBREHDwkPBw8JDwsNCw0LDQ0NDQsNCw8JEQkRCREJEwcTBxUFFQUVAxUDFwEXARkAGQAZAhcCFwQXBBUGEwYTCBMIEQoRCg8KDwoPDA0MDQ4NDgsOCQ4JEAkQBxAHEAUSBRIDEgMSAxIDEgESARQAEgDiBQASAhQCEgISBBIEEgYSBhIGEggQChAIEAoQDBAMDgwODg4ODA4MEgwQChIKEggUCBQIFgYWBBYGGAQYAhgCGgILZIcDHTZBEkMRHTUA4QUeOUITRBIePADiBQ==",
  "2":"BgABAWpUwALUA44GAAoBCAEKAQgDBgMGBQYFBgUEBwQFBAUCBwIHAgUABwAHAAUBBwMFAQcFBQMHBQUHBQcFBwMJAwkBCQELAQsAC68CAAAUAhIAFAISBBQCEgQUBBIEEgYUCBIGEAgSChAKEAoQDBAMDg4ODgwQDBIMEgoSChQIFggWCBgGGAQaAhwCHAIWABQBFgEUARQDFAMSAxQFEgUSBxIHEAkQCRALDgsODQ4NDA8KDwwRCBMKEwgTBhUGFwQXBBcEGwAbABsAHQEftwPJBdIDAACpAhIPzwYAFBIArgI=",
  "1":"BgABARCsBLALAJ0LEhERADcA2QEANwATABQSAOYIpwEAALgCERKEBAASABER",
  "3":"BgABAZ0B/gbEC/sB0QQOAwwBDAMMAwwFCgMKBQoFCgUIBwoFCAcICQgJBgkICQYLCAsECwYLBA0GDwINBA8CDwQRAhECEQITABUCFQAVAH0AEQETAREBEQETAxEDEQURBREFDwcRBw8JDwkNCQ8LDQsNDQsNCw0LDwsPCREJEQcRBxMFFQUVBRUDFwEXARkAGQAZAhkCFwQVBBUEEwYTCBEIEQgRCg0MDwoNDA0OCw4LDgkQCRAHEAkQBRAFEgUSAxIDFAMSAxYBFAEWARYAFqQCAAALAgkCCQQHAgcGBwYHBgUIBQYDCAMIAwYDCAEIAQgACAAIAAgCCAIIAgYCCAQIBAgGBgYEBgQIBAoCCgAKAAwAvAEABgEIAAYBBgMGAwQDBgMEBQQDBAUCBQQFAgUABwIFAJkBAACmAaIB3ALbAgAREQDmAhIRggYA",
  "5":"BgABAaAB0APgBxIAFAESABIBEgMSARADEgMQAxIFEAcOBRAHDgkOCQ4JDgsMCwwLCgsKDQoPCA0IDwgPBhEEEwYTAhMEFwIXABcAiQIAEwETABEBEQMTAxEDDwMRBQ8FDwUPBw8JDQcNCQ0LDQsLCwsNCw0JDwkPCREHEQcTBxMFEwMVAxcDGQEZARkAFwAVAhUCFQQTBBMGEwYRCBEIDwoPCg8KDQwNDA0MCw4LDgkOCRAJEAcOBxAHEgUQBRIDEAMSAxIBEgEUARIAFLgCAAAFAgUABQIFBAUCBQQDBAUEAwYDBgMIAwgBCAEIAQoACAAIAgYACAQGAgQEBgQEBAQGBAQCBgIGAgYCBgIIAAYA4AEABgEIAAYBBgMGAQQDBgMEAwQFBAMCBQQFAgUABwIFAPkBAG+OAQCCBRESAgAAAuYFABMRAK8CjQMAAJ8BNgA=",
  "7":"BgABAQrQBsILhQOvCxQR7wIAEhK+AvYIiwMAAKgCERKwBgA=",
  "6":"BgABAsYBnAOqBxgGFgYYBBYEFgIWABQBFgEUAxQDFAUUBRIFEAcSCRAJEAkOCw4NDgsMDQoPCg8KDwgRCBEGEQYRBBMCEwITAhUAkwIBAAERAREBEQEPAxEFEQMPBREFDwcPBw8HDwkNCQ0LDQsNCwsNCw0LDQkPCQ8JDwcRBxEHEwUTAxMFFQEXAxcBGQAVABUCEwIVBBMEEQYTBhEIEQgPChEKDQoPDA0MDQwNDgsOCxALDgkQCRAHEgcQBxIFEgUSBRIBFAMSARIBFAASAOIFABACEgIQAhIEEAQQBhIGEAYQCBAKEAgOChAMDgwMDA4ODA4MDgwODBAKEAoQChIIEggSBhQGFgYUAhYCGAIYABoAGAEYARYBFgMUBRQFEgUSBxAHEAcQCQ4LDgkMCwwNDA0KDQgPCg0GEQgPBhEEEQQRBBMEEwITAhMCFQIVABWrAgAACgEIAQoBCAEGAwYDBgUGBQQFBAUEBQQFAgUABwIFAAUABwEFAAUBBQMFAwUDBQMFBQMFAwUBBQEHAQkBBwAJAJcBDUbpBDASFi4A4AETLC8SBQAvERUrAN8BFC0yEQQA",
  "8":"BgABA9gB6gPYCxYAFAEUARYBEgMUBRQFEgUSBxIHEAcSCQ4JEAkOCw4LDgsMDQwNCg0KDQoPCg8IDwgPBhEGEQQPBBMCEQIRABMAQwAxAA8BEQEPAREDDwMRAw8FEQUPBxEJDwkPCQ8NDw0PDQ8IBwYHCAcGBwgHBgkGBwYJBgcECQYJBAkGCQQJBAsECwQLBA0CCwINAg8CDwIPAA8AaQATAREBEwERAxEFEQURBREHEQcPBw8JDwkPCw8LDQsNDQ0LCw0LDwsNCQ8JDwcPBw8HEQURAxEFEQMRARMBEwFDABEAEwIRAhEEEQQRBg8GEQgPCA8KDwoPCg0MDQwNDAsOCw4LDgkQCRAJDgkQBxIHEAcSBRADEgMUAxIBFAEUABQAagAOAhAADgIOAg4EDAIOBAwEDAQMBgwECgYMBAoGCAYKBgoGCggKBgoICgYICAoICA0MCwwLDgsOCRAHEAcQBxIFEgUSAxIDEgMSARABEgASADIARAASAhICEgQSAhIGEAYSBhAIEAgQCBAKDgoODA4MDgwMDgwODA4KEAwQCBIKEggSCBQIFAYUBBQEFgQWAhYCGAANT78EFis0EwYANBIYLgC0ARcsMRQFADERGS0AswELogHtAhcuNxA3DRkvALMBGjE6ETYSGDIAtAE=",
  "9":"BgABAsYBpASeBBcFFQUXAxUDFQEVABMCFQITBBMEEwYRBhMGDwgRCg8KDwoNDA0OCwwNDgkQCRAJEAcSBxIFEgUSAxQBFAEUARYAlAICAAISAhICEgQSAhAGEgQQBhIGEAgSCA4IEAoOChAMDAwODAwODA4MEAoOChAKEAgSCBIIFAYUBBQGFgIYBBgCGgAWABYBFAEWAxQDEgUUBRIHEgcQCRIJEAkOCw4LDgsODQwNDA0MDwoPCg8IDwgRCBEGEQYRBhEEEQITAhECEwARAOEFAA8BEQEPAREDDwMPBREFDwUPBw8JDwcNCQ8LDQsLCw0NCw0LDQsNCw8JEQkPCREHEQcTBRMFEwUTARUBFQEXABkAFwIXAhcCFQQTBhMGEQYRCA8IDwgNCg8MCwoLDAsOCQ4JDgkQBxAHEAUQBRIFEgMSAxQDFAEUAxQAFgEWABamAgAACwIJAgkCCQIHBAcEBwYFBgUGAwYDBgMGAQgBBgEIAAgABgIIAgYCBgQGBAYEBgYGBgQIBAgECAIKAgoCCgAMAJgBDUXqBC8RFS0A3wEUKzARBgAwEhYsAOABEy4xEgMA",
  ":":"BgACAWE0rAEADgIOAg4CDgQMBAoGDAYKBgoICAgKCAgIBgoGCgYKBgoEDAQKBAwECgIMAAwCDAAMAAwBCgAMAQoDDAMKAwoDCgUKBQgFCgUIBwgJBgcICQYJBgsGCQQLAg0CDQINAA0ADQENAQ0BCwMNAwkFCwUJBQkHBwcJBwUHBwkFCQUJBQkDCwMJAwsDCQELAAsBCwALAAsCCQALAgkECwQJBAkECQYJBgcGBwgJBgcKBQgHCgUKBQwFCgEOAwwBDgEOAA4BYQDqBAAOAg4CDgIOBAwECgYMBgoGCggICAoICAgGCgYKBgoGCgQMBAoEDAQKAgwADAIMAAwADAEKAAwBCgMMAwoDCgMKBQoFCAUKBQgHCAkGBwgJBgkGCwYJBAsCDQINAg0ADQANAQ0BDQELAw0DCQULBQkFCQcHBwkHBQcHCQUJBQkFCQMLAwkDCwEJAwsACwELAAsACwIJAAsECQILBAkECQQJBgkGBwYHCAkGBwoFCAcKBQoFDAUKAQ4DDAEOAQ4ADg==",
  "x":"BgABARHmAoAJMIMBNLUBNrYBMIQB1AIA9QG/BI4CvwTVAgA5hgFBwAFFxwE1fdUCAI4CwATzAcAE1AIA",
  ";":"BgACAWEslgYADgIOAg4CDgQMBAoGDAYKBgoICAgKCAgIBgoGCgYKBgoEDAQKBAwECgIMAAwCDAAMAAwBCgAMAQoDDAMKAwoDCgUKBQgFCgUIBwgJBgcICQYJBgsGCQQLAg0CDQINAA0ADQENAQ0BCwMNAwkFCwUJBQkHBwcJBwUHBwkFCQUJBQkDCwMJAwsBCQMLAAsBCwALAAsCCQALBAkCCwQJBAkECQYJBgcGBwgJBgcKBQgHCgUKBQwFCgEOAwwBDgEOAA4BYwjxBAAOAg4CDAIOBAwECgYMBgoGCggICAgICAgICgYKBgoECgQMBAoECgIMAgoCDAIKAAoADAAKAQwBCgEKAwwDCgMKBQoFCAUKBQgHBgkIBwYJBgkECwYJBAsCDQILAg0CDQADAAEAAwADAAMBAwADAAMAAwEFAAUBBwEHAQcDBwEJAwkBCwMLAwsDDQUNAw0FDwUPBREHEwUTCRMHFwkXCRezAQAgyAEJBgkGCQYHBgkIBwgFCAcKBQoFCgUMAQwDDAEOAQ4AEA==",
  "=":"BgACAQUawAUA5gHEBAAA5QHDBAABBQC5AgDsAcQEAADrAcMEAA==",
  "B":"BgABA2e2BMQLFgAUARQBFAEUAxIDEgUSBRIFEAcQBxAJDgkOCQ4LDgsMCwwNDA0KDQgNCg0IDwYPBg8GDwQRBBEEEQIRAhMAEwAHAAkABwEHAAkBCQAHAQkBCQEHAQkBCQMJAwcDCQMJAwkFBwUJAwkHCQUHBQkHCQcJBwcHBwkHBwcJBwsHCQUQBQ4FDgcOCQ4JDAkMCwoNCg0IDwgRBhMEFQQXAhcCGwDJAQEvAysFJwklDSMPHREbFRkXFRsTHw8fCyUJJwcrAy0B6wMAEhIAoAsREuYDAAiRAYEElgEAKioSSA1EOR6JAQAA0wEJkAGPBSwSEiwAzAETKikSjwEAAMUCkAEA",
  "A":"BgABAg/KBfIBqQIAN98BEhHzAgAWEuwCngsREvwCABMR8gKdCxIR8QIAFBI54AEFlwGCBk3TA6ABAE3UAwMA",
  "?":"BgACAe4BsgaYCAAZABkBFwEXBRUDEwUTBxEHEQcPCQ8JDQkNCQ0LCwsLCwsLCQsJCwcNBwsHDQcLBQsFDQULAwkFCwMLAwkDCQMBAAABAQABAAEBAQABAAEAAQABAAABAQAAAQEAEwcBAQABAAMBAwADAAUABQAFAAcABwAFAAcABwAFAgcABQAHAAUAW7cCAABcABgBFgAUAhQAFAISAhACEAIQBA4EDgQMBgwGDAYMBgoICgYKCAgKCggICAgKBgoICgYMCAwGDAgOBg4GEAYQBgIAAgIEAAICBAACAgQCBAIKBAoGCAQKBggIBgYICAYIBggGCgQIBAoECAQKAggCCgIKAAgACgAKAAgBCAEKAwgDCAMIAwgFBgMIBQYHBAUGBQQFBAcCBQQHAgcCCQIHAgkCBwAJAgkACQAJAAkBCQAJAQsACQELAQsDCwELAwsDCwMLAwsDCwULAwsFCwMLBV2YAgYECAQKBAwGDAQMBhAIEAYSBhIIEgYUBhIEFgYUBBYEFgQWAhgCFgIYABYAGAAYARgBGAMWBRYHFgcWCRYLFA0IBQYDCAUIBwYFCAcGBwgHBgcICQYJCAkGCQYJCAsGCwYLBgsGDQYNBA0GDQQNBA8EDwQPAg8EEQIRAhEAEQITAWGpBesGAA4CDgIOAg4EDAQKBgwGCgYKCAgICggICAYKBgoGCgYKBAwECgQMBAoCDAAMAgwADAAMAQoADAEKAwwDCgMKAwoFCgUIBQoFCAcICQYHCAkGCQYLBgkECwINAg0CDQANAA0BDQENAQsDDQMJBQsFCQUJBwcHCQcFBwcJBQkFCQUJAwsDCQMLAwkBCwALAQsACwALAgkACwIJBAsECQQJBAkGCQYHBgcICQYHCgUIBwoFCgUMBQoBDgMMAQ4BDgAO",
  "C":"BgABAWmmA4ADAAUCBQAFAgUEBQIDBAUEAwQDBgMEAQYDBgEGAAgBBgDWAgAAwQLVAgATABMCEQITBBEEEQQRBhEIEQgPCA8KDwoNCg0MDQwNDAsOCw4LDgkOCxAHEAkQBxIHEgUSBRIDEgEUARIBFAAUAMIFABQCFAISBBQEEgQSBhIIEggSCBAKEAoQCg4MDgwODA4ODA4MDgwQDA4KEggQChIIEggSBhIGFAQSAhQCEgIUAMYCAADBAsUCAAUABwEFAAUBBQMDAQUDAwMDAwMFAQMDBQEFAAUBBwAFAMEF",
  "L":"BgABAQmcBhISEdkFABIQALQLwgIAAIEJ9AIAAK8C",
  "D":"BgABAkeyBMQLFAAUARIBFAESAxIDEgMSBRIFEAcQBxAHDgkOCQ4LDgsMCwwNDA0KDwoPCg8IDwgRCBEGEwQTBBMEEwIVAhUAFwDBBQAXARcBFwMTAxUDEwUTBxEHEQcPCQ8JDwkNCw0LCwsLDQsNCQ0JDQcPBw8HDwcRBREFEQMRAxEDEwERARMBEwDfAwASEgCgCxES4AMACT6BAxEuKxKLAQAAvwaMAQAsEhIsAMIF",
  "F":"BgABARGABoIJ2QIAAIECsgIAEhIA4QIRErECAACvBBIR5QIAEhIAsgucBQASEgDlAhES",
  "E":"BgABARRkxAuWBQAQEgDlAhES0QIAAP0BtgIAEhIA5wIRFLUCAAD/AfACABISAOUCERLDBQASEgCyCw==",
  "G":"BgABAZsBjgeIAgMNBQ8FDQUNBQ0HCwcNBwsHCwkLCQsJCwsJCwsLCQsJDQkLBw0HDwcNBw8FDwUPAw8DEQMPAxEBEQERARMBEQAXABUCFwIVAhMEFQQTBhMGEwYRCBEIDwoRCg8KDwwNDA0MDQ4LDgkQCRAJEAcQBxIFEgUUBRQDFAMUARYBFgEYAMoFABQCFAASBBQCEgQSBBIEEgYSBhAGEAgQCBAKDgoOCg4MDgwMDgwOChAKEAoSCBIIFAgUBhQEGAYWAhgEGAIaAOoCAAC3AukCAAcABwEFAQUBBQMFAwMFAwUDBQEFAQcBBQEFAQUABwAFAMUFAAUCBwIFAgUCBQQFBAMGBQYDBgUGAwgDBgMIAQgDCAEIAQoBCAEIAAgACgAIAAgCCAIIAggECgQGBAgECAYIBgC6AnEAAJwCmAMAAJcF",
  "H":"BgABARbSB7ILAQAAnwsSEeUCABISAOAE5QEAAN8EEhHlAgASEgCiCxEQ5gIAEREA/QPmAQAAgAQPEOYCABER",
  "I":"BgABAQmuA7ILAJ8LFBHtAgAUEgCgCxMS7gIAExE=",
  "J":"BgABAWuqB7ILALEIABEBEwERAREDEwMRAxEFEQURBw8HEQcPCQ0LDwsNCw0NDQ0LDwsPCxEJEQkTCRMJFQcVBxcFFwMZAxsBGwEbAB8AHQIbAhsEGQYXBhcGFQgTCBMKEwoRDA8KDwwNDA0OCw4LDgkQCRAJEAcQBRIFEgUSAxQDEgESARIBFAESABIAgAEREtoCABERAn8ACQIHBAcEBwYHBgUIBQoDCgMKAwoDDAEKAQwBCgEMAAwACgAMAgoCDAIKBAoECgYKBggGBgYGCAQGBAgCCgAIALIIERLmAgAREQ==",
  "M":"BgACAQRm1gsUABMAAAABE5wIAQDBCxIR5QIAEhIA6gIK5gLVAe0B1wHuAQztAgDhAhIR5QIAEhIAxAsUAPoDtwT4A7YEFgA=",
  "K":"BgABAVXMCRoLBQsDCQMLAwsDCwMLAwsBCwELAQsBCwELAQ0ACwELAAsADQALAg0ACwILAA0CCwILAgsCDQQLBAsECwYNBAsGCwYLCAsGCwgJCgsICQoJCgkMCQwJDAkOCRALEAkQCRKZAdICUQAAiwQSEecCABQSAKALExLoAgAREQC3BEIA+AG4BAEAERKCAwAREdkCzQXGAYUDCA0KDQgJCgkMBwoFDAUMAQwBDgAMAg4CDAQOBAwGDghmlQI=",
  "O":"BgABAoMBsATaCxwAHAEaARoDGgMYBRYFFgcWBxQJEgkSCRILEAsODQ4NDg0MDwoNDA8KDwgPCBEIDwYRBg8GEQQRAhMCEQITABMA0QUAEQETAREBEQMTBREFEQURBxEHDwcRCQ8LDQsPCw0NDQ0NDwsPCw8LEQkTCRMJEwkVBxUHFwUXAxkDGQEbARsAGwAZAhkCGQQXBhcGFQYVCBUIEwoRChEMEQoRDA8MDQ4NDg0OCxAJEAsQCRAHEgcSBxIFFAMSAxIDEgEUARIAEgDSBQASAhQCEgISBBIEEgYSBhIIEggQCBAKEgwODBAMEA4ODg4QDhIMEAwSChQKFAgUCBYIFgYYBBoGGgQcAh4CHgILggGLAylCWxZbFSlBANEFKklcGVwYKkwA0gU=",
  "N":"BgABAQ+YA/oEAOUEEhHVAgASEgC+CxQAwATnBQDIBRMS2AIAExEAzQsRAL8ElgU=",
  "P":"BgABAkqoB5AGABcBFQEVAxMDEwMTBREHEQcRBw8JDwkNCQ0LDQsNCwsNCw0JDQkNCQ8HDwcPBxEFEQURAxEDEQMTAREBEwETAH8AAIMDEhHlAgASEgCgCxES1AMAFAAUARIAFAESAxIDEgMSAxIFEAUQBRAHDgkOCQ4JDgsMCwwNDA0KDQoNCg8IDwgRCBEGEwQTBBUEFQIXAhkAGQCzAgnBAsoCESwrEn8AANUDgAEALBISLgDYAg==",
  "R":"BgABAj9msgsREvYDABQAFAESARQBEgESAxIDEgUSBRAFEAcQBw4JDgkOCQ4LDAsMDQwLCg0KDwoNCA8IDwgPBhEEEwYTAhMEFQIXABcAowIAEwEVARMDEwMTBRMFEQcTBxELEQsRDQ8PDREPEQ0VC8QB/QMSEfkCABQSiQGyA3EAALEDFBHnAgASEgCgCwnCAscFogEALhISLACqAhEsLRKhAQAApQM=",
  "Q":"BgABA4YBvAniAbkB8wGZAYABBQUFAwUFBQUHBQUDBwUFBQcFBQMHBQcDBwUJAwcDCQMJAwkDCQMJAQsDCwMLAQsDCwENAw0BDQEPAA8BDwAPABsAGwIZAhcEGQQXBBUGFQgVCBMIEQoTChEKDwwPDA8ODQ4NDgsQCxAJEAkQBxIHEgUSBRQFFAMUARQDFAEWABYAxgUAEgIUAhICEgQSBBIGEgYSCBIIEAgQChIMDgwQDBAODg4OEA4SDBAMEgoUChQIFAgWCBYGGAQaBhoEHAIeAh4CHAAcARoBGgMaAxgFFgUWBxYHFAkSCRIJEgsQCw4NDg0ODQwPCg0MDwoPCA8IEQgPBhEGDwYRBBECEwIRAhMAEwC7BdgBrwEImQSyAwC6AylAWxZbFSk/AP0BjAK7AQeLAoMCGEc4J0wHVBbvAaYBAEM=",
  "S":"BgABAYMC8gOEBxIFEgUQBxIFEgcSBxIJEgcSCRIJEAkQCRALEAsOCw4NDg0MDQ4PDA0KEQoPChEKEQgRCBMGFQQTBBcCFQAXABkBEwARAREBEQMPAQ8DDwMPAw0DDQUNAw0FCwULBwsFCwUJBwsFCQcHBQkHCQUHBwcHBwUHBwUFBQcHBwUHAwcFEQsRCxMJEwkTBxMFEwUVBRUDFQMVARMBFwEVABUAFQIVAhUCFQQVBBUEEwYVBhMIEwgTCBMIEwgRCBMKEQgRCmK6AgwFDgUMAw4FEAUOBRAFEAUQBRAFEAMSAw4DEAMQAxABEAEOAQ4AEAIMAg4CDgQMBAwGCggKCAoKBgwGDgYQBBACCgAMAAoBCAMKBQgFCAcIBwgJCAsGCQgLCA0IDQgNCA8IDQgPCA8IDwgPChEIDwgPCBEKDwoPDBEMDwwPDg8ODw4NEA0QCxALEgsSCRIHEgcUBRQFGAUYAxgBGgEcAR4CJAYkBiAIIAweDBwQHBAYEhgUFBYUFhQWEBoQGg4aDBwKHAoeBh4GIAQgAiACIgEiASIFIgUiBSAJIgkgCyINZ58CBwQJAgkECwQLAgsECwINBA0CDQQNAg0CDQALAg0ADQANAAsBCwELAQsDCwULBQkFCQcHBwcJBwkFCwMLAw0BDQENAAsCCwQLBAkGCQgJCAkKBwoJCgcMBQoHDAcMBQwF",
  "V":"BgABARG2BM4DXrYEbKwDERL0AgAVEesCnQsSEfsCABQS8QKeCxES8gIAExFuqwNgtQQEAA==",
  "T":"BgABAQskxAv0BgAAtQKVAgAA+wgSEeUCABISAPwImwIAALYC",
  "U":"BgABAW76B7ALAKMIABcBFwMXARUFFQUTBxMHEwkRCREJEQsPDQ0LDw0NDwsPCw8LEQkPCRMJEQcTBxMFEwUVBRUDEwMXARUBFQEXABUAEwIVAhMCFQQTBBUEEwYTBhMIEwgRChEIEQwRDA8MDw4PDg0OCxANEAsSCRIJEgcUBxQHFAMWBRYBGAEYARgApggBAREU9AIAExMAAgClCAALAgkECQQHBAcIBwgHCAUKBQoDCgMKAwwBCgEMAQwADAAMAgoCDAIKAgoECgQKBggGCAYICAYKBAgCCgIMAgwApggAARMU9AIAExM=",
  "X":"BgABARmsCBISEYkDABQSS54BWYICXYkCRZUBEhGJAwAUEtYCzgXVAtIFExKIAwATEVClAVj3AVb0AVKqAREShgMAERHXAtEF2ALNBQ==",
  "W":"BgABARuODcQLERHpAp8LFBHlAgASEnW8A2+7AxIR6wIAFBKNA6ALERKSAwATEdQB7wZigARZ8AIREugCAA8RaKsDYsMDXsoDaqYDExLqAgA=",
  "Y":"BgABARK4BcQLhgMAERHnAvMGAKsEEhHnAgAUEgCsBOkC9AYREoYDABERWOEBUJsCUqICVtwBERI=",
  "Z":"BgABAQmAB8QLnwOBCaADAADBAusGAMgDggmhAwAAwgLGBgA=",
  "`":"BgABAQfqAd4JkQHmAQAOlgJCiAGpAgALiwIA",
  "c":"BgABAW3UA84GBQAFAQUABQEFAwMBBQMDAwMDAwUBAwMFAQUABQEHAAUAnQMABQIFAAUCBQQFAgMEBQQDBAMGAwQBBgMGAQYABgEGAPABABoMAMsCGw7tAQATABMCEwARAhMEEQIPBBEEDwQPBg8IDwYNCA0KDQoNCgsMCwwLDAkOCRAHDgcQBxIFEgUUBRQDFAEWAxgBGAAYAKQDABQCFAISBBQCEgYSBhAGEggQCBAIEAoQCg4MDAwODAwODAwKDgwQCg4IEAgQCBAIEAYSBhIGEgQSAhQCFAIUAOABABwOAM0CGQzbAQA=",
  "a":"BgABApoB8AYCxwF+BwkHCQcJCQkHBwkHBwcJBQkFBwUJBQkFCQMHBQkDCQMJAwcDCQEHAQkBBwEJAQcABwAHAQcABQAHAAUBBQAFABMAEwITAhEEEwQPBBEGDwgPCA0IDwoLCg0KCwwLDAsMCQ4JDgkOBw4HEAcQBRAFEAUSAxADEgESAxIBFAESABQAFAISAhQCEgQSBBIEEgYSBhIIEAgQChAIDgwODA4MDg4MDgwODBAMEAoSCBIKEggUCBQGFgYWBBgEGAIaAhoAcgAADgEMAQoBCgEIAwgDBgUEBQQFBAcCBwIHAgkCCQAJAKsCABcPAMwCHAvCAgAUABYBEgAUARIDFAMQAxIDEAUSBQ4FEAcOCRAJDAkOCwwLDA0MCwoNCg8IDwgPCA8GEQYRBhMEEwIXAhUCFwAZAIMGFwAKmQLqA38ATxchQwgnGiMwD1AMUDYAdg==",
  "b":"BgABAkqmBIIJGAAYARYBFgEUAxQDEgUSBRIFEAcQCQ4HDgkOCw4LDAsMDQoNCg0KDQgPBg8GDwYRBBEEEQQTBBECEwIVAhMAFQD/AgAZARcBFwEXAxUDEwUTBREFEQcPBw8JDwkNCQ0LDQsLCwsNCQ0JDQcPBw8HDwURAxEDEQMTAxMBEwMVARUAFQHPAwAUEgCWCxEY5gIAERkAowKCAQAJOvECESwrEn8AAJsEgAEALBISLgCeAw==",
  "d":"BgABAkryBgDLAXAREQ8NEQ0PDREJDwkRBw8FDwURAw8DDwERAw8BEQEPACMCHwQfCB0MGw4bEhcUFxgVGhEeDSANJAkmBSgDKgEuAIADABYCFAIUAhQCFAQUBBIGEgYSBhAIEAgQCBAKDgoODAwMDAwMDgoOCg4KEAgQCBIGEgYSBhQEFgQWBBYCGAIYAHwAAKQCERrmAgARFwCnCxcADOsCugJGMgDmA3sAKxERLQCfAwolHBUmBSQKBAA=",
  "e":"BgABAqMBigP+AgAJAgkCCQQHBAcGBwYFCAUIBQgDCgMIAQoDCAEKAQoACgAKAAoCCAIKAggECgQIBAgGCAYGBgQIBAoECAIKAAyiAgAAGQEXARcBFwMVBRMFEwURBxEHDwcPCQ8LDQkNCwsNCw0LDQkNBw8JDwcPBQ8FEQURAxEDEwMTAxMBFQAVARcALwIrBCkIJwwlDiESHxQbGBkaFR4TIA0iCyQJKAMqASwAggMAFAIUABIEFAISBBIEEgQSBhIGEAgQCBAIEAoODA4MDgwODgwQDBAKEAoSChIIFAgUCBYGGAQYBhoCGgQcAh4ALgEqAygFJgkkDSANHhEaFRgXFBsSHQ4fDCUIJwQpAi0AGQEXAxcDFQcTBRMJEQkPCw8LDQ0PDQsNDQ8LEQsRCxEJEwkTCRMJEwcTBxUHFQUVBRUHFQUVBRUHFwcVBRUHCs4BkAMfOEUURxEfMwBvbBhAGBwaBiA=",
  "h":"BgABAUHYBJAGAAYBBgAGAQYDBgEEAwYDBAMEBQQDAgUEBQIFAAUCBQB1AAC5BhIT5wIAFhQAlAsRGOYCABEZAKMCeAAYABgBFgEWARQDFAMSBRIFEgUQBxAJDgcOCQ4LDgsMCwwNCg0KDQoNCA8GDwYPBhEEEQQRBBMEEQITAhUCEwAVAO0FFhPnAgAUEgD+BQ==",
  "g":"BgABArkBkAeACQCNCw8ZERkRFxEVExMVERUPFQ8XDRcLGQkZBxsFGwUdAR0BDQALAA0ADQINAAsCDQANAg0CDQILAg0EDQINBA0GDQQNBg0EDQYNCA0GDwgNCA0IDQgPCg0KDwwNDA8MDw4PDqIB7gEQDRALEAkQCQ4JEAcOBw4FDgUOAwwFDgMMAQwBDAEMAQwACgEKAAoACAIIAAgCCAIGAggCBgIGBAYCBgQEAgYEAqIBAQADAAEBAwADAAMABQADAAUAAwAFAAMABQAFAAMABQA3ABMAEwIRAhMCEQQRBBEEEQYRBg8IDwgPCA0KDQoNCg0MCwwLDgsOCQ4JDgkQBxAHEgcSBRIDFAMWAxQBFgEYABgA/gIAFgIWAhQEFgQUBBIGFAgSCBIIEAoSChAKDgwODA4MDg4MDgwODA4KEAgQCBAIEgYSBhIEEgYSBBQCEgIUAhQCOgAQABABDgEQAQ4BEAMOAw4FDgUOBQwFDgcMBQ4HDAkMB4oBUBgACbsCzQYAnAR/AC0RES0AnQMSKy4RgAEA",
  "f":"BgABAUH8A6QJBwAHAAUABwEFAQcBBQEFAwUDBQMDAwMDAwUDAwMFAQUAwQHCAQAWEgDZAhUUwQEAAOMEFhftAgAWFADKCQoSChIKEAoQCg4KDgwOCgwMDAoKDAwMCgwIDAgMCAwIDAYOCAwEDgYMBA4GDAIOBA4CDgQOAg4CDgAOAg4ADgC2AQAcDgDRAhkQowEA",
  "i":"BgACAQlQABISALoIERLqAgAREQC5CBIR6QIAAWELyAoADgIOAgwEDgIKBgwGCgYKCAoGCAgICggIBggGCgYKBAoECgQMBAoCDAIMAgwCDAAMAAwADAEMAQoBDAMKAwoDCgUKBQgFCgUIBwgHCAcICQgJBgkECwQJBA0CCwANAA0ADQELAQ0BCwMJBQsFCQUJBwkFBwcHBwcJBQcFCQUJBQkDCQMLAwkBCwELAQsACwALAAsCCwILAgkCCwIJBAkECQQJBgcGCQYHCAcIBwgHCgUKBQwFCgMMAQwBDgEMAA4=",
  "j":"BgACAWFKyAoADgIOAgwEDgIKBgwGCgYKCAoGCAgICggIBggGCgYKBAoECgQMBAoCDAIMAgwCDAAMAAwADAEMAQoBDAMKAwoDCgUKBQgFCgUIBwgHCAcICQgJBgkECwQJBA0CCwANAA0ADQELAQ0BCwMJBQsFCQUJBwkFBwcHBwcJBQcFCQUJBQkDCQMLAwkBCwELAQsACwALAAsCCwILAgkCCwIJBAkECQQJBgcGCQYHCAcIBwgHCgUKBQwFCgMMAQwBDgEMAA4BO+YCnwwJEQkRCQ8JDwsNCQ0LDQkLCwsJCQsLCQkLBwsHCwcLBwsFCwcNAwsFDQMLBQ0BDQMNAQ0DDQENAQ0ADQENAA0AVwAbDQDSAhoPQgAIAAgABgAIAgYCCAIGAgYEBgQGBAQEBAQEBgQEBAYCBgC4CRES6gIAEREAowo=",
  "k":"BgABARKoA/QFIAC0AYoD5gIAjwK5BJICwwTfAgDDAbIDFwAAnwMSEeUCABISAJILERLmAgAREQCvBQ==",
  "n":"BgABAW1yggmQAU8GBAgEBgQGBgYCCAQGBAYEBgQIAgYECAQGAggEBgIIBAgCCAQIAggCCAIIAgoACAIKAAgCCgAKAgoADAAKAgwAFgAWARQAFAEUAxQDFAMSAxIFEgUQBRIHEAkOBxAJDgsOCwwLDA0MDQoPCA8IEQgRBhEGEwYVBBUEFQIXAhkCGQDtBRQR5QIAFBAA/AUACAEIAQYBCAMGBQQFBgUEBwQFBAcCBwIHAgcCCQIHAAcACQAHAQcABwMHAQUDBwMFAwUFBQUDBQEFAwcBBwAHAPkFEhHjAgASEgDwCBAA",
  "m":"BgABAZoBfoIJigFbDAwMCg4KDggOCA4IDgYQBhAGEAQQBBAEEAISAhACEgAmASQDJAciCyANHhEcFRwXDg4QDBAKEAwQCBAKEggSBhIGEgYSBBQEEgIUAhICFAAUABQBEgEUARIDEgMSAxIFEgUQBxAHEAcQBw4JDgkOCw4LDAsMDQoNCg8KDwgPCBEIEQYRBBMEEwQTAhMCFQAVAP0FEhHlAgASEgCCBgAIAQgBBgEGAwYFBgUEBQQHBAUEBwIHAgcCBwIJAAcABwAJAAcBBwEHAQUBBwMFAwUDBQMDBQMFAwUBBQEHAQcAgQYSEeUCABISAIIGAAgBCAEGAQYDBgUGBQQFBAcEBQQHAgcCBwIHAgkABwAHAAkABwEHAQcBBQEHAwUDBQMFAwMFAwUDBQEFAQcBBwCBBhIR5QIAEhIA8AgYAA==",
  "l":"BgABAQnAAwDrAgASFgDWCxEa6gIAERkA0wsUFw==",
  "y":"BgABAZ8BogeNAg8ZERkRFxEVExMVERUPFQ8XDRcLGQkZBxsFGwUdAR0BDQALAA0ADQINAAsCDQANAg0CDQILAg0EDQINBA0GDQQNBg0EDQYNCA0GDwgNCA0IDQgPCg0KDwwNDA8MDw4PDqIB7gEQDRALEAkQCQ4JEAcOBw4FDgUOAwwFDgMMAQwBDAEMAQwACgEKAAoACAIIAAgCCAIGAggCBgIGBAYCBgQEAgYEAqIBAQADAAEBAwADAAMABQADAAUAAwAFAAMABQAFAAMABQA3ABMAEwIRABECEwQRAg8EEQQPBBEGDwgNCA8IDQgNCg0MDQwLDAkOCw4JDgcQBxAHEgUSBRQFFAMWARgDGAEaABwA9AUTEuQCABEPAP8FAAUCBQAFAgUEBQIDBAUEAwQDBgMEAQYDBgEGAAgBBgCAAQAAvAYREuICABMPAP0K",
  "q":"BgABAmj0A4YJFgAWARQAEgESAxADEAMOAw4FDgUMBQ4HDgcOBwwJDgmeAU4A2QwWGesCABYaAN4DAwADAAMBAwADAAUAAwADAAMABQAFAAUABwAHAQcACQAVABUCFQATAhUCEwQRAhMEEQQRBhEGDwgPCA8IDQoNDA0MCwwLDgkOCRAJEAkQBxIHEgUUBRYDFgMYARoBGgAcAP4CABYCFgIWBBYEFAQSBhQIEggSCBAKEgoQDA4MDgwODg4ODBAMDgwQChIIEAoSCBIGEgYUBhQEFAQWAhYCFgIWAApbkQYSKy4ReAAAjARTEjkRHykJMwDvAg==",
  "p":"BgABAmiCBIYJFgAWARYBFAEWAxQDEgUUBRIFEgcSBxAJEAkQCQ4LDgsOCwwNDA0KDwoPCg8IEQgRCBEGEwQTBhMCFQQVAhUAFQD9AgAbARkBFwMXAxcDEwUTBxMHEQcRCQ8JDQsNCw0LCw0LDQkPCQ0JDwURBxEFEQURAxMDEQMTARUBEwEVARUBFQAJAAcABwAFAAcABQAFAAMAAwADAAUAAwIDAAMAAwIDAADdAxYZ6wIAFhoA2gyeAU0OCgwIDgoMCA4GDgYMBg4GDgQQBBAEEgQUAhQCFgIWAApcoQMJNB8qNxJVEQCLBHgALhISLADwAg==",
  "o":"BgABAoMB8gOICRYAFgEWARQBFgMUAxIDFAUSBRIHEgcQBxAJEAkOCw4LDgsMDQwNCg8KDwoPCg8IEQgRBhMGEwQTBBMCFQIVABcAiwMAFwEVARUDEwMTAxMFEwcRBxEHDwkPCQ8LDQsNCw0NCw0LDwkNCw8HEQkPBxEHEQcRBRMFEwMTAxUDFQEVABUAFQAVAhUCFQITBBMEEwYTBhEGEQgRCA8KDwoPCg0KDQwNDAsOCw4JDgkQCRAJEgcSBxIFFAUUAxQDFgEWARYAFgCMAwAYAhYCFgQUBBQEFAYUCBIIEggQChAKEAwODA4MDg4MDgwQCg4KEgoQChIIEggSBhQGEgYUBBYEFAIWAhYCFgALYv0CHTZBFEMRHTcAjwMcNUITQhIiOACQAw==",
  "r":"BgACAQRigAkQAA8AAAABShAAhAFXDAwODAwKDgoOCBAIDgYQBhAEEAQQBBAEEAISABACEAAQAA4BEAAQARADEAEQAxADEAUSBRIHFAcUCxQLFA0WDVJFsQHzAQsMDQwLCgkICwgLCAkGCQYJBAkGBwIJBAcCBwQHAAcCBwAFAgcABQAHAQUABQEFAQUBBQEDAQUBAwMDAQMDAwEAmwYSEeMCABISAO4IEAA=",
  "u":"BgABAV2KBwGPAVANCQsHDQcNBw0FCwUNBQ0FDQMPAw8DEQMTARMBFQEVABUAFQITABMEEwITBBMEEQQRBhEGDwYRCA8KDQgPCg0MDQwLDAsOCRALDgcQBxIHEgUUBRQFFAMWAxgBGAEYARoA7gUTEuYCABMPAPsFAAcCBwIFBAcCBQYDBgUGAwgDBgMIAQgBCAEIAQoBCAAIAAoACAIIAggCCAIGBAgEBgQGBgYGBAYCBgQIAggACAD6BRES5AIAEREA7wgPAA==",
  "s":"BgABAasC/gLwBQoDCgMMBQ4DDgUOBRAFEAUSBRAHEgcQCRIJEAkSCxALEAsQDRANDg0ODw4PDA8MDwoRChEIEwYTBBcCFQIXABkBGQEXAxcFFQUTBRMHEwcRCREJDwkNCQ8LDQ0LCwsNCw0JDQkPBw8HDwUPBREDEQMRAREDEQETABEBEwARABMADwIRABECEQIRBBMCEwQVBBUEFQYVBhMIFwgVChUKFQxgsAIIAwYDCAMKAQgDCAMKAQoDCgEKAwoBCgMKAQwDCgEKAwoBDAMKAQoBCgEMAQoACgEKAAoBCgAKAQgACgAIAQgABgoECAIKAgoCCgAMAQoBDAUEBwIHBAcEBwIHBAkECQQJBAkECQYLBAkGCwYJBgsGCwYJCAsGCwgJBgsICQgLCAkICwgJCgkKCQoJCgcKCQwHDAcMBwwFDAcMAw4FDAMOAw4BDgMQARAAEAESABIAEgIQAg4CDgIOBA4CDgQMBAwEDAQMBgoECgYKBgoGCgYIBggGCAgIBggGBgYIBgYGBgYGBgYGBAgGBgQIBAYECAQQChIIEggSBhIEEgQSBBQCFAISABQAEgASABIAEgESARIBEAEQAxIDDgMQAxADDgUOBQwDDAMMAwoDCAMIAQYBe6cCAwIDAgUAAwIFAgUCBwIFAgcCBQIHAgUCBwIHAAUCBwIHAgUABwIHAgcABQIHAAcCBwAFAgUABQIFAAUABQIDAAEAAQABAQEAAQEBAQEBAQEBAQEDAQEAAwEBAQMAAwEDAAMBAwADAQMAAwABAQMAAwADAAEAAwIBAAMCAQQDAgE=",
  "t":"BgABAUe8BLACWAAaEADRAhsOaQANAA0ADwINAA0CDQANAg0CDQINBA0CCwYNBA0GCwYNBgsIDQgLCAsKCwgJDAsKCQwJDAkOCQ4HEAcSBxIHEgUUAOAEawAVEQDWAhYTbAAAygIVFOYCABUXAMUCogEAFhQA1QIVEqEBAADzAwIFBAMEBQQDBAMEAwYDBgMGAwYBCAEGAQgBBgEIAAgA",
  "w":"BgABARz8BsAEINYCKNgBERLuAgARD+8B3QgSEc0CABQSW7YCV7UCFBHJAgASEpMC3AgREvACABERmAHxBDDaAVeYAxES7gIAEREo1QE81wIIAA==",
  "z":"BgABAQ6cA9AGuQIAFw8AzAIaC9QFAAAr9wKjBuACABYQAMsCGQyZBgCaA9AG"
   }';
BEGIN

  IF font IS NULL THEN
    font := font_default;
  END IF;

  -- For character spacing, use m as guide size
  geom := ST_GeomFromTWKB(decode(font->>'m', 'base64'));
  m_width := ST_XMax(geom) - ST_XMin(geom);
  spacing := m_width / 12;

  letterarray := regexp_split_to_array(replace(letters, ' ', E'\t'), E'');
  FOREACH letter IN ARRAY letterarray
  LOOP
    geom := ST_GeomFromTWKB(decode(font->>(letter), 'base64'));
    -- Chars are not already zeroed out, so do it now
    geom := ST_Translate(geom, -1 * ST_XMin(geom), 0.0);
    -- unknown characters are treated as spaces
    IF geom IS NULL THEN
      -- spaces are a "quarter m" in width
      width := m_width / 3.5;
    ELSE
      width := (ST_XMax(geom) - ST_XMin(geom));
    END IF;
    geom := ST_Translate(geom, position, 0.0);
    -- Tighten up spacing when characters have a large gap
    -- between them like Yo or To
    adjustment := 0.0;
    IF prevgeom IS NOT NULL AND geom IS NOT NULL THEN
      dist = ST_Distance(prevgeom, geom);
      IF dist > spacing THEN
        adjustment = spacing - dist;
        geom := ST_Translate(geom, adjustment, 0.0);
      END IF;
    END IF;
    prevgeom := geom;
    position := position + width + spacing + adjustment;
    wordarr := array_append(wordarr, geom);
  END LOOP;
  -- apply the start point and scaling options
  wordgeom := ST_CollectionExtract(ST_Collect(wordarr));
  wordgeom := ST_Scale(wordgeom,
                text_height/font_default_height,
                text_height/font_default_height);
  return wordgeom;
END;]]></definition>
         <parameters>
            <parameter mode="IN" name="letters" type="text"/>
            <parameter mode="IN" name="font" type="json"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_linecrossingdirection(line1 geometry, line2 geometry)" returnType="integer" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[ST_LineCrossingDirection]]></definition>
         <parameters>
            <parameter mode="IN" name="line1" type="geometry"/>
            <parameter mode="IN" name="line2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_linefromencodedpolyline(txtin text, nprecision integer DEFAULT 5)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[line_from_encoded_polyline]]></definition>
         <parameters>
            <parameter mode="IN" name="txtin" type="text"/>
            <parameter mode="IN" name="nprecision" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_linefrommultipoint(geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: aMultiPoint - Creates a LineString from a MultiPoint geometry.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_line_from_mpoint]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_linefromtext(text)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT CASE WHEN public.geometrytype(public.ST_GeomFromText($1)) = 'LINESTRING'
	THEN public.ST_GeomFromText($1)
	ELSE NULL END]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_linefromtext(text, integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT CASE WHEN public.geometrytype(public.ST_GeomFromText($1, $2)) = 'LINESTRING'
	THEN public.ST_GeomFromText($1,$2)
	ELSE NULL END]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_linefromwkb(bytea)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT CASE WHEN public.geometrytype(public.ST_GeomFromWKB($1)) = 'LINESTRING'
	THEN public.ST_GeomFromWKB($1)
	ELSE NULL END]]></definition>
         <parameters>
            <parameter mode="IN" type="bytea"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_linefromwkb(bytea, integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT CASE WHEN public.geometrytype(public.ST_GeomFromWKB($1, $2)) = 'LINESTRING'
	THEN public.ST_GeomFromWKB($1, $2)
	ELSE NULL END]]></definition>
         <parameters>
            <parameter mode="IN" type="bytea"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_lineinterpolatepoint(geometry, double precision)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: a_linestring, a_fraction - Returns a point interpolated along a line at a fractional location.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_line_interpolate_point]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_lineinterpolatepoints(geometry, double precision, repeat boolean DEFAULT true)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: a_linestring, a_fraction, repeat - Returns points interpolated along a line at a fractional interval.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_line_interpolate_point]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" name="repeat" type="boolean"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_linelocatepoint(geom1 geometry, geom2 geometry)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: a_linestring, a_point - Returns the fractional location of the closest point on a line to a point.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_line_locate_point]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_linemerge(geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: amultilinestring - Return the lines formed by sewing together a MultiLineString.]]></comment>
         <definition language="c"><![CDATA[linemerge]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_linemerge(geometry, boolean)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: amultilinestring, directed - Return the lines formed by sewing together a MultiLineString.]]></comment>
         <definition language="c"><![CDATA[linemerge]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="boolean"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_linestringfromwkb(bytea)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT CASE WHEN public.geometrytype(public.ST_GeomFromWKB($1)) = 'LINESTRING'
	THEN public.ST_GeomFromWKB($1)
	ELSE NULL END]]></definition>
         <parameters>
            <parameter mode="IN" type="bytea"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_linestringfromwkb(bytea, integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT CASE WHEN public.geometrytype(public.ST_GeomFromWKB($1, $2)) = 'LINESTRING'
	THEN public.ST_GeomFromWKB($1, $2)
	ELSE NULL END]]></definition>
         <parameters>
            <parameter mode="IN" type="bytea"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_linesubstring(geometry, double precision, double precision)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: a_linestring, startfraction, endfraction - Returns the part of a line between two fractional locations.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_line_substring]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_linetocurve(geometry geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomANoncircular - Converts a linear geometry to a curved geometry.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_line_desegmentize]]></definition>
         <parameters>
            <parameter mode="IN" name="geometry" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_locatealong(geometry geometry, measure double precision, leftrightoffset double precision DEFAULT 0.0)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom_with_measure, measure, offset = 0 - Returns the point(s) on a geometry that match a measure value.]]></comment>
         <definition language="c"><![CDATA[ST_LocateAlong]]></definition>
         <parameters>
            <parameter mode="IN" name="geometry" type="geometry"/>
            <parameter mode="IN" name="measure" type="double precision"/>
            <parameter mode="IN" name="leftrightoffset" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_locatebetween(geometry geometry, frommeasure double precision, tomeasure double precision, leftrightoffset double precision DEFAULT 0.0)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom, measure_start, measure_end, offset = 0 - Returns the portions of a geometry that match a measure range.]]></comment>
         <definition language="c"><![CDATA[ST_LocateBetween]]></definition>
         <parameters>
            <parameter mode="IN" name="geometry" type="geometry"/>
            <parameter mode="IN" name="frommeasure" type="double precision"/>
            <parameter mode="IN" name="tomeasure" type="double precision"/>
            <parameter mode="IN" name="leftrightoffset" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_locatebetweenelevations(geometry geometry, fromelevation double precision, toelevation double precision)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom, elevation_start, elevation_end - Returns the portions of a geometry that lie in an elevation (Z) range.]]></comment>
         <definition language="c"><![CDATA[ST_LocateBetweenElevations]]></definition>
         <parameters>
            <parameter mode="IN" name="geometry" type="geometry"/>
            <parameter mode="IN" name="fromelevation" type="double precision"/>
            <parameter mode="IN" name="toelevation" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_longestline(geom1 geometry, geom2 geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g1, g2 - Returns the 2D longest line between two geometries.]]></comment>
         <definition language="sql"><![CDATA[SELECT public._ST_LongestLine(public.ST_ConvexHull($1), public.ST_ConvexHull($2))]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_m(geometry)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: a_point - Returns the M coordinate of a Point.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_m_point]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_makebox2d(geom1 geometry, geom2 geometry)" returnType="box2d" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: pointLowLeft, pointUpRight - Creates a BOX2D defined by two 2D point geometries.]]></comment>
         <definition language="c"><![CDATA[BOX2D_construct]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_makeenvelope(double precision, double precision, double precision, double precision, integer DEFAULT 0)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: xmin, ymin, xmax, ymax, srid=unknown - Creates a rectangular Polygon from minimum and maximum coordinates.]]></comment>
         <definition language="c"><![CDATA[ST_MakeEnvelope]]></definition>
         <parameters>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_makeline(geom1 geometry, geom2 geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom1, geom2 - Creates a LineString from Point, MultiPoint, or LineString geometries.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_makeline]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_makeline(geometry)" returnType="geometry" securityType="INVOKER" type="AGGREGATE">
         <comment><![CDATA[args: geoms - Creates a LineString from Point, MultiPoint, or LineString geometries.]]></comment>
         <definition language="internal"><![CDATA[aggregate_dummy]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_makeline(geometry[])" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geoms_array - Creates a LineString from Point, MultiPoint, or LineString geometries.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_makeline_garray]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry[]"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_makepoint(double precision, double precision)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: x, y - Creates a 2D, 3DZ or 4D Point.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_makepoint]]></definition>
         <parameters>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_makepoint(double precision, double precision, double precision)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: x, y, z - Creates a 2D, 3DZ or 4D Point.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_makepoint]]></definition>
         <parameters>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_makepoint(double precision, double precision, double precision, double precision)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: x, y, z, m - Creates a 2D, 3DZ or 4D Point.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_makepoint]]></definition>
         <parameters>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_makepointm(double precision, double precision, double precision)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: x, y, m - Creates a Point from X, Y and M values.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_makepoint3dm]]></definition>
         <parameters>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_makepolygon(geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: linestring - Creates a Polygon from a shell and optional list of holes.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_makepoly]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_makepolygon(geometry, geometry[])" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: outerlinestring, interiorlinestrings - Creates a Polygon from a shell and optional list of holes.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_makepoly]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="geometry[]"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_makevalid(geom geometry, params text)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: input, params - Attempts to make an invalid geometry valid without losing vertices.]]></comment>
         <definition language="c"><![CDATA[ST_MakeValid]]></definition>
         <parameters>
            <parameter mode="IN" name="geom" type="geometry"/>
            <parameter mode="IN" name="params" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_makevalid(geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: input - Attempts to make an invalid geometry valid without losing vertices.]]></comment>
         <definition language="c"><![CDATA[ST_MakeValid]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_maxdistance(geom1 geometry, geom2 geometry)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g1, g2 - Returns the 2D largest distance between two geometries in projected units.]]></comment>
         <definition language="sql"><![CDATA[SELECT public._ST_MaxDistance(public.ST_ConvexHull($1), public.ST_ConvexHull($2))]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_maximuminscribedcircle(geometry, OUT center geometry, OUT nearest geometry, OUT radius double precision)" returnType="record" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom - Computes the largest circle contained within a geometry.]]></comment>
         <definition language="c"><![CDATA[ST_MaximumInscribedCircle]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="OUT" name="center" type="geometry"/>
            <parameter mode="OUT" name="nearest" type="geometry"/>
            <parameter mode="OUT" name="radius" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_memcollect(geometry)" returnType="geometry" securityType="INVOKER" type="AGGREGATE">
         <comment/>
         <definition language="internal"><![CDATA[aggregate_dummy]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_memsize(geometry)" returnType="integer" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA - Returns the amount of memory space a geometry takes.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_mem_size]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_memunion(geometry)" returnType="geometry" securityType="INVOKER" type="AGGREGATE">
         <comment><![CDATA[args: geomfield - Aggregate function which unions geometries in a memory-efficent but slower way]]></comment>
         <definition language="internal"><![CDATA[aggregate_dummy]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_minimumboundingcircle(inputgeom geometry, segs_per_quarter integer DEFAULT 48)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA, num_segs_per_qt_circ=48 - Returns the smallest circle polygon that contains a geometry.]]></comment>
         <definition language="c"><![CDATA[ST_MinimumBoundingCircle]]></definition>
         <parameters>
            <parameter mode="IN" name="inputgeom" type="geometry"/>
            <parameter mode="IN" name="segs_per_quarter" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_minimumboundingradius(geometry, OUT center geometry, OUT radius double precision)" returnType="record" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom - Returns the center point and radius of the smallest circle that contains a geometry.]]></comment>
         <definition language="c"><![CDATA[ST_MinimumBoundingRadius]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="OUT" name="center" type="geometry"/>
            <parameter mode="OUT" name="radius" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_minimumclearance(geometry)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g - Returns the minimum clearance of a geometry, a measure of a geometrys robustness.]]></comment>
         <definition language="c"><![CDATA[ST_MinimumClearance]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_minimumclearanceline(geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g - Returns the two-point LineString spanning a geometrys minimum clearance.]]></comment>
         <definition language="c"><![CDATA[ST_MinimumClearanceLine]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_mlinefromtext(text)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT CASE WHEN public.geometrytype(public.ST_GeomFromText($1)) = 'MULTILINESTRING'
	THEN public.ST_GeomFromText($1)
	ELSE NULL END]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_mlinefromtext(text, integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT CASE
	WHEN public.geometrytype(public.ST_GeomFromText($1, $2)) = 'MULTILINESTRING'
	THEN public.ST_GeomFromText($1,$2)
	ELSE NULL END]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_mlinefromwkb(bytea)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT CASE WHEN public.geometrytype(public.ST_GeomFromWKB($1)) = 'MULTILINESTRING'
	THEN public.ST_GeomFromWKB($1)
	ELSE NULL END]]></definition>
         <parameters>
            <parameter mode="IN" type="bytea"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_mlinefromwkb(bytea, integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT CASE WHEN public.geometrytype(public.ST_GeomFromWKB($1, $2)) = 'MULTILINESTRING'
	THEN public.ST_GeomFromWKB($1, $2)
	ELSE NULL END]]></definition>
         <parameters>
            <parameter mode="IN" type="bytea"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_mpointfromtext(text)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT CASE WHEN public.geometrytype(public.ST_GeomFromText($1)) = 'MULTIPOINT'
	THEN public.ST_GeomFromText($1)
	ELSE NULL END]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_mpointfromtext(text, integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT CASE WHEN public.geometrytype(public.ST_GeomFromText($1, $2)) = 'MULTIPOINT'
	THEN ST_GeomFromText($1, $2)
	ELSE NULL END]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_mpointfromwkb(bytea)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT CASE WHEN public.geometrytype(public.ST_GeomFromWKB($1)) = 'MULTIPOINT'
	THEN public.ST_GeomFromWKB($1)
	ELSE NULL END]]></definition>
         <parameters>
            <parameter mode="IN" type="bytea"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_mpointfromwkb(bytea, integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT CASE WHEN public.geometrytype(public.ST_GeomFromWKB($1, $2)) = 'MULTIPOINT'
	THEN public.ST_GeomFromWKB($1, $2)
	ELSE NULL END]]></definition>
         <parameters>
            <parameter mode="IN" type="bytea"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_mpolyfromtext(text)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT CASE WHEN public.geometrytype(public.ST_GeomFromText($1)) = 'MULTIPOLYGON'
	THEN public.ST_GeomFromText($1)
	ELSE NULL END]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_mpolyfromtext(text, integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT CASE WHEN public.geometrytype(public.ST_GeomFromText($1, $2)) = 'MULTIPOLYGON'
	THEN public.ST_GeomFromText($1,$2)
	ELSE NULL END]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_mpolyfromwkb(bytea)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT CASE WHEN public.geometrytype(public.ST_GeomFromWKB($1)) = 'MULTIPOLYGON'
	THEN public.ST_GeomFromWKB($1)
	ELSE NULL END]]></definition>
         <parameters>
            <parameter mode="IN" type="bytea"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_mpolyfromwkb(bytea, integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT CASE WHEN public.geometrytype(public.ST_GeomFromWKB($1, $2)) = 'MULTIPOLYGON'
	THEN public.ST_GeomFromWKB($1, $2)
	ELSE NULL END]]></definition>
         <parameters>
            <parameter mode="IN" type="bytea"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_multi(geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom - Return the geometry as a MULTI* geometry.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_force_multi]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_multilinefromwkb(bytea)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT CASE WHEN public.geometrytype(public.ST_GeomFromWKB($1)) = 'MULTILINESTRING'
	THEN public.ST_GeomFromWKB($1)
	ELSE NULL END]]></definition>
         <parameters>
            <parameter mode="IN" type="bytea"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_multilinestringfromtext(text)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT public.ST_MLineFromText($1)]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_multilinestringfromtext(text, integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT public.ST_MLineFromText($1, $2)]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_multipointfromtext(text)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT public.ST_MPointFromText($1)]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_multipointfromwkb(bytea)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT CASE WHEN public.geometrytype(public.ST_GeomFromWKB($1)) = 'MULTIPOINT'
	THEN public.ST_GeomFromWKB($1)
	ELSE NULL END]]></definition>
         <parameters>
            <parameter mode="IN" type="bytea"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_multipointfromwkb(bytea, integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT CASE WHEN public.geometrytype(public.ST_GeomFromWKB($1,$2)) = 'MULTIPOINT'
	THEN public.ST_GeomFromWKB($1, $2)
	ELSE NULL END]]></definition>
         <parameters>
            <parameter mode="IN" type="bytea"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_multipolyfromwkb(bytea)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT CASE WHEN public.geometrytype(public.ST_GeomFromWKB($1)) = 'MULTIPOLYGON'
	THEN public.ST_GeomFromWKB($1)
	ELSE NULL END]]></definition>
         <parameters>
            <parameter mode="IN" type="bytea"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_multipolyfromwkb(bytea, integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT CASE WHEN public.geometrytype(public.ST_GeomFromWKB($1, $2)) = 'MULTIPOLYGON'
	THEN public.ST_GeomFromWKB($1, $2)
	ELSE NULL END]]></definition>
         <parameters>
            <parameter mode="IN" type="bytea"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_multipolygonfromtext(text)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT public.ST_MPolyFromText($1)]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_multipolygonfromtext(text, integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT public.ST_MPolyFromText($1, $2)]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_ndims(geometry)" returnType="smallint" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g1 - Returns the coordinate dimension of a geometry.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_ndims]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_node(g geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom - Nodes a collection of lines.]]></comment>
         <definition language="c"><![CDATA[ST_Node]]></definition>
         <parameters>
            <parameter mode="IN" name="g" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_normalize(geom geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom - Return the geometry in its canonical form.]]></comment>
         <definition language="c"><![CDATA[ST_Normalize]]></definition>
         <parameters>
            <parameter mode="IN" name="geom" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_npoints(geometry)" returnType="integer" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g1 - Returns the number of points (vertices) in a geometry.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_npoints]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_nrings(geometry)" returnType="integer" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA - Returns the number of rings in a polygonal geometry.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_nrings]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_numgeometries(geometry)" returnType="integer" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom - Returns the number of elements in a geometry collection.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_numgeometries_collection]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_numinteriorring(geometry)" returnType="integer" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: a_polygon - Returns the number of interior rings (holes) of a Polygon. Aias for ST_NumInteriorRings]]></comment>
         <definition language="c"><![CDATA[LWGEOM_numinteriorrings_polygon]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_numinteriorrings(geometry)" returnType="integer" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: a_polygon - Returns the number of interior rings (holes) of a Polygon.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_numinteriorrings_polygon]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_numpatches(geometry)" returnType="integer" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g1 - Return the number of faces on a Polyhedral Surface. Will return null for non-polyhedral geometries.]]></comment>
         <definition language="sql"><![CDATA[SELECT CASE WHEN public.ST_GeometryType($1) = 'ST_PolyhedralSurface'
	THEN public.ST_NumGeometries($1)
	ELSE NULL END]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_numpoints(geometry)" returnType="integer" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g1 - Returns the number of points in a LineString or CircularString.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_numpoints_linestring]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_offsetcurve(line geometry, distance double precision, params text DEFAULT ''::text)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: line, signed_distance, style_parameters=' - Returns an offset line at a given distance and side from an input line.]]></comment>
         <definition language="c"><![CDATA[ST_OffsetCurve]]></definition>
         <parameters>
            <parameter mode="IN" name="line" type="geometry"/>
            <parameter mode="IN" name="distance" type="double precision"/>
            <parameter mode="IN" name="params" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_orderingequals(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_same]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_orientedenvelope(geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom - Returns a minimum-area rectangle containing a geometry.]]></comment>
         <definition language="c"><![CDATA[ST_OrientedEnvelope]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_overlaps(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[overlaps]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_patchn(geometry, integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA, n - Returns the Nth geometry (face) of a PolyhedralSurface.]]></comment>
         <definition language="sql"><![CDATA[SELECT CASE WHEN public.ST_GeometryType($1) = 'ST_PolyhedralSurface'
	THEN public.ST_GeometryN($1, $2)
	ELSE NULL END]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_perimeter(geog geography, use_spheroid boolean DEFAULT true)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geog, use_spheroid=true - Returns the length of the boundary of a polygonal geometry or geography.]]></comment>
         <definition language="c"><![CDATA[geography_perimeter]]></definition>
         <parameters>
            <parameter mode="IN" name="geog" type="geography"/>
            <parameter mode="IN" name="use_spheroid" type="boolean"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_perimeter(geometry)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g1 - Returns the length of the boundary of a polygonal geometry or geography.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_perimeter2d_poly]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_perimeter2d(geometry)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA - Returns the 2D perimeter of a polygonal geometry. Alias for ST_Perimeter.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_perimeter2d_poly]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_point(double precision, double precision)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: x, y - Creates a Point with X, Y and SRID values.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_makepoint]]></definition>
         <parameters>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_point(double precision, double precision, srid integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: x, y, srid=unknown - Creates a Point with X, Y and SRID values.]]></comment>
         <definition language="c"><![CDATA[ST_Point]]></definition>
         <parameters>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" name="srid" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_pointfromgeohash(text, integer DEFAULT NULL::integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[point_from_geohash]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_pointfromtext(text)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT CASE WHEN public.geometrytype(public.ST_GeomFromText($1)) = 'POINT'
	THEN public.ST_GeomFromText($1)
	ELSE NULL END]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_pointfromtext(text, integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT CASE WHEN public.geometrytype(public.ST_GeomFromText($1, $2)) = 'POINT'
	THEN public.ST_GeomFromText($1, $2)
	ELSE NULL END]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_pointfromwkb(bytea)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT CASE WHEN public.geometrytype(public.ST_GeomFromWKB($1)) = 'POINT'
	THEN public.ST_GeomFromWKB($1)
	ELSE NULL END]]></definition>
         <parameters>
            <parameter mode="IN" type="bytea"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_pointfromwkb(bytea, integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT CASE WHEN public.geometrytype(public.ST_GeomFromWKB($1, $2)) = 'POINT'
	THEN public.ST_GeomFromWKB($1, $2)
	ELSE NULL END]]></definition>
         <parameters>
            <parameter mode="IN" type="bytea"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_pointinsidecircle(geometry, double precision, double precision, double precision)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_inside_circle_point]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_pointm(xcoordinate double precision, ycoordinate double precision, mcoordinate double precision, srid integer DEFAULT 0)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: x, y, m, srid=unknown - Creates a Point with X, Y, M and SRID values.]]></comment>
         <definition language="c"><![CDATA[ST_PointM]]></definition>
         <parameters>
            <parameter mode="IN" name="xcoordinate" type="double precision"/>
            <parameter mode="IN" name="ycoordinate" type="double precision"/>
            <parameter mode="IN" name="mcoordinate" type="double precision"/>
            <parameter mode="IN" name="srid" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_pointn(geometry, integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: a_linestring, n - Returns the Nth point in the first LineString or circular LineString in a geometry.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_pointn_linestring]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_pointonsurface(geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g1 - Computes a point guaranteed to lie in a polygon, or on a geometry.]]></comment>
         <definition language="c"><![CDATA[pointonsurface]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_points(geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom - Returns a MultiPoint containing the coordinates of a geometry.]]></comment>
         <definition language="c"><![CDATA[ST_Points]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_pointz(xcoordinate double precision, ycoordinate double precision, zcoordinate double precision, srid integer DEFAULT 0)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: x, y, z, srid=unknown - Creates a Point with X, Y, Z and SRID values.]]></comment>
         <definition language="c"><![CDATA[ST_PointZ]]></definition>
         <parameters>
            <parameter mode="IN" name="xcoordinate" type="double precision"/>
            <parameter mode="IN" name="ycoordinate" type="double precision"/>
            <parameter mode="IN" name="zcoordinate" type="double precision"/>
            <parameter mode="IN" name="srid" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_pointzm(xcoordinate double precision, ycoordinate double precision, zcoordinate double precision, mcoordinate double precision, srid integer DEFAULT 0)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: x, y, z, m, srid=unknown - Creates a Point with X, Y, Z, M and SRID values.]]></comment>
         <definition language="c"><![CDATA[ST_PointZM]]></definition>
         <parameters>
            <parameter mode="IN" name="xcoordinate" type="double precision"/>
            <parameter mode="IN" name="ycoordinate" type="double precision"/>
            <parameter mode="IN" name="zcoordinate" type="double precision"/>
            <parameter mode="IN" name="mcoordinate" type="double precision"/>
            <parameter mode="IN" name="srid" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_polyfromtext(text)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT CASE WHEN public.geometrytype(public.ST_GeomFromText($1)) = 'POLYGON'
	THEN public.ST_GeomFromText($1)
	ELSE NULL END]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_polyfromtext(text, integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT CASE WHEN public.geometrytype(public.ST_GeomFromText($1, $2)) = 'POLYGON'
	THEN public.ST_GeomFromText($1, $2)
	ELSE NULL END]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_polyfromwkb(bytea)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT CASE WHEN public.geometrytype(public.ST_GeomFromWKB($1)) = 'POLYGON'
	THEN public.ST_GeomFromWKB($1)
	ELSE NULL END]]></definition>
         <parameters>
            <parameter mode="IN" type="bytea"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_polyfromwkb(bytea, integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT CASE WHEN public.geometrytype(public.ST_GeomFromWKB($1, $2)) = 'POLYGON'
	THEN public.ST_GeomFromWKB($1, $2)
	ELSE NULL END]]></definition>
         <parameters>
            <parameter mode="IN" type="bytea"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_polygon(geometry, integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: lineString, srid - Creates a Polygon from a LineString with a specified SRID.]]></comment>
         <definition language="sql"><![CDATA[SELECT public.ST_SetSRID(public.ST_MakePolygon($1), $2)]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_polygonfromtext(text)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT public.ST_PolyFromText($1)]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_polygonfromtext(text, integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT public.ST_PolyFromText($1, $2)]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_polygonfromwkb(bytea)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT CASE WHEN public.geometrytype(public.ST_GeomFromWKB($1)) = 'POLYGON'
	THEN public.ST_GeomFromWKB($1)
	ELSE NULL END]]></definition>
         <parameters>
            <parameter mode="IN" type="bytea"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_polygonfromwkb(bytea, integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT CASE WHEN public.geometrytype(public.ST_GeomFromWKB($1,$2)) = 'POLYGON'
	THEN public.ST_GeomFromWKB($1, $2)
	ELSE NULL END]]></definition>
         <parameters>
            <parameter mode="IN" type="bytea"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_polygonize(geometry)" returnType="geometry" securityType="INVOKER" type="AGGREGATE">
         <comment><![CDATA[args: geomfield - Computes a collection of polygons formed from the linework of a set of geometries.]]></comment>
         <definition language="internal"><![CDATA[aggregate_dummy]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_polygonize(geometry[])" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom_array - Computes a collection of polygons formed from the linework of a set of geometries.]]></comment>
         <definition language="c"><![CDATA[polygonize_garray]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry[]"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_project(geog geography, distance double precision, azimuth double precision)" returnType="geography" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g1, distance, azimuth - Returns a point projected from a start point by a distance and bearing (azimuth).]]></comment>
         <definition language="c"><![CDATA[geography_project]]></definition>
         <parameters>
            <parameter mode="IN" name="geog" type="geography"/>
            <parameter mode="IN" name="distance" type="double precision"/>
            <parameter mode="IN" name="azimuth" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_quantizecoordinates(g geometry, prec_x integer, prec_y integer DEFAULT NULL::integer, prec_z integer DEFAULT NULL::integer, prec_m integer DEFAULT NULL::integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g, prec_x, prec_y, prec_z, prec_m - Sets least significant bits of coordinates to zero]]></comment>
         <definition language="c"><![CDATA[ST_QuantizeCoordinates]]></definition>
         <parameters>
            <parameter mode="IN" name="g" type="geometry"/>
            <parameter mode="IN" name="prec_x" type="integer"/>
            <parameter mode="IN" name="prec_y" type="integer"/>
            <parameter mode="IN" name="prec_z" type="integer"/>
            <parameter mode="IN" name="prec_m" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_reduceprecision(geom geometry, gridsize double precision)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g, gridsize - Returns a valid geometry with points rounded to a grid tolerance.]]></comment>
         <definition language="c"><![CDATA[ST_ReducePrecision]]></definition>
         <parameters>
            <parameter mode="IN" name="geom" type="geometry"/>
            <parameter mode="IN" name="gridsize" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_relate(geom1 geometry, geom2 geometry)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[relate_full]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_relate(geom1 geometry, geom2 geometry, integer)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[relate_full]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_relate(geom1 geometry, geom2 geometry, text)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[relate_pattern]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_relatematch(text, text)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[ST_RelateMatch]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_removepoint(geometry, integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: linestring, offset - Remove a point from a linestring.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_removepoint]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_removerepeatedpoints(geom geometry, tolerance double precision DEFAULT 0.0)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom, tolerance - Returns a version of a geometry with duplicate points removed.]]></comment>
         <definition language="c"><![CDATA[ST_RemoveRepeatedPoints]]></definition>
         <parameters>
            <parameter mode="IN" name="geom" type="geometry"/>
            <parameter mode="IN" name="tolerance" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_reverse(geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g1 - Return the geometry with vertex order reversed.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_reverse]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_rotate(geometry, double precision)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA, rotRadians - Rotates a geometry about an origin point.]]></comment>
         <definition language="sql"><![CDATA[SELECT public.ST_Affine($1,  cos($2), -sin($2), 0,  sin($2), cos($2), 0,  0, 0, 1,  0, 0, 0)]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_rotate(geometry, double precision, double precision, double precision)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA, rotRadians, x0, y0 - Rotates a geometry about an origin point.]]></comment>
         <definition language="sql"><![CDATA[SELECT public.ST_Affine($1,  cos($2), -sin($2), 0,  sin($2),  cos($2), 0, 0, 0, 1,	$3 - cos($2) * $3 + sin($2) * $4, $4 - sin($2) * $3 - cos($2) * $4, 0)]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_rotate(geometry, double precision, geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA, rotRadians, pointOrigin - Rotates a geometry about an origin point.]]></comment>
         <definition language="sql"><![CDATA[SELECT public.ST_Affine($1,  cos($2), -sin($2), 0,  sin($2),  cos($2), 0, 0, 0, 1, public.ST_X($3) - cos($2) * public.ST_X($3) + sin($2) * public.ST_Y($3), public.ST_Y($3) - sin($2) * public.ST_X($3) - cos($2) * public.ST_Y($3), 0)]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_rotatex(geometry, double precision)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA, rotRadians - Rotates a geometry about the X axis.]]></comment>
         <definition language="sql"><![CDATA[SELECT public.ST_Affine($1, 1, 0, 0, 0, cos($2), -sin($2), 0, sin($2), cos($2), 0, 0, 0)]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_rotatey(geometry, double precision)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA, rotRadians - Rotates a geometry about the Y axis.]]></comment>
         <definition language="sql"><![CDATA[SELECT public.ST_Affine($1,  cos($2), 0, sin($2),  0, 1, 0,  -sin($2), 0, cos($2), 0,  0, 0)]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_rotatez(geometry, double precision)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA, rotRadians - Rotates a geometry about the Z axis.]]></comment>
         <definition language="sql"><![CDATA[SELECT public.ST_Rotate($1, $2)]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_scale(geometry, double precision, double precision)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA, XFactor, YFactor - Scales a geometry by given factors.]]></comment>
         <definition language="sql"><![CDATA[SELECT public.ST_Scale($1, $2, $3, 1)]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_scale(geometry, double precision, double precision, double precision)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA, XFactor, YFactor, ZFactor - Scales a geometry by given factors.]]></comment>
         <definition language="sql"><![CDATA[SELECT public.ST_Scale($1, public.ST_MakePoint($2, $3, $4))]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_scale(geometry, geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom, factor - Scales a geometry by given factors.]]></comment>
         <definition language="c"><![CDATA[ST_Scale]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_scale(geometry, geometry, origin geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom, factor, origin - Scales a geometry by given factors.]]></comment>
         <definition language="c"><![CDATA[ST_Scale]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" name="origin" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_scroll(geometry, geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: linestring, point - Change start point of a closed LineString.]]></comment>
         <definition language="c"><![CDATA[ST_Scroll]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_segmentize(geog geography, max_segment_length double precision)" returnType="geography" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geog, max_segment_length - Return a modified geometry/geography having no segment longer than the given distance.]]></comment>
         <definition language="c"><![CDATA[geography_segmentize]]></definition>
         <parameters>
            <parameter mode="IN" name="geog" type="geography"/>
            <parameter mode="IN" name="max_segment_length" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_segmentize(geometry, double precision)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom, max_segment_length - Return a modified geometry/geography having no segment longer than the given distance.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_segmentize2d]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_seteffectivearea(geometry, double precision DEFAULT '-1'::integer, integer DEFAULT 1)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA, threshold = 0, set_area = 1 - Sets the effective area for each vertex, using the Visvalingam-Whyatt algorithm.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_SetEffectiveArea]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_setpoint(geometry, integer, geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: linestring, zerobasedposition, point - Replace point of a linestring with a given point.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_setpoint_linestring]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="integer"/>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_setsrid(geog geography, srid integer)" returnType="geography" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_set_srid]]></definition>
         <parameters>
            <parameter mode="IN" name="geog" type="geography"/>
            <parameter mode="IN" name="srid" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_setsrid(geom geometry, srid integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom, srid - Set the SRID on a geometry.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_set_srid]]></definition>
         <parameters>
            <parameter mode="IN" name="geom" type="geometry"/>
            <parameter mode="IN" name="srid" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_sharedpaths(geom1 geometry, geom2 geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: lineal1, lineal2 - Returns a collection containing paths shared by the two input linestrings/multilinestrings.]]></comment>
         <definition language="c"><![CDATA[ST_SharedPaths]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_shiftlongitude(geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom - Shifts the longitude coordinates of a geometry between -180..180 and 0..360.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_longitude_shift]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_shortestline(geom1 geometry, geom2 geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom1, geom2 - Returns the 2D shortest line between two geometries]]></comment>
         <definition language="c"><![CDATA[LWGEOM_shortestline2d]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_simplify(geometry, double precision)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA, tolerance - Returns a simplified version of a geometry, using the Douglas-Peucker algorithm.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_simplify2d]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_simplify(geometry, double precision, boolean)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA, tolerance, preserveCollapsed - Returns a simplified version of a geometry, using the Douglas-Peucker algorithm.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_simplify2d]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="boolean"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_simplifypolygonhull(geom geometry, vertex_fraction double precision, is_outer boolean DEFAULT true)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: param_geom, vertex_fraction, is_outer = true - Computes a simplifed topology-preserving outer or inner hull of a polygonal geometry.]]></comment>
         <definition language="c"><![CDATA[ST_SimplifyPolygonHull]]></definition>
         <parameters>
            <parameter mode="IN" name="geom" type="geometry"/>
            <parameter mode="IN" name="vertex_fraction" type="double precision"/>
            <parameter mode="IN" name="is_outer" type="boolean"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_simplifypreservetopology(geometry, double precision)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA, tolerance - Returns a simplified and valid version of a geometry, using the Douglas-Peucker algorithm.]]></comment>
         <definition language="c"><![CDATA[topologypreservesimplify]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_simplifyvw(geometry, double precision)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA, tolerance - Returns a simplified version of a geometry, using the Visvalingam-Whyatt algorithm]]></comment>
         <definition language="c"><![CDATA[LWGEOM_SetEffectiveArea]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_snap(geom1 geometry, geom2 geometry, double precision)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: input, reference, tolerance - Snap segments and vertices of input geometry to vertices of a reference geometry.]]></comment>
         <definition language="c"><![CDATA[ST_Snap]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_snaptogrid(geom1 geometry, geom2 geometry, double precision, double precision, double precision, double precision)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA, pointOrigin, sizeX, sizeY, sizeZ, sizeM - Snap all points of the input geometry to a regular grid.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_snaptogrid_pointoff]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_snaptogrid(geometry, double precision)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA, size - Snap all points of the input geometry to a regular grid.]]></comment>
         <definition language="sql"><![CDATA[SELECT public.ST_SnapToGrid($1, 0, 0, $2, $2)]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_snaptogrid(geometry, double precision, double precision)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA, sizeX, sizeY - Snap all points of the input geometry to a regular grid.]]></comment>
         <definition language="sql"><![CDATA[SELECT public.ST_SnapToGrid($1, 0, 0, $2, $3)]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_snaptogrid(geometry, double precision, double precision, double precision, double precision)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA, originX, originY, sizeX, sizeY - Snap all points of the input geometry to a regular grid.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_snaptogrid]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_split(geom1 geometry, geom2 geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: input, blade - Returns a collection of geometries created by splitting a geometry by another geometry.]]></comment>
         <definition language="c"><![CDATA[ST_Split]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_square(size double precision, cell_i integer, cell_j integer, origin geometry DEFAULT '010100000000000000000000000000000000000000'::geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: size, cell_i, cell_j, origin - Returns a single square, using the provided edge size and cell coordinate within the square grid space.]]></comment>
         <definition language="c"><![CDATA[ST_Square]]></definition>
         <parameters>
            <parameter mode="IN" name="size" type="double precision"/>
            <parameter mode="IN" name="cell_i" type="integer"/>
            <parameter mode="IN" name="cell_j" type="integer"/>
            <parameter mode="IN" name="origin" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_squaregrid(size double precision, bounds geometry, OUT geom geometry, OUT i integer, OUT j integer)" returnType="SETOF record" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: size, bounds - Returns a set of grid squares and cell indices that completely cover the bounds of the geometry argument.]]></comment>
         <definition language="c"><![CDATA[ST_ShapeGrid]]></definition>
         <parameters>
            <parameter mode="IN" name="size" type="double precision"/>
            <parameter mode="IN" name="bounds" type="geometry"/>
            <parameter mode="OUT" name="geom" type="geometry"/>
            <parameter mode="OUT" name="i" type="integer"/>
            <parameter mode="OUT" name="j" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_srid(geog geography)" returnType="integer" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_get_srid]]></definition>
         <parameters>
            <parameter mode="IN" name="geog" type="geography"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_srid(geom geometry)" returnType="integer" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g1 - Returns the spatial reference identifier for a geometry.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_get_srid]]></definition>
         <parameters>
            <parameter mode="IN" name="geom" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_startpoint(geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA - Returns the first point of a LineString.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_startpoint_linestring]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_subdivide(geom geometry, maxvertices integer DEFAULT 256, gridsize double precision DEFAULT '-1.0'::numeric)" returnType="SETOF geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom, max_vertices=256, gridSize = -1 - Computes a rectilinear subdivision of a geometry.]]></comment>
         <definition language="c"><![CDATA[ST_Subdivide]]></definition>
         <parameters>
            <parameter mode="IN" name="geom" type="geometry"/>
            <parameter mode="IN" name="maxvertices" type="integer"/>
            <parameter mode="IN" name="gridsize" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_summary(geography)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g - Returns a text summary of the contents of a geometry.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_summary]]></definition>
         <parameters>
            <parameter mode="IN" type="geography"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_summary(geometry)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g - Returns a text summary of the contents of a geometry.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_summary]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_swapordinates(geom geometry, ords cstring)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom, ords - Returns a version of the given geometry with given ordinate values swapped.]]></comment>
         <definition language="c"><![CDATA[ST_SwapOrdinates]]></definition>
         <parameters>
            <parameter mode="IN" name="geom" type="geometry"/>
            <parameter mode="IN" name="ords" type="cstring"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_symdifference(geom1 geometry, geom2 geometry, gridsize double precision DEFAULT '-1.0'::numeric)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA, geomB, gridSize = -1 - Computes a geometry representing the portions of geometries A and B that do not intersect.]]></comment>
         <definition language="c"><![CDATA[ST_SymDifference]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
            <parameter mode="IN" name="gridsize" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="st_symmetricdifference(geom1 geometry, geom2 geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="sql"><![CDATA[SELECT ST_SymDifference(geom1, geom2, -1.0);]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_tileenvelope(zoom integer, x integer, y integer, bounds geometry DEFAULT '0102000020110F00000200000093107C45F81B73C193107C45F81B73C193107C45F81B734193107C45F81B7341'::geometry, margin double precision DEFAULT 0.0)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: tileZoom, tileX, tileY, bounds=SRID=3857;LINESTRING(-20037508.342789 -20037508.342789,20037508.342789 20037508.342789), margin=0.0 - Creates a rectangular Polygon in Web Mercator (SRID:3857) using the XYZ tile system.]]></comment>
         <definition language="c"><![CDATA[ST_TileEnvelope]]></definition>
         <parameters>
            <parameter mode="IN" name="zoom" type="integer"/>
            <parameter mode="IN" name="x" type="integer"/>
            <parameter mode="IN" name="y" type="integer"/>
            <parameter mode="IN" name="bounds" type="geometry"/>
            <parameter mode="IN" name="margin" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_touches(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[touches]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_transform(geom geometry, from_proj text, to_proj text)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom, from_proj, to_proj - Return a new geometry with coordinates transformed to a different spatial reference system.]]></comment>
         <definition language="sql"><![CDATA[SELECT public.postgis_transform_geometry($1, $2, $3, 0)]]></definition>
         <parameters>
            <parameter mode="IN" name="geom" type="geometry"/>
            <parameter mode="IN" name="from_proj" type="text"/>
            <parameter mode="IN" name="to_proj" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_transform(geom geometry, from_proj text, to_srid integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom, from_proj, to_srid - Return a new geometry with coordinates transformed to a different spatial reference system.]]></comment>
         <definition language="sql"><![CDATA[SELECT public.postgis_transform_geometry($1, $2, proj4text, $3)
	FROM spatial_ref_sys WHERE srid=$3;]]></definition>
         <parameters>
            <parameter mode="IN" name="geom" type="geometry"/>
            <parameter mode="IN" name="from_proj" type="text"/>
            <parameter mode="IN" name="to_srid" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_transform(geom geometry, to_proj text)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom, to_proj - Return a new geometry with coordinates transformed to a different spatial reference system.]]></comment>
         <definition language="sql"><![CDATA[SELECT public.postgis_transform_geometry($1, proj4text, $2, 0)
	FROM spatial_ref_sys WHERE srid=public.ST_SRID($1);]]></definition>
         <parameters>
            <parameter mode="IN" name="geom" type="geometry"/>
            <parameter mode="IN" name="to_proj" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_transform(geometry, integer)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g1, srid - Return a new geometry with coordinates transformed to a different spatial reference system.]]></comment>
         <definition language="c"><![CDATA[transform]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_translate(geometry, double precision, double precision)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g1, deltax, deltay - Translates a geometry by given offsets.]]></comment>
         <definition language="sql"><![CDATA[SELECT public.ST_Translate($1, $2, $3, 0)]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_translate(geometry, double precision, double precision, double precision)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g1, deltax, deltay, deltaz - Translates a geometry by given offsets.]]></comment>
         <definition language="sql"><![CDATA[SELECT public.ST_Affine($1, 1, 0, 0, 0, 1, 0, 0, 0, 1, $2, $3, $4)]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_transscale(geometry, double precision, double precision, double precision, double precision)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA, deltaX, deltaY, XFactor, YFactor - Translates and scales a geometry by given offsets and factors.]]></comment>
         <definition language="sql"><![CDATA[SELECT public.ST_Affine($1,  $4, 0, 0,  0, $5, 0,
		0, 0, 1,  $2 * $4, $3 * $5, 0)]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
            <parameter mode="IN" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_triangulatepolygon(g1 geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom - Computes the constrained Delaunay triangulation of polygons]]></comment>
         <definition language="c"><![CDATA[ST_TriangulatePolygon]]></definition>
         <parameters>
            <parameter mode="IN" name="g1" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_unaryunion(geometry, gridsize double precision DEFAULT '-1.0'::numeric)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom, gridSize = -1 - Computes the union of the components of a single geometry.]]></comment>
         <definition language="c"><![CDATA[ST_UnaryUnion]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" name="gridsize" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_union(geom1 geometry, geom2 geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g1, g2 - Computes a geometry representing the point-set union of the input geometries.]]></comment>
         <definition language="c"><![CDATA[ST_Union]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_union(geom1 geometry, geom2 geometry, gridsize double precision)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g1, g2, gridSize - Computes a geometry representing the point-set union of the input geometries.]]></comment>
         <definition language="c"><![CDATA[ST_Union]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
            <parameter mode="IN" name="gridsize" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_union(geometry)" returnType="geometry" securityType="INVOKER" type="AGGREGATE">
         <comment><![CDATA[args: g1field - Computes a geometry representing the point-set union of the input geometries.]]></comment>
         <definition language="internal"><![CDATA[aggregate_dummy]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_union(geometry, gridsize double precision)" returnType="geometry" securityType="INVOKER" type="AGGREGATE">
         <comment><![CDATA[args: g1field, gridSize - Computes a geometry representing the point-set union of the input geometries.]]></comment>
         <definition language="internal"><![CDATA[aggregate_dummy]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
            <parameter mode="IN" name="gridsize" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_union(geometry[])" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g1_array - Computes a geometry representing the point-set union of the input geometries.]]></comment>
         <definition language="c"><![CDATA[pgis_union_geometry_array]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry[]"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_voronoilines(g1 geometry, tolerance double precision DEFAULT 0.0, extend_to geometry DEFAULT NULL::geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g1, tolerance, extend_to - Returns the boundaries of the Voronoi diagram of the vertices of a geometry.]]></comment>
         <definition language="sql"><![CDATA[SELECT public._ST_Voronoi(g1, extend_to, tolerance, false)]]></definition>
         <parameters>
            <parameter mode="IN" name="g1" type="geometry"/>
            <parameter mode="IN" name="tolerance" type="double precision"/>
            <parameter mode="IN" name="extend_to" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_voronoipolygons(g1 geometry, tolerance double precision DEFAULT 0.0, extend_to geometry DEFAULT NULL::geometry)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: g1, tolerance, extend_to - Returns the cells of the Voronoi diagram of the vertices of a geometry.]]></comment>
         <definition language="sql"><![CDATA[SELECT public._ST_Voronoi(g1, extend_to, tolerance, true)]]></definition>
         <parameters>
            <parameter mode="IN" name="g1" type="geometry"/>
            <parameter mode="IN" name="tolerance" type="double precision"/>
            <parameter mode="IN" name="extend_to" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_within(geom1 geometry, geom2 geometry)" returnType="boolean" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[within]]></definition>
         <parameters>
            <parameter mode="IN" name="geom1" type="geometry"/>
            <parameter mode="IN" name="geom2" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_wkbtosql(wkb bytea)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_from_WKB]]></definition>
         <parameters>
            <parameter mode="IN" name="wkb" type="bytea"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_wkttosql(text)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_from_text]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_wrapx(geom geometry, wrap double precision, move double precision)" returnType="geometry" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geom, wrap, move - Wrap a geometry around an X value.]]></comment>
         <definition language="c"><![CDATA[ST_WrapX]]></definition>
         <parameters>
            <parameter mode="IN" name="geom" type="geometry"/>
            <parameter mode="IN" name="wrap" type="double precision"/>
            <parameter mode="IN" name="move" type="double precision"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_x(geometry)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: a_point - Returns the X coordinate of a Point.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_x_point]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_xmax(box3d)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: aGeomorBox2DorBox3D - Returns the X maxima of a 2D or 3D bounding box or a geometry.]]></comment>
         <definition language="c"><![CDATA[BOX3D_xmax]]></definition>
         <parameters>
            <parameter mode="IN" type="box3d"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_xmin(box3d)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: aGeomorBox2DorBox3D - Returns the X minima of a 2D or 3D bounding box or a geometry.]]></comment>
         <definition language="c"><![CDATA[BOX3D_xmin]]></definition>
         <parameters>
            <parameter mode="IN" type="box3d"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_y(geometry)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: a_point - Returns the Y coordinate of a Point.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_y_point]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_ymax(box3d)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: aGeomorBox2DorBox3D - Returns the Y maxima of a 2D or 3D bounding box or a geometry.]]></comment>
         <definition language="c"><![CDATA[BOX3D_ymax]]></definition>
         <parameters>
            <parameter mode="IN" type="box3d"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_ymin(box3d)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: aGeomorBox2DorBox3D - Returns the Y minima of a 2D or 3D bounding box or a geometry.]]></comment>
         <definition language="c"><![CDATA[BOX3D_ymin]]></definition>
         <parameters>
            <parameter mode="IN" type="box3d"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_z(geometry)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: a_point - Returns the Z coordinate of a Point.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_z_point]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_zmax(box3d)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: aGeomorBox2DorBox3D - Returns the Z maxima of a 2D or 3D bounding box or a geometry.]]></comment>
         <definition language="c"><![CDATA[BOX3D_zmax]]></definition>
         <parameters>
            <parameter mode="IN" type="box3d"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_zmflag(geometry)" returnType="smallint" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: geomA - Returns a code indicating the ZM coordinate dimension of a geometry.]]></comment>
         <definition language="c"><![CDATA[LWGEOM_zmflag]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="st_zmin(box3d)" returnType="double precision" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: aGeomorBox2DorBox3D - Returns the Z minima of a 2D or 3D bounding box or a geometry.]]></comment>
         <definition language="c"><![CDATA[BOX3D_zmin]]></definition>
         <parameters>
            <parameter mode="IN" type="box3d"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="sys_sp_drop_role(IN _tenant_id uuid)" securityType="INVOKER" type="PROCEDURE">
         <comment/>
         <definition language="plpgsql"><![CDATA[declare 
rec record;
db_user varchar(100);
db_policy varchar(100);
begin
	db_user := concat('user_', _tenant_id);
	db_policy := concat('tenant_policy_', _tenant_id);
	if exists (select from pg_catalog.pg_roles where rolname = db_user) then 
		for rec in select tablename from pg_tables as t 
		where t.schemaname = 'public' and tablename not like '__EFMigrationsHistory'and tablename not like 'spatial_ref_sys' 
		loop 
			execute format('revoke select on table %I from %I;', rec.tablename, db_user); 
			execute format('drop policy if exists %I on %I;', db_policy, rec.tablename);	
		end loop;
		execute format('drop user %I', db_user);
	end if;
end;]]></definition>
         <parameters>
            <parameter mode="IN" name="_tenant_id" type="uuid"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="sys_trigger_drop_role()" returnType="trigger" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="plpgsql"><![CDATA[DECLARE 
	rec record;
	db_user varchar(100);
	db_policy varchar(100);
    BEGIN
        db_user := concat('user_', old.id);
		db_policy := concat('tenant_policy_', old.id);
        if exists (select from pg_catalog.pg_roles where rolname = db_user) then 
			for rec in select tablename from pg_tables as t 
			where t.schemaname = 'public' and tablename not like '__EFMigrationsHistory'and tablename not like 'spatial_ref_sys' 
			loop 
				execute format('REVOKE SELECT ON TABLE %I FROM %I;', rec.tablename, db_user); 
				execute format('DROP POLICY IF exists %I ON %I;', db_policy, rec.tablename);	
			end loop;
			execute format('DROP USER %I', db_user);
		end if;
        RETURN NULL; -- result is ignored since this is an AFTER DELETE trigger
    END;]]></definition>
         <parameters>
            <parameter mode="IN"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="true" name="text(geometry)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment/>
         <definition language="c"><![CDATA[LWGEOM_to_text]]></definition>
         <parameters>
            <parameter mode="IN" type="geometry"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="unlockrows(text)" returnType="integer" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: auth_token - Removes all locks held by an authorization token.]]></comment>
         <definition language="plpgsql"><![CDATA[DECLARE
	ret int;
BEGIN

	IF NOT LongTransactionsEnabled() THEN
		RAISE EXCEPTION 'Long transaction support disabled, use EnableLongTransaction() to enable.';
	END IF;

	EXECUTE 'DELETE FROM authorization_table where authid = ' ||
		quote_literal($1);

	GET DIAGNOSTICS ret = ROW_COUNT;

	RETURN ret;
END;]]></definition>
         <parameters>
            <parameter mode="IN" type="text"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="updategeometrysrid(catalogn_name character varying, schema_name character varying, table_name character varying, column_name character varying, new_srid_in integer)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: catalog_name, schema_name, table_name, column_name, srid - Updates the SRID of all features in a geometry column, and the table metadata.]]></comment>
         <definition language="plpgsql"><![CDATA[DECLARE
	myrec RECORD;
	okay boolean;
	cname varchar;
	real_schema name;
	unknown_srid integer;
	new_srid integer := new_srid_in;

BEGIN

	-- Find, check or fix schema_name
	IF ( schema_name != '' ) THEN
		okay = false;

		FOR myrec IN SELECT nspname FROM pg_namespace WHERE text(nspname) = schema_name LOOP
			okay := true;
		END LOOP;

		IF ( okay <> true ) THEN
			RAISE EXCEPTION 'Invalid schema name';
		ELSE
			real_schema = schema_name;
		END IF;
	ELSE
		SELECT INTO real_schema current_schema()::text;
	END IF;

	-- Ensure that column_name is in geometry_columns
	okay = false;
	FOR myrec IN SELECT type, coord_dimension FROM public.geometry_columns WHERE f_table_schema = text(real_schema) and f_table_name = table_name and f_geometry_column = column_name LOOP
		okay := true;
	END LOOP;
	IF (NOT okay) THEN
		RAISE EXCEPTION 'column not found in geometry_columns table';
		RETURN false;
	END IF;

	-- Ensure that new_srid is valid
	IF ( new_srid > 0 ) THEN
		IF ( SELECT count(*) = 0 from spatial_ref_sys where srid = new_srid ) THEN
			RAISE EXCEPTION 'invalid SRID: % not found in spatial_ref_sys', new_srid;
			RETURN false;
		END IF;
	ELSE
		unknown_srid := public.ST_SRID('POINT EMPTY'::public.geometry);
		IF ( new_srid != unknown_srid ) THEN
			new_srid := unknown_srid;
			RAISE NOTICE 'SRID value % converted to the officially unknown SRID value %', new_srid_in, new_srid;
		END IF;
	END IF;

	IF postgis_constraint_srid(real_schema, table_name, column_name) IS NOT NULL THEN
	-- srid was enforced with constraints before, keep it that way.
		-- Make up constraint name
		cname = 'enforce_srid_'  || column_name;

		-- Drop enforce_srid constraint
		EXECUTE 'ALTER TABLE ' || quote_ident(real_schema) ||
			'.' || quote_ident(table_name) ||
			' DROP constraint ' || quote_ident(cname);

		-- Update geometries SRID
		EXECUTE 'UPDATE ' || quote_ident(real_schema) ||
			'.' || quote_ident(table_name) ||
			' SET ' || quote_ident(column_name) ||
			' = public.ST_SetSRID(' || quote_ident(column_name) ||
			', ' || new_srid::text || ')';

		-- Reset enforce_srid constraint
		EXECUTE 'ALTER TABLE ' || quote_ident(real_schema) ||
			'.' || quote_ident(table_name) ||
			' ADD constraint ' || quote_ident(cname) ||
			' CHECK (st_srid(' || quote_ident(column_name) ||
			') = ' || new_srid::text || ')';
	ELSE
		-- We will use typmod to enforce if no srid constraints
		-- We are using postgis_type_name to lookup the new name
		-- (in case Paul changes his mind and flips geometry_columns to return old upper case name)
		EXECUTE 'ALTER TABLE ' || quote_ident(real_schema) || '.' || quote_ident(table_name) ||
		' ALTER COLUMN ' || quote_ident(column_name) || ' TYPE  geometry(' || public.postgis_type_name(myrec.type, myrec.coord_dimension, true) || ', ' || new_srid::text || ') USING public.ST_SetSRID(' || quote_ident(column_name) || ',' || new_srid::text || ');' ;
	END IF;

	RETURN real_schema || '.' || table_name || '.' || column_name ||' SRID changed to ' || new_srid::text;

END;]]></definition>
         <parameters>
            <parameter mode="IN" name="catalogn_name" type="character varying"/>
            <parameter mode="IN" name="schema_name" type="character varying"/>
            <parameter mode="IN" name="table_name" type="character varying"/>
            <parameter mode="IN" name="column_name" type="character varying"/>
            <parameter mode="IN" name="new_srid_in" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="updategeometrysrid(character varying, character varying, character varying, integer)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: schema_name, table_name, column_name, srid - Updates the SRID of all features in a geometry column, and the table metadata.]]></comment>
         <definition language="plpgsql"><![CDATA[DECLARE
	ret  text;
BEGIN
	SELECT public.UpdateGeometrySRID('',$1,$2,$3,$4) into ret;
	RETURN ret;
END;]]></definition>
         <parameters>
            <parameter mode="IN" type="character varying"/>
            <parameter mode="IN" type="character varying"/>
            <parameter mode="IN" type="character varying"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
      <routine dataAccess="MODIFIES" deterministic="false" name="updategeometrysrid(character varying, character varying, integer)" returnType="text" securityType="INVOKER" type="FUNCTION">
         <comment><![CDATA[args: table_name, column_name, srid - Updates the SRID of all features in a geometry column, and the table metadata.]]></comment>
         <definition language="plpgsql"><![CDATA[DECLARE
	ret  text;
BEGIN
	SELECT public.UpdateGeometrySRID('','',$1,$2,$3) into ret;
	RETURN ret;
END;]]></definition>
         <parameters>
            <parameter mode="IN" type="character varying"/>
            <parameter mode="IN" type="character varying"/>
            <parameter mode="IN" type="integer"/>
         </parameters>
      </routine>
   </routines>
</database>
