AMT Application Config File
The amt-config.yaml file is used to configure AMT applications. Each key and setting found in this file is described below.
Base Configuration
| Settings | Description | Accepted Values | Examples |
| version | The version of this configuration file. | <version> | version: v1 |
| name | The name of the AMT environment. | <name> | name: AMT Java |
| environment | The description for this AMT environment. | <description> | environment: prod |
| basePath | The base path (root) folder of the environment. | <root folder path> | basePath: "C:/AMT" |
| applicationName | The name of the application. This name is also used to define the application database and must therefore be exactly the same. | <application name> | applicationName: CUSTOMER_MANAGEMENT |
| applicationPackage | The domain, followed by company or organization name, and application name. | <app domain> | applicationPackage: com.helloword.company |
| remoteApplicationPackages | The domain, followed by company or organization name, and application name. On startup, all programs from the specified remote packges are loaded in order, and duplicates are skipped. |
<X app package> <Y app package> |
remoteApplicationPackage: com.helloword.company
|
Secure Storages
The settings for Secure Storage providers, which relate to the database settings further down.
This setting is replaces the Secure Storage section which only allowed for a single secure storage provider.
| Settings | Description | Accepted Values | Examples |
| id | ID of the secure storage provider. The ID is used as prefix to the key to indicate which secure storage provider is used. Example: Password: $default.sysdbpw |
<Secure Storage ID> | id: default |
| vaultType | The vault type used to secure credentials. It is possible to add multiple Secure Storage configurations
and use them simultaneously.
|
Azure GCP HashiCorp CyberArk Custom Simple |
vaultType: Azure
|
| azureCredentialType (only for Microsoft Azure) | Only used if 'vaultType' is set to 'Azure'. Set the Azure credential type. |
Environment ... |
azureCredentialType: Environment |
| azureVaultName (only for Microsoft Azure) | Only used if 'vaultType' is set to 'Azure'. Enter the name of the Azure vault. | <key vault name> | azureVaultName: app-keyvault |
| gcpProjectId (only for Google Cloud Platform) | Only used if 'vaultType' is set to 'GCP'. Set the GCP vault ID. | <GCP vault ID> | gcpProjectId: vault-33 |
| securePath (only for HashiCorp) | Only used if 'vaultType' is set to 'HashiCorp'. Set this to the folder path containing the secrets for the HashiCorp Vault. | <folder path> | securePath: "C:/AMT/HashiCorp" |
| engineVersion (only for HashiCorp) |
Only used if 'vaultType' is set to 'HashiCorp'. '2' is the default value if the engine version is not specified. | 1 2 |
engineVersion: 2 |
| vaultClass (custom) | Optional. Used when vaultType is set to "Custom" to use a custom impelementation. | <vault class> | |
| authenticationType | Specify the type of authentication to use for the vault. | rest (default) sdk |
authenticationType: rest |
| vaultFilePath | Only used if 'vaultType' is set to 'Simple'. Set this to the file path of the file containing the
credentials of the application database. Not recommended for use in production.Also see page: File: Key Vault. |
<folder path> | vaultConfiguration: |
Authentication
In the sample config file, the client name is "rest" – this can be named anything, as long as it is unique when defining multiple clients.
| Settings | Description | Available Options | Examples |
| type | The type of authentication used. OpenID Connect (OIDC) is the only available option. | OIDC | type: OIDC |
| issuerURL | The URL of the OpenID provider. | <provider url> | issuerURL: https://login.microsoftonline.com/<ID>/v2.0 |
| clientID | The ID of the application registered at the OpenID provider to identify the application when authentication requests are made. | <client ID> | clientID: <client ID> |
| claimUserName | Set the username. This must match the claimUserName provided in the oidcconfig.json file. If no value is
given, it is set to preferred_username |
<username> | preferred_username |
| claimUserRoles | Set the origin of the user roles. AMT manages the user roles by default. By setting it to OAUTH, the user roles will be taken from the OpenID provider token. If set to OAUTH the claimRolesKey and roleMapping settings must be set. |
AMT (default) OAUTH |
claimUserRoles: AMT |
| claimRolesKey | Key to roles in the OpenID provider token. Must be set when claimUserRoles is set to OAUTH. Examples of role keys: For Azure Entra ID the key is "groups". For keycloak it is "resource_access;<clientID>;roles", it is 3 layers deep, using ; as separator. |
<roles key> | claimRolesKey: groupsclaimRolesKey: resource_access;-demo;roles
|
| roleMapping | Maps the user roles from the OpenID provider token to AMT user roles. Must be set when claimUserRoles is set to OAUTH. |
<OAuth role>: <AMT role> | roleMapping:
|
Runtime Configuration
| Settings | Description | Accepted Values | Examples |
| customSignEncoding | Define a custom sign encoding. This must be a string of 20 unique characters, corresponding with the sign encoding digits -9 to -0, followed by +0 to +9. In the example, the custom sign encoding uses the same characters as the EBCDIC numeric sign encoding type. | <sign encoding> | customSignEncoding: RQPONMLKJ}{ABCDEFGHI |
| cacheWorkingStorage | If set to true, local definition items will be cached. | true false (default) |
cacheWorkingStorage: false |
| storeCompInASCII | If set to true, computational values will be stored in ASCII. | true (default) false |
storeCompInASCII: true |
| translationFileEBCDIC | The file path to the translation file. | <translation file path> | translationFileEBCDIC: "C:/AMT/translationFileEBCDIC" |
| useAmtCursor | If set to true, cursor queries will be replaced by a select query to improve performance. This is the default behavior for Oracle databases regardless of this setting. Note: when using AMT Cursor, it is not possible to execute a commit inside a loop where records are read. This will produce a warning in the logfiles. |
true false (default) |
useAmtCursor: false |
| clientTimeout | Set a timeout in milliseconds. | <integer> | clientTimeout: 3000 |
| transactionTimeout | Set a timeout for transactions in milliseconds. | <integer> | transactionTimeout: 3000 |
| expiredFileTaskTimeout | Set a timeout for file tasks in seconds. | <integer> | expiredFileTaskTimeout: 60 |
| grpcIdleTimeout | This is the timeout (in seconds) for idle channels before it is closed by the server. This could be useful while debugging to prevent channels getting closed during long gRPC calls. | <integer> | grpcIdleTimeout: 60 |
| fileMessageSize | Set the (maximum) message size in MB. | <MegaBytes> | fileMessageSize: 2 |
| gdgMaxCycleNumber | Set the maximum number of cycles. | <integer> | gdgMaxCycleNumber: 9999 |
| urimap | Enter the filepath\filename containing the URIMAP configuration. This is only required if CICS statements use URIMAP. | <urimap folder path> | urimap: "urimap.yaml" |
| pythonInterpreter | This setting is optional. Specify the full path to the binary that the system should use as the Python interpreter. | <path to interpreter> |
pythonInterpreter: pythonpythonInterpreter: "C:/path/to/Python/Executable.exe"
|
| useDate | This setting is optional. Set a date to be used for testing purposes in yyyyMMdd format. The application uses this date instead of the system date. | <yyMMdd> | useDate: 20250123 |
| addAppNameToForm | If enabled, the application name is added to forms. | true (default) false |
addAppNameToForm: true |
| formInputsUpperCase | If enabled, all form input data will be made upper case at runtime. | true false (default) |
formInputsUpperCase: true |
| jclConverterPath | Enter the path to the AMT JCL Converter. This option is used for Dynamic JCL functionality in AMT, which is a bespoke customer solution. |
<path to converter> | jclConverterPath: /home/user/tools/JclConverterConsole.dll |
| jclOutputPath | Enter the path for the processed JCL output. This option is used for Dynamic JCL functionality in AMT, which is a bespoke customer solution. |
<path for processed output> | jclOutputPath: /home/user/python/converted_jcl |
Database Configuration
The Database configuration section. First, the database kind needs to be defined. Use
'applicationDatabase' for applications. See the Control Center
Config File to configure the System and Transaction databases.
All of the database settings can be stored in a key vault. A dollar sign $ prefixing a
value denotes the use of a key stored in a key vault.
| Settings | Description | Accepted Values | Examples | ||
| aliases | Enter aliases to applications. | <comma separated strings> | type: al1, al2 |
||
| type | Set the type of database. |
POSTGRES (default) ORACLE MSSQL DB2 |
type: POSTGRES |
||
| name | Enter the name of the Application Database. | <application database> |
name: CUSTOMER_MANAGEMENTname: $default.appDb
|
||
| schema | Enter the name of the Schema of the Application Database. The Schema name must be exactly the same as the Database name. | <application database schema> |
schema: CUSTOMER_MANAGEMENTschema: $default.appDbSchema
|
||
| username | Set the name of the user authorized to access the Application Database. | <username> |
username: amtuserusername: $default.appDbUser
|
||
| password | Set the Password of the user. | <password> |
password: amtpasswordpassword: $default.appDbPassword
|
||
| driverClassname | Set the driver for the database.
|
org.postgresql.Driver oracle.jdbc.driver com.ibm.db2.jcc.DB2Driver <custom> |
driverClassname: org.postgresql.Driver |
||
| url | Set the server database URL. This must be configured according to the type of database used:
|
jdbc:postgresql://<Server>:<Port>/<Database> jdbc:oracle://<Server>:<Port>/<TNS> jdbc:db2://<Server>:<Port>/<Database> |
url: jdbc:postgresql://<Server>:<Port>/<Database> |
||
| hibernateDialect | Set the database dialect for the Hibernate framework.
|
org.hibernate.dialect.PostgreSQLDialect org.hibernate.dialect.DB2Dialect org.hibernate.dialect.OracleDialect |
hibernateDialect: org.hibernate.dialect.PostgreSQLDialect |
||
| hibernateShowSql | If set to true, this enables the logging of all the generated SQL statements to the console and a log file. | true false |
hibernateShowSQL: false |
||
| queryCacheSize | Set the query cache size in MegaBytes. | <integer> | queryCacheSize: 2 |
||
| connectionPoolSize | Set the maximum number of connections. | <integer> | connectionPoolSize: 200 |
||
| minimum-idle | Set the minimum number of idle connections. | <integer> | minimum-idle: 1 |
||
| encryptConnection | If set to true, this enables SSL for the database connection. Supported databases include MSSQL, PostgreSQL, and DB2. | true false (default) |
encryptConnection: true |
||
| stringParametersAsUnicode | If set to true, string paramaters are sent to the database in unicode format. The default is false for performance reasons. |
true false (default) |
stringParametersAsUnicode: false |
||
| statementCachePoolSize | Set the statement cache pool size in MegaBytes. If set to 0, statement caching is disabled. | <integer> | statementCachePoolSize: 10 |
||
| newConnection | Set to true to force the use of a new database connection for remote database queries. If set to false (default) then the schema prefix will be added before every remote table access. |
true false (default) |
newConnection: false |
||
| lockTimeoutSeconds | The number of seconds before a database is unlocked. | <integer> | lockTimeoutSeconds: 20 |
||
| lockTimeoutReportsProgramsSeconds | The number of seconds before a database is unlocked. If the lock is not released after the timeout, the report or program will retry several times. | <integer> | lockTimeoutReportsProgramsSeconds: 5 |
||
| sqlCommandTimeout | The number of seconds for a screen or report to wait for a SQL command to be performed. | <integer> | sqlCommandTimeout: 30 |
||
| nlsLanguage warning Oracle databases only |
Set the language for an Oracle client connection. | <language> | nlsLanguage: AMERICAN |
||
| credentials (optional) warning Oracle databases only |
Provide alternative database credentials and schemas for a client connection. If an application attempts
to connect to a remote database with credentials, AMT first retrieves the credentials from this
credentials section.
|
<username> <password> <schema> |
credentials: |
||
| Hikari Custom Properties | Only a select amount of commonly used Hikari properties are present in this table.
Visit the Hikari GitHub page to view all
properties and more information. A HikariCP property can be configured by prefixing it with
hikari. |
||||
| hikari.connectionTimeout | Maximum amount of milliseconds for a client to wait for a connection from the pool. | 30000 (default) 250 (minimum) |
hikari.connectionTimeout: 30000
|
||
| hikari.idleTimeout | Maximum amount of milliseconds a connection can sit idle in the pool. Only applies if
minimumIdle is configured to be less than maximumPoolSize.
|
600000 (default) 10000 (minimum) |
|||
| hikari.maxLifetime | Maximum lifetime in milliseconds of a connection in the pool. An in-use connection is never be retired. | 1800000 (default) 30000 (minimum) |
|||
| hikari.leakDetectionThreshold | Time in milliseconds before a connection leak is logged. This is disabled if set to 0. |
0 (default) 2000 (minimum) |
|||
| hikari.validationTimeout | Maximum amount of time in milliseconds to wait for a connection validation. This value must be less than
connectionTimeout.
|
5000 (default) 250 (minimum) |
|||
| hikari.connectionTestQuery | The query to execute for testing the validity of connections. | <SQL Query> none (default) |
|||
| hikari.autoCommit | Whether connections should default to auto-commit. Only applies if autoCommit is disabled.
|
true false (default) |
|||
Clusters
The Cluster and Remote Cluster sections. A cluster configuration allows the bundling or separation of applications, and controllers. A cluster consists of a single node or multiple nodes (optional), including remote cluster nodes. A remote cluster allows for starting transactions on a remote application. Remote cluster nodes only require host and gRPCPort settings.
| Settings | Description | Accepted Values | Examples |
| type | The type of cluster used. PEKKO is the only available option. | PEKKO | type: PEKKO |
| mode | Set the cluster mode to single node, multi(cluster) node or bootstrap. |
SINGLE_NODE CLUSTER_NODE BOOTSTRAP |
mode: SINGLE_NODE |
| host | The server address of the node. | <ip address or host name> | host: 0.0.0.0 |
| port | The management port for the node. Only required when using the CLUSTER_NODE mode. |
<port number> | port: 25251 |
| seedNodes | The server address and port of the cluster seed nodes. Only required when using the CLUSTER_NODE mode. |
<ip address or server name>:<port number> (comma separated) | seedNodes: localhost:25251,localhost:25252 |
| gRPCPort | Set the gRPC port of the node. | <port number> | gRPCPort: 8080 |
| restPort | Set the REST port of the node. | <port number> | restPort: 9000 |
| httpOnly | If set to True, the system only uses the HTTP protocol for communication between nodes in the cluster. | true false |
httpOnly: false |
| roles | Sets the roles assigned for this node. Available roles are: job, transaction, program, file, print Only required when using the CLUSTER_NODE mode. |
<role name> (comma separated) | roles: job,file,program |
| jobQueues | Sets the job queues assigned for this node. | <job queue name> (comma separated) | jobQueues: default,monthly |
COBOL Configuration
The COBOL Configuration section, cobolConfig, for AMT applications.
| Settings | Description | Accepted Values | Examples |
| cwaSize | The size of the Common Work Area in bytes. | <integer> | cwaSize: 0 |
Sample File
---
####################################################################################################
#
# APPLICATION CONFIGURATION
# General application related configuration items.
#
####################################################################################################
version: v1
name: AMT GO Java Application Configuration Template
environment: DEV
basePath: "C:/Amt"
applicationName: smoketest
applicationPackage: com.avanade.ltcoe.smoketest
remoteApplicationPackages: # Optional, all remote packages need to be part of the allinone-jar
XX: com.avanade.ltcoe.package1
YY: com.avanade.ltcoe.package2
####################################################################################################
#
# SECURE STORAGE SECTION
# Settings related to the secure storage provider. This ties into the database settings later on.
#
####################################################################################################
secureStorages:
# Secure Storage can be configured in a couple of different ways.
# See the Secure Storage Wiki page for more information.
- id: local-vault
vaultType: Simple
vaultConfiguration:
authenticationType: rest # or sdk
vaultFilePath: "C:/AMT/smoketest-secrets.txt"
####################################################################################################
#
# AUTHENTICATION CONFIGURATION SECTION
# Settings related to the external authentication provider.
# Defaults are added for a simple KeyCloak setup, if another authentication provider is required,
# then you need to add the correct issuerURL & clientID.
#
####################################################################################################
authentication:
type: OIDC
clients:
rest:
settings:
issuerURL: http://localhost:8080/realms/AMTRealm
clientID: AMT
claimUserName: preferred_username
claimUserRoles: amt # "oauth". When using OAuth, claimRolesKey and rolemapping needs to be configured
#claimRolesKey: # Key to roles in OAth token. For Azure e.g. it is "groups",
# where for keycloak it is "resource_access;AMT;roles", it is 3 layers deep, using ; separates the keys.
#roleMapping:
#role1: amt_role1
####################################################################################################
#
# SERVER CERTIFICATE CONFIGURATION
# Paths to the server key and certificate (file or classpath resource).
# If not set, the default key and certificate will be loaded from the classpath (/certs/server1.key and /certs/server1.pem)
#
####################################################################################################
serverCertificate:
# Can be a file path or classpath resource.
####################################################################################################
#
# RUNTIME CONFIGURATION SECTION
# Settings related to the runtime behavior of the application.
#
####################################################################################################
runtime:
settings:
customSignEncoding: ""
cacheWorkingStorage: false
storeCompInASCII: true
translationFileEBCDIC: "C:/Amt/translationFileEBCDIC"
useAmtCursor: false
clientTimeout: 3000 # milliseconds
transactionTimeout: 3000 # milliseconds
expiredFileTaskTimeout: 60 # seconds
grpcIdleTimeout: 60 # seconds
fileMessageSize: 2 # MB
gdgMaxCycleNumber: 9999
#urimap field is an optional, it required when the CICS statement uses URIMAP
#urimap: "urimap.yaml"
# Optional, set specific path to python interpreter if it's not the default version on the OS.
# Applies only to the application runtime configuration.
#pythonInterpreter: "C:/Path/To/Python/Executable.exe"
# Optional, set a date to be used for testing purposes.
# Application uses this date instead of the system date. Format is yyyyMMdd
#useDate: 20250123
#addAppNameToForm: true
# formInputsUpperCase is optional. If set to true, all form input data will be made upper case at runtime
# formInputsUpperCase: true
# jclConverterPath: /home/user/tools/JclConverterConsole.dll
# jclOutputPath : /home/user/python/converted_jcl
####################################################################################################
#
# SYSTEM DATABASE CONFIGURATION SECTION FOR POSTGRESQL
# Settings related to the system database. Values can be keys for the configured key vault
# from the Secure Storage section up above.
#
####################################################################################################
systemDatabase:
type: POSTGRES
settings:
name: amtsystem
schema: amtsystem
username: amtsystem
password: amtsystem
driverClassname: org.postgresql.Driver
url: jdbc:postgresql://localhost/amtsystem
hibernateDialect: org.hibernate.dialect.PostgreSQLDialect
# Uncomment these if you want to override the default values.
#hibernateShowSql: false
#connectionPoolSize: 200
#lockTimeoutSeconds: 20
#lockTimeoutReportsProgramsSeconds: 5
#sqlCommandTimeout: 30
####################################################################################################
#
# SYSTEM DATABASE CONFIGURATION SECTION FOR DB2
# For DB2 use same settings as for PostgreSql except for the ones below
#
####################################################################################################
#systemDatabase:
#type: DB2
#settings:
#driverClassname: com.ibm.db2.jcc.DB2Driver
#url: jdbc:db2://localhost:25000/dbname
#hibernateDialect: org.hibernate.dialect.DB2Dialect
####################################################################################################
#
# TRANSACTION DATABASE CONFIGURATION SECTION (ENABLE & USE WHEN CONFIGURING A TRANSACTION DATABASE)
# Settings related to the transaction database. Values can be keys for the configured key vault
# from the Secure Storage section up above.
#
####################################################################################################
#transactionDatabase:
# type: POSTGRES
# settings:
# name: amtsystransaction <Create name>
# schema: amtsystransaction <Create schema>
# username: amtsystransactionUser <username from secrets file>
# password: amtsystransactionPassword <password from secrets file>
# driverClassname: org.postgresql.Driver
# url: jdbc:postgresql://localhost/amtsystransaction
# hibernateDialect: org.hibernate.dialect.PostgreSQLDialect
# # Uncomment these if you want to override the default values.
# #hibernateShowSql: false
# #connectionPoolSize: 200
# #lockTimeoutSeconds: 20
# #lockTimeoutReportsProgramsSeconds: 5
# #sqlCommandTimeout: 30
####################################################################################################
#
# TRANSACTION DATABASE CONFIGURATION SECTION FOR DB2
# For DB2 use same settings as for PostgreSql except for the ones below
#
####################################################################################################
#transactionDatabase:
#type: DB2
#settings:
#driverClassname: com.ibm.db2.jcc.DB2Driver
#url: jdbc:db2://localhost:25000/dbname
#hibernateDialect: org.hibernate.dialect.DB2Dialect
####################################################################################################
#
# APPLICATION DATABASE CONFIGURATION SECTION FOR POSTGRESQL
# Settings related to the application database. Values can be keys for the configured key vault
# from the Secure Storage section up above.
#
####################################################################################################
smoketest:
aliases: al1, al2
type: POSTGRES
settings:
name: smoketest
schema: smoketest
username: smoketest
password: smoketest
driverClassname: org.postgresql.Driver
url: jdbc:postgresql://localhost/smoketest
# Uncomment these if you want to override the default values.
#queryCacheSize: 2 # MB
#connectionPoolSize: 200
#minimum-idle: 1
#encryptConnection: false
#stringParametersAsUnicode: false
#statementCachePoolSize: 10 # If set to 0 statement caching is disabled
#newConnection: false
#nlsLanguage: AMERICAN
#credentials:
# - username: $default:us_1
# password: $default:ps_1
# - username: $default:us_2
# password: $default:ps_2
# - username: $default:us_3
# password: $default:ps_3
####################################################################################################
#
# HIKARICP CUSTOM PROPERTIES
# Any HikariCP property can be configured by prefixing it with "hikari."
# Properties will be applied dynamically to the HikariDataSource.
# See https://github.com/brettwooldridge/HikariCP#configuration-knobs-baby for available properties.
#
####################################################################################################
# Examples of commonly used HikariCP properties:
#hikari.connectionTimeout: 30000 # Maximum time (ms) to wait for a connection from the pool
#hikari.idleTimeout: 600000 # Maximum time (ms) a connection can sit idle in the pool
#hikari.maxLifetime: 1800000 # Maximum lifetime (ms) of a connection in the pool
#hikari.leakDetectionThreshold: 0 # Time (ms) before a connection leak is logged (0 = disabled)
#hikari.validationTimeout: 5000 # Maximum time (ms) for connection validation query
#hikari.connectionTestQuery: SELECT 1 # SQL query to validate connections
#hikari.autoCommit: true # Default auto-commit behavior
####################################################################################################
#
# APPLICATION DATABASE CONFIGURATION SECTION FOR DB2
# For DB2 use same settings as for PostgreSql except for the ones below
#
####################################################################################################
#smoketest:
#type: DB2
#settings:
#driverClassname: com.ibm.db2.jcc.DB2Driver
#url: jdbc:db2://localhost:25000/dbname
#hibernateDialect: org.hibernate.dialect.DB2Dialect
####################################################################################################
#
# CLUSTER CONFIGURATION (SINGLE-NODE EXAMPLE)
# Settings related to the cluster configuration. A cluster can be single node (as configured below)
# or multi-node (as shown in the commented out example further down).
#
####################################################################################################
cluster:
type: PEKKO
mode: SINGLE_NODE
nodes:
single-node-amt:
settings:
host: 0.0.0.0
gRPCPort: 8080
restPort: 9000
httpOnly: false
jobQueues: default
remoteCluster:
nodes:
remote-node:
settings:
host: 0.0.0.0
gRPCPort: 9090
####################################################################################################
#
# CLUSTER CONFIGURATION (MULTI-NODE EXAMPLE)
# Multi-node settings for a cluster configuration.
#
####################################################################################################
#cluster:
# type: PEKKO
# mode: CLUSTER_NODE
# nodes:
# node-1:
# settings:
# host: 0.0.0.0
# port: 25251
# seedNodes: localhost:25251,localhost:25252
# gRPCPort: 8080
# restPort: 9000
# httpOnly: false
# roles: job,file,program
# jobQueues: Default
# node-2:
# settings:
# host: 0.0.0.0
# port: 25252
# seedNodes: localhost:25251,localhost:25252
# gRPCPort: 8081
# restPort: 9001
# httpOnly: false
# roles: job,file,program
# jobQueues: Default
# node-3:
# settings:
# host: 0.0.0.0
# port: 0
# seedNodes: localhost:25251,localhost:25252
# gRPCPort: 8082
# restPort: 9002
# httpOnly: false
# roles: transaction,file
# node-4:
# settings:
# host: 0.0.0.0
# port: 0
# seedNodes: localhost:25251,localhost:25252
# gRPCPort: 8083
# restPort: 9003
# httpOnly: false
# roles: transaction,file,print
####################################################################################################
#
# COBOL CONFIGURATION
#
####################################################################################################
cobolConfig:
cwaSize: 0
...
