Source restructure. yaz-marcdump part of installation
[yaz-moved-to-github.git] / src / z3950v3.asn
diff --git a/src/z3950v3.asn b/src/z3950v3.asn
new file mode 100644 (file)
index 0000000..98cf885
--- /dev/null
@@ -0,0 +1,2667 @@
+Z39-50-APDU-1995 -- OID for this definition, assigned in OID.3.1, is {Z39-50 2 1} 
+DEFINITIONS ::=  
+BEGIN   -- Z39.50 Maintenance Agency Official Text for ANSI/NISO Z39.50-1995 - July 1995
+--
+EXPORTS OtherInformation, Term, AttributeSetId, AttributeList, AttributeElement, ElementSetName, SortElement, DatabaseName,
+CompSpec, Specification, Permissions, InternationalString, IntUnit, Unit, StringOrNumeric, Query, Records, ResultSetId,
+DefaultDiagFormat, DiagRec, Segment;
+--
+
+PDU ::= CHOICE{
+ initRequest        [20] IMPLICIT InitializeRequest,
+ initResponse      [21] IMPLICIT InitializeResponse,
+ searchRequest      [22] IMPLICIT SearchRequest,
+ searchResponse      [23] IMPLICIT SearchResponse,
+ presentRequest      [24] IMPLICIT PresentRequest,
+ presentResponse      [25] IMPLICIT PresentResponse,
+ deleteResultSetRequest    [26] IMPLICIT DeleteResultSetRequest,
+ deleteResultSetResponse    [27] IMPLICIT DeleteResultSetResponse,
+ accessControlRequest    [28] IMPLICIT AccessControlRequest,
+ accessControlResponse    [29] IMPLICIT AccessControlResponse,
+ resourceControlRequest         [30] IMPLICIT ResourceControlRequest,
+ resourceControlResponse    [31] IMPLICIT ResourceControlResponse,
+ triggerResourceControlRequest  [32] IMPLICIT TriggerResourceControlRequest,
+ resourceReportRequest          [33] IMPLICIT ResourceReportRequest,
+ resourceReportResponse    [34] IMPLICIT ResourceReportResponse,
+ scanRequest         [35] IMPLICIT ScanRequest,
+ scanResponse      [36] IMPLICIT ScanResponse,
+              -- [37] through [42] reserved
+ sortRequest        [43] IMPLICIT SortRequest,
+ sortResponse      [44] IMPLICIT SortResponse,
+ segmentRequest      [45] IMPLICIT Segment,
+ extendedServicesRequest    [46] IMPLICIT ExtendedServicesRequest,
+ extendedServicesResponse    [47] IMPLICIT ExtendedServicesResponse,
+ close          [48] IMPLICIT Close,
+ duplicateDetectionRequest      [49] IMPLICIT DuplicateDetectionRequest,
+ duplicateDetectionResponse     [50] IMPLICIT DuplicateDetectionResponse}
+
+
+-- Initialize APDUs
+--
+  InitializeRequest ::= SEQUENCE{
+  referenceId        ReferenceId OPTIONAL,
+  protocolVersion      ProtocolVersion,
+  options        Options,
+  preferredMessageSize  [5]  IMPLICIT INTEGER,
+   exceptionalRecordSize  [6]  IMPLICIT INTEGER,
+   idAuthentication    [7]    IdAuthentication OPTIONAL, -- see note below
+  implementationId    [110]  IMPLICIT InternationalString OPTIONAL,
+  implementationName  [111]  IMPLICIT InternationalString OPTIONAL,
+   implementationVersion  [112]  IMPLICIT InternationalString OPTIONAL,   
+  userInformationField  [11]  EXTERNAL OPTIONAL,
+  otherInfo        OtherInformation OPTIONAL}
+--Note:
+-- For idAuthentication, the type ANY is retained for compatibility with earlier versions. 
+-- For interoperability, the following is recommended:
+IdAuthentication ::=
+   CHOICE{
+      open   VisibleString,
+      idPass  SEQUENCE {
+      groupId  [0]  IMPLICIT InternationalString OPTIONAL,
+      userId   [1]  IMPLICIT InternationalString OPTIONAL,
+      password  [2]  IMPLICIT InternationalString OPTIONAL },
+      anonymous  NULL,
+      other    EXTERNAL
+   }
+-- May use access control formats for 'other'.  See Appendix 7 ACC.
+--
+  InitializeResponse ::= SEQUENCE{
+  referenceId        ReferenceId OPTIONAL,
+   protocolVersion                ProtocolVersion,
+  options              Options,
+  preferredMessageSize  [5]  IMPLICIT INTEGER,
+   exceptionalRecordSize  [6]  IMPLICIT INTEGER,
+  result        [12]  IMPLICIT BOOLEAN,    -- reject = FALSE; Accept = TRUE
+  implementationId    [110]  IMPLICIT InternationalString OPTIONAL,
+  implementationName  [111]  IMPLICIT InternationalString OPTIONAL,
+   implementationVersion  [112]  IMPLICIT InternationalString OPTIONAL,   
+  userInformationField  [11]  EXTERNAL OPTIONAL,
+  otherInfo        OtherInformation OPTIONAL}
+-- Begin auxiliary definitions for Init PDUs
+  ProtocolVersion  ::=  [3]   IMPLICIT BIT STRING{
+    version-1      (0),       -- This bit should always be set, but does not
+              -- correspond to any Z39.50 version.
+    version-2      (1),              -- "Version 2 supported."
+              -- This bit should always be set.
+    version-3      (2)        -- "Version 3 supported."
+-- Values higher than 'version-3' should be ignored. Both the Initialize request and Initialize Response APDUs
+-- include a value string corresponding to the supported versions. The highest common version is selected
+-- for use. If there are no versions in common, "Result" in the Init Response should indicate "reject."
+-- Note: Versions 1 and 2 are identical. Systems supporting version 2 should indicate support for version
+-- 1 as well, for interoperability with systems that indicate support for version 1 only (e.g. ISO 10163-1991
+-- implementations).  
+  }
+  Options  ::= [4] IMPLICIT BIT STRING{ 
+      search        (0), 
+      present       (1), 
+      delSet        (2),
+       resourceReport    (3),
+      triggerResourceCtrl    (4),
+      resourceCtrl       (5), 
+      accessCtrl       (6),
+      scan         (7),
+      sort        (8), 
+      -- (not used) (9),
+      extendedServices    (10),
+      level-1Segmentation    (11),
+      level-2Segmentation    (12),
+      concurrentOperations  (13),
+      namedResultSets    (14),
+      encapsulation    (15),
+      resultCount    (16),
+      negotiationModel (17),
+      duplicateDetection (18),
+      queryType104 (19),
+      pQESCorrection (20),
+      stringSchema (21)
+}
+-- end auxiliary definitions for Init PDUs
+
+
+--Search APDUs
+  SearchRequest ::= SEQUENCE{
+  referenceId          ReferenceId OPTIONAL,
+      smallSetUpperBound    [13]  IMPLICIT INTEGER,
+  largeSetLowerBound    [14]  IMPLICIT INTEGER,
+  mediumSetPresentNumber    [15]  IMPLICIT INTEGER,
+  replaceIndicator      [16]  IMPLICIT BOOLEAN,
+  resultSetName      [17]  IMPLICIT InternationalString,
+   databaseNames      [18]   IMPLICIT SEQUENCE OF DatabaseName,
+   smallSetElementSetNames    [100]  ElementSetNames OPTIONAL,
+    mediumSetElementSetNames  [101]  ElementSetNames OPTIONAL,
+  preferredRecordSyntax    [104]  IMPLICIT OBJECT IDENTIFIER OPTIONAL,
+  query          [21]  Query,
+    -- Following two parameters may be used only if version 3 is in force.
+   additionalSearchInfo    [203]  IMPLICIT OtherInformation OPTIONAL,
+  otherInfo          OtherInformation OPTIONAL}
+
+
+-- Query Definitions
+  Query  ::=  CHOICE{
+      type-0  [0]  ANY,  
+        type-1    [1]  IMPLICIT RPNQuery,
+        type-2      [2]  OCTET STRING,
+        type-100  [100]  OCTET STRING,
+        type-101  [101]  IMPLICIT RPNQuery,
+       type-102  [102]  OCTET STRING,
+       type-104  [104]  IMPLICIT EXTERNAL
+}
+--
+-- Definitions for RPN query
+     RPNQuery ::= SEQUENCE{
+      attributeSet    AttributeSetId,
+      rpn      RPNStructure}
+--
+  RPNStructure ::= CHOICE{
+    op    [0] Operand, 
+     rpnRpnOp  [1] IMPLICIT SEQUENCE{
+          rpn1    RPNStructure,
+                rpn2    RPNStructure,
+                op    Operator }} 
+  Operand ::= CHOICE{
+    attrTerm  AttributesPlusTerm, 
+    resultSet  ResultSetId, 
+          -- If version 2 is in force: 
+          --   - If query type is 1, one of the above two must be chosen; 
+          --   - resultAttr (below) may be used only if query type is 101. 
+    resultAttr  ResultSetPlusAttributes}
+
+  AttributesPlusTerm ::= [102] IMPLICIT SEQUENCE{
+         attributes  AttributeList, 
+        term    Term}
+  ResultSetPlusAttributes ::= [214] IMPLICIT SEQUENCE{
+        resultSet  ResultSetId,
+        attributes  AttributeList}
+  AttributeList ::=    [44]  IMPLICIT SEQUENCE OF AttributeElement
+--
+  Term ::= CHOICE{
+    general      [45]  IMPLICIT OCTET STRING,
+              -- values below may be used only if version 3 is in force
+    numeric      [215]  IMPLICIT INTEGER,
+    characterString    [216]  IMPLICIT InternationalString,
+    oid        [217]  IMPLICIT OBJECT IDENTIFIER,
+    dateTime      [218]  IMPLICIT GeneralizedTime,
+    external      [219]  IMPLICIT EXTERNAL,
+    integerAndUnit    [220] IMPLICIT IntUnit,
+    null        [221] IMPLICIT NULL}   
+
+  Operator ::= [46] CHOICE{
+         and    [0] IMPLICIT NULL,
+            or    [1] IMPLICIT NULL,
+                and-not  [2] IMPLICIT NULL,
+              -- If version 2 is in force: 
+              --  - For query type 1, one of the above three must be chosen;
+              --  - prox (below) may be used only if query type is 101. 
+        prox    [3] IMPLICIT ProximityOperator}
+  AttributeElement  ::=  SEQUENCE{
+    attributeSet    [1]    IMPLICIT AttributeSetId OPTIONAL,
+                -- Must be omitted if version 2 is in force.
+                -- If included, overrides value of attributeSet
+                -- in RPNQuery above, but only for this attribute.
+    attributeType  [120]  IMPLICIT INTEGER,
+    attributeValue    CHOICE{
+              numeric  [121]   IMPLICIT INTEGER,
+                  -- If version 2 is in force, 
+                  -- Must select 'numeric' for attributeValue.
+
+      complex  [224] IMPLICIT SEQUENCE{ 
+               list      [1] IMPLICIT SEQUENCE OF StringOrNumeric,
+                    semanticAction  [2] IMPLICIT SEQUENCE OF INTEGER OPTIONAL}}}
+                       
+
+  ProximityOperator ::= SEQUENCE{
+    exclusion      [1] IMPLICIT BOOLEAN OPTIONAL,
+    distance      [2] IMPLICIT INTEGER,
+    ordered      [3] IMPLICIT BOOLEAN,
+    relationType      [4] IMPLICIT INTEGER{
+              lessThan      (1),
+              lessThanOrEqual    (2),
+              equal        (3),
+              greaterThanOrEqual    (4),
+              greaterThan      (5),
+              notEqual      (6)},
+    proximityUnitCode    [5] CHOICE{
+              known  [1] IMPLICIT KnownProximityUnit,
+              private  [2] IMPLICIT INTEGER}}
+--
+    KnownProximityUnit ::= INTEGER{
+          character  (1),
+          word     (2),
+          sentence   (3),
+          paragraph   (4),
+          section   (5),
+          chapter   (6),
+          document   (7),
+          element  (8),
+          subelement  (9),
+          elementType  (10),
+           byte    (11) -- Version 3 only
+          }
+-- End definitions for RPN Query
+
+
+SearchResponse ::= SEQUENCE{
+  referenceId        ReferenceId OPTIONAL,
+  resultCount       [23]  IMPLICIT INTEGER,
+  numberOfRecordsReturned  [24]  IMPLICIT INTEGER,
+  nextResultSetPosition  [25]  IMPLICIT INTEGER,
+  searchStatus      [22]  IMPLICIT BOOLEAN,
+  resultSetStatus    [26]  IMPLICIT INTEGER{
+              subset    (1),
+                 interim  (2), 
+               none    (3)} OPTIONAL,
+  presentStatus        PresentStatus  OPTIONAL,
+    records        Records OPTIONAL,
+    -- Following two parameters may be used only if version 3 is in force.
+  additionalSearchInfo  [203]  IMPLICIT OtherInformation OPTIONAL,
+  otherInfo        OtherInformation OPTIONAL}
+--Retrieval APDUs 
+  PresentRequest ::= SEQUENCE{
+  referenceId          ReferenceId OPTIONAL,
+      resultSetId          ResultSetId,
+  resultSetStartPoint      [30]  IMPLICIT INTEGER,
+  numberOfRecordsRequested  [29]  IMPLICIT INTEGER,
+  additionalRanges      [212]  IMPLICIT SEQUENCE OF Range OPTIONAL,
+      -- additionalRanges may be included only if version 3 is in force.
+  recordComposition      CHOICE{
+                simple  [19]         ElementSetNames,
+                -- must choose 'simple' if version 2 is in force
+                complex  [209]               IMPLICIT CompSpec} OPTIONAL,
+  preferredRecordSyntax    [104]  IMPLICIT OBJECT IDENTIFIER OPTIONAL,
+  maxSegmentCount      [204]  IMPLICIT INTEGER OPTIONAL, -- level 1 or 2
+  maxRecordSize      [206]  IMPLICIT INTEGER OPTIONAL, -- level 2 only
+  maxSegmentSize      [207]  IMPLICIT INTEGER OPTIONAL, -- level 2 only
+  otherInfo          OtherInformation OPTIONAL}
+--
+  Segment ::= SEQUENCE{
+      -- Segment PDU may only be used when version 3 is in force, 
+      -- and only when segmentation is in effect.
+   referenceId          ReferenceId OPTIONAL,
+     numberOfRecordsReturned    [24]  IMPLICIT INTEGER,
+  segmentRecords      [0]  IMPLICIT SEQUENCE OF NamePlusRecord,
+  otherInfo          OtherInformation OPTIONAL}
+--
+  PresentResponse ::= SEQUENCE{
+  referenceId          ReferenceId OPTIONAL,
+  numberOfRecordsReturned    [24]  IMPLICIT INTEGER,
+   nextResultSetPosition    [25]  IMPLICIT INTEGER,
+    presentStatus          PresentStatus,
+  records          Records OPTIONAL,
+  otherInfo          OtherInformation OPTIONAL} 
+-- begin auxiliary definitions for Search and Present APDUs
+
+-- begin definition of records
+  Records ::= CHOICE{
+  responseRecords      [28]  IMPLICIT SEQUENCE OF NamePlusRecord,
+  nonSurrogateDiagnostic     [130]  IMPLICIT DefaultDiagFormat,
+  multipleNonSurDiagnostics   [205]  IMPLICIT SEQUENCE OF DiagRec} 
+--
+  NamePlusRecord  ::=  SEQUENCE{
+  name    [0] IMPLICIT DatabaseName OPTIONAL,
+  record  [1] CHOICE{
+        retrievalRecord        [1] EXTERNAL,
+        surrogateDiagnostic    [2] DiagRec, 
+          -- Must select one of the above two, retrievalRecord or
+          -- surrogateDiagnostic, unless 'level 2 segmentation' is in effect.
+        startingFragment    [3] FragmentSyntax,
+        intermediateFragment  [4] FragmentSyntax,
+        finalFragment    [5] FragmentSyntax}}
+  FragmentSyntax ::= CHOICE{
+    externallyTagged    EXTERNAL,
+    notExternallyTagged  OCTET STRING}
+
+  DiagRec ::= CHOICE{
+      defaultFormat    DefaultDiagFormat,
+                -- Must choose defaultFormat if version 2 is in effect.
+      externallyDefined    EXTERNAL}
+
+  DefaultDiagFormat::= SEQUENCE{ 
+  diagnosticSetId  OBJECT IDENTIFIER,
+  condition    INTEGER,
+  addinfo      CHOICE{
+           v2Addinfo  VisibleString,  -- version 2
+           v3Addinfo  InternationalString  -- version 3
+            }}
+  -- end definition of records
+  Range  ::= SEQUENCE{
+    startingPosition    [1] IMPLICIT INTEGER,
+    numberOfRecords    [2] IMPLICIT INTEGER} 
+--
+  ElementSetNames ::= CHOICE {
+    genericElementSetName  [0] IMPLICIT InternationalString,
+    databaseSpecific    [1] IMPLICIT SEQUENCE OF SEQUENCE{
+              dbName  DatabaseName,
+              esn    ElementSetName}}
+
+  PresentStatus   ::=    [27]  IMPLICIT INTEGER{
+                            success  (0),
+                             partial-1   (1),
+                              partial-2   (2),
+              partial-3   (3),
+                                      partial-4   (4),
+                               failure    (5)}
+
+-- begin definition of composition specification
+  CompSpec ::= SEQUENCE{
+  selectAlternativeSyntax  [1] IMPLICIT BOOLEAN,
+            -- See comment for recordSyntax, below.
+  generic             [2] IMPLICIT Specification OPTIONAL,
+  dbSpecific      [3] IMPLICIT SEQUENCE OF SEQUENCE{
+                db  [1] DatabaseName,
+                spec  [2] IMPLICIT Specification} OPTIONAL,
+    -- At least one of generic and dbSpecific must occur, and both may occur. If both, then for
+     -- any record not in the list of databases within dbSpecific, generic applies.
+   recordSyntax               [4] IMPLICIT SEQUENCE OF OBJECT IDENTIFIER OPTIONAL
+               -- For each record, the target selects the first record syntax
+               -- in this list that it can support.  If the list is exhausted, the
+               -- target may select an alternative syntax if
+               -- selectAlternativeSyntax is 'true'.
+        }
+  Specification ::= SEQUENCE{
+  schema CHOICE {
+              oid [1]   IMPLICIT OBJECT IDENTIFIER,
+              uri [300] IMPLICIT InternationalString
+  } OPTIONAL,
+  elementSpec    [2] CHOICE{
+              elementSetName   [1] IMPLICIT InternationalString,
+          externalEspec  [2] IMPLICIT EXTERNAL} OPTIONAL}
+-- end definition of composition specification
+-- end auxiliary definitions for search and response APDUs
+
+-- Delete APDUs
+  DeleteResultSetRequest ::= SEQUENCE{
+  referenceId          ReferenceId OPTIONAL,
+      deleteFunction      [32]  IMPLICIT INTEGER{
+                    list   (0),
+                    all   (1)},
+   resultSetList          SEQUENCE OF ResultSetId OPTIONAL,
+  otherInfo          OtherInformation OPTIONAL} 
+--
+  DeleteResultSetResponse ::= SEQUENCE{
+  referenceId          ReferenceId OPTIONAL,
+    deleteOperationStatus    [0]  IMPLICIT DeleteSetStatus,
+  deleteListStatuses      [1]  IMPLICIT ListStatuses OPTIONAL,
+  numberNotDeleted       [34]  IMPLICIT INTEGER OPTIONAL,
+     bulkStatuses        [35]   IMPLICIT ListStatuses OPTIONAL,
+   deleteMessage      [36]  IMPLICIT InternationalString OPTIONAL,
+  otherInfo          OtherInformation OPTIONAL}
+  ListStatuses ::= SEQUENCE OF SEQUENCE{ 
+        id  ResultSetId, 
+        status  DeleteSetStatus}
+
+  DeleteSetStatus ::= [33] IMPLICIT INTEGER{
+                  success          (0),
+                   resultSetDidNotExist      (1),
+                    previouslyDeletedByTarget      (2),
+                     systemProblemAtTarget      (3),
+                   accessNotAllowed        (4),
+      resourceControlAtOrigin      (5),
+                   resourceControlAtTarget      (6),
+                    bulkDeleteNotSupported      (7),
+                   notAllRsltSetsDeletedOnBulkDlte    (8),
+      notAllRequestedResultSetsDeleted    (9),
+      resultSetInUse        (10)}
+--
+
+--Access- and Resource-control APDUs
+--
+  AccessControlRequest ::= SEQUENCE{
+  referenceId        ReferenceId OPTIONAL,
+  securityChallenge      CHOICE{
+              simpleForm      [37] IMPLICIT OCTET STRING,
+               externallyDefined    [0]  EXTERNAL},
+  otherInfo        OtherInformation OPTIONAL}
+
+  AccessControlResponse ::= SEQUENCE{
+  referenceId        ReferenceId OPTIONAL,
+  securityChallengeResponse  CHOICE{
+              simpleForm      [38]   IMPLICIT OCTET STRING,
+               externallyDefined    [0]  EXTERNAL} OPTIONAL,
+              -- Optional only in version 3; mandatory in version 2. If
+              -- omitted (in version 3) then diagnostic must occur.
+  diagnostic    [223]    DiagRec OPTIONAL, -- Version 3 only.
+  otherInfo        OtherInformation OPTIONAL}
+
+
+
+  ResourceControlRequest ::= SEQUENCE{
+  referenceId          ReferenceId OPTIONAL,
+  suspendedFlag      [39]  IMPLICIT BOOLEAN OPTIONAL,
+  resourceReport      [40]  ResourceReport OPTIONAL,
+  partialResultsAvailable    [41]  IMPLICIT INTEGER{
+                subset    (1),
+                interim  (2),
+                none    (3)} OPTIONAL,
+  responseRequired      [42]   IMPLICIT BOOLEAN, 
+  triggeredRequestFlag    [43]   IMPLICIT BOOLEAN OPTIONAL,
+  otherInfo          OtherInformation OPTIONAL}
+
+
+  ResourceControlResponse ::= SEQUENCE{
+     referenceId          ReferenceId OPTIONAL,
+    continueFlag       [44]   IMPLICIT BOOLEAN, 
+  resultSetWanted      [45]  IMPLICIT BOOLEAN OPTIONAL,
+  otherInfo          OtherInformation OPTIONAL}
+
+
+
+  TriggerResourceControlRequest ::= SEQUENCE{
+     referenceId          ReferenceId OPTIONAL,
+  requestedAction      [46]  IMPLICIT INTEGER{
+                resourceReport  (1),
+                resourceControl  (2),
+                cancel      (3)}, 
+  prefResourceReportFormat    [47]   IMPLICIT ResourceReportId OPTIONAL,
+  resultSetWanted      [48]   IMPLICIT BOOLEAN OPTIONAL,
+  otherInfo          OtherInformation OPTIONAL}
+
+
+
+  ResourceReportRequest ::= SEQUENCE{
+     referenceId          ReferenceId OPTIONAL,
+  opId          [210]  IMPLICIT ReferenceId OPTIONAL,
+  prefResourceReportFormat    [49]   IMPLICIT ResourceReportId OPTIONAL,
+  otherInfo          OtherInformation OPTIONAL}
+--
+  ResourceReportResponse ::= SEQUENCE{
+     referenceId          ReferenceId OPTIONAL,
+  resourceReportStatus    [50]   IMPLICIT INTEGER{
+                success    (0),
+                partial    (1),
+                failure-1    (2),
+                failure-2    (3),
+                failure-3    (4),
+                failure-4    (5),
+                failure-5    (6),
+                failure-6    (7)},
+  resourceReport               [51]   ResourceReport OPTIONAL,
+  otherInfo          OtherInformation OPTIONAL}
+--
+   ResourceReport     ::=   EXTERNAL
+  ResourceReportId    ::=    OBJECT IDENTIFIER
+
+--Scan APDUs
+  ScanRequest ::= SEQUENCE{
+  referenceId              ReferenceId OPTIONAL,
+    databaseNames        [3]  IMPLICIT SEQUENCE OF DatabaseName,
+    attributeSet            AttributeSetId OPTIONAL,
+    termListAndStartPoint        AttributesPlusTerm,
+    stepSize           [5]   IMPLICIT INTEGER OPTIONAL,
+    numberOfTermsRequested         [6]   IMPLICIT INTEGER,
+    preferredPositionInResponse      [7]   IMPLICIT INTEGER OPTIONAL,
+    otherInfo            OtherInformation OPTIONAL}
+
+  ScanResponse ::= SEQUENCE{
+   referenceId              ReferenceId OPTIONAL,
+   stepSize           [3]  IMPLICIT INTEGER OPTIONAL,
+   scanStatus           [4]  IMPLICIT INTEGER {
+                                success   (0),
+                                partial-1   (1),
+                                partial-2   (2),
+                                partial-3   (3),
+                                partial-4   (4),
+                                partial-5   (5),
+                                failure  (6) },
+   numberOfEntriesReturned       [5]  IMPLICIT INTEGER,
+   positionOfTerm         [6]  IMPLICIT INTEGER OPTIONAL,
+   entries           [7]  IMPLICIT ListEntries  OPTIONAL,  
+   attributeSet          [8]  IMPLICIT AttributeSetId OPTIONAL,
+   otherInfo            OtherInformation OPTIONAL}
+
+-- begin auxiliary definitions for Scan
+  ListEntries ::= SEQUENCE{
+  entries        [1]   IMPLICIT SEQUENCE OF Entry OPTIONAL,
+    nonsurrogateDiagnostics    [2]  IMPLICIT SEQUENCE OF DiagRec OPTIONAL
+    -- At least one of entries and nonsurrogateDiagnostics must occur
+          }
+
+  Entry  ::= CHOICE {
+     termInfo               [1]   IMPLICIT TermInfo,
+     surrogateDiagnostic    [2]   DiagRec}
+--
+  TermInfo ::= SEQUENCE {
+   term                    Term,
+     displayTerm      [0]   IMPLICIT InternationalString OPTIONAL,
+                                     -- Presence of displayTerm means that term is not considered by
+              -- the target to be suitable for display, and displayTerm should
+              -- instead be displayed. 'term' is the actual term in the term list;
+               -- 'displayTerm' is for display purposes only, and is not an actual
+              -- term in the term list.
+  suggestedAttributes            AttributeList OPTIONAL,
+     alternativeTerm    [4]  IMPLICIT SEQUENCE OF AttributesPlusTerm OPTIONAL, 
+     globalOccurrences    [2]  IMPLICIT INTEGER OPTIONAL,
+     byAttributes      [3]  IMPLICIT OccurrenceByAttributes OPTIONAL,
+     otherTermInfo      OtherInformation OPTIONAL} 
+
+  OccurrenceByAttributes ::= SEQUENCE OF SEQUENCE{
+     attributes    [1]  AttributeList, 
+     occurrences       CHOICE{
+               global    [2] INTEGER,
+            byDatabase  [3] IMPLICIT SEQUENCE OF SEQUENCE{ 
+              db      DatabaseName,
+              num     [1]  IMPLICIT INTEGER OPTIONAL,
+              otherDbInfo    OtherInformation OPTIONAL}} OPTIONAL,
+     otherOccurInfo    OtherInformation OPTIONAL} 
+-- end auxiliary definitions for Scan
+
+-- Sort APDUs
+SortRequest  ::= SEQUENCE{
+  referenceId              ReferenceId OPTIONAL,
+  inputResultSetNames  [3]  IMPLICIT SEQUENCE OF InternationalString,
+  sortedResultSetName  [4]    IMPLICIT InternationalString,
+  sortSequence     [5]  IMPLICIT SEQUENCE OF SortKeySpec,
+              -- order of occurrence is from major to minor
+  otherInfo        OtherInformation OPTIONAL}
+
+SortResponse  ::= SEQUENCE{
+  referenceId          ReferenceId OPTIONAL,
+  sortStatus         [3]  IMPLICIT INTEGER{
+                            success  (0), 
+              partial-1  (1),
+              failure  (2)},
+  resultSetStatus    [4]  IMPLICIT INTEGER{
+              empty    (1), 
+                  interim  (2), 
+                  unchanged  (3),
+              none    (4)} OPTIONAL,
+  diagnostics        [5]             IMPLICIT SEQUENCE OF DiagRec OPTIONAL,
+  resultCount        [6]             IMPLICIT INTEGER OPTIONAL,
+  otherInfo        OtherInformation OPTIONAL}
+
+-- begin auxiliary definitions for Sort
+  SortKeySpec ::= SEQUENCE{
+    sortElement      SortElement, 
+       sortRelation    [1]  IMPLICIT INTEGER{
+                                ascending      (0),
+              descending      (1),
+              ascendingByFrequency    (3),
+              descendingByfrequency  (4)},
+      caseSensitivity    [2]   IMPLICIT INTEGER{
+                                 caseSensitive      (0), 
+              caseInsensitive    (1)},
+      missingValueAction    [3]   CHOICE{
+                                     abort    [1] IMPLICIT NULL,
+                                     null      [2] IMPLICIT NULL,
+                    --supply a null value for missing value
+          missingValueData  [3] IMPLICIT OCTET STRING} OPTIONAL}
+
+  SortElement ::=   CHOICE{
+    generic        [1] SortKey,
+       datbaseSpecific    [2] IMPLICIT SEQUENCE OF SEQUENCE{
+                       databaseName  DatabaseName,
+                       dbSort    SortKey}} 
+
+  SortKey ::= CHOICE{
+    sortfield       [0]  IMPLICIT InternationalString,
+                  -- An element, element-group-tag, or alias supported by the target
+               -- and denoting a set of elements associated with each record.
+     elementSpec    [1]  IMPLICIT Specification,
+        sortAttributes    [2]  IMPLICIT SEQUENCE{
+              id  AttributeSetId,
+              list  AttributeList}}
+-- end auxiliary definitions for sort
+
+
+
+-- Extended Service APDUs
+  ExtendedServicesRequest  ::= SEQUENCE{
+  referenceId              ReferenceId OPTIONAL,
+  function      [3]  IMPLICIT INTEGER {
+              create    (1),
+              delete    (2),
+              modify  (3)},
+  packageType      [4]  IMPLICIT OBJECT IDENTIFIER,
+  packageName    [5]  IMPLICIT InternationalString OPTIONAL,
+              -- PackageName mandatory for 'modify' or 'delete'; optional for
+              -- 'create'. Following four parameters mandatory for 'create'; should
+              -- be included on 'modify' if being modified; not needed on 'delete'.
+  userId        [6]   IMPLICIT InternationalString OPTIONAL,
+  retentionTime    [7]   IMPLICIT IntUnit OPTIONAL,
+  permissions      [8]   IMPLICIT Permissions OPTIONAL,
+  description      [9]   IMPLICIT InternationalString OPTIONAL,
+
+-- (ExtendedServiceRequest APDU continued)
+  taskSpecificParameters  [10]  IMPLICIT EXTERNAL OPTIONAL, 
+              -- Mandatory for 'create'; included on 'modify' if specific
+              -- parameters being modified; not necessary on 'delete'. For the
+              -- 'EXTERNAL,' use OID of specific ES definition and select
+              --  CHOICE [1]: 'esRequest'.
+  waitAction      [11]  IMPLICIT INTEGER{
+              wait      (1),
+              waitIfPossible  (2),
+              dontWait    (3),
+              dontReturnPackage  (4)},
+  elements          ElementSetName OPTIONAL,
+  otherInfo          OtherInformation OPTIONAL}
+--
+
+ExtendedServicesResponse ::= SEQUENCE{
+  referenceId                ReferenceId OPTIONAL,
+  operationStatus    [3]    IMPLICIT INTEGER{
+                done      (1),
+                accepted    (2),  
+                failure    (3)},
+  diagnostics      [4]    IMPLICIT SEQUENCE OF DiagRec OPTIONAL,
+  taskPackage      [5]    IMPLICIT EXTERNAL OPTIONAL,
+                -- Use OID: {Z39-50-recordSyntax (106)} and corresponding
+                -- syntax. For the EXTERNAL, 'taskSpecific,' within that
+                -- definition, use OID of the specific es, and choose [2],
+                -- 'taskPackage'.
+  otherInfo          OtherInformation OPTIONAL}
+
+ Permissions ::= SEQUENCE OF SEQUENCE{
+  userId      [1] IMPLICIT InternationalString,
+  allowableFunctions  [2] IMPLICIT SEQUENCE OF INTEGER{
+              delete      (1),
+              modifyContents  (2),
+              modifyPermissions  (3),
+              present    (4),
+                 invoke    (5)}} 
+
+Close ::= SEQUENCE{
+  referenceId          ReferenceId OPTIONAL,  -- See 3.2.11.1.5.
+  closeReason          CloseReason,
+  diagnosticInformation    [3]  IMPLICIT InternationalString OPTIONAL,
+  resourceReportFormat    [4]  IMPLICIT ResourceReportId OPTIONAL, 
+                -- For use by origin only, and only on Close request;
+                -- origin requests target to include report in response.
+   resourceReport      [5]  ResourceReport OPTIONAL,
+                -- For use by target only, unilaterally on Close request;
+                -- on Close response may be unilateral or in response
+                -- to origin request.
+  otherInfo          OtherInformation OPTIONAL}
+
+  CloseReason ::=  [211]  IMPLICIT INTEGER{
+            finished      (0),
+            shutdown      (1),
+            systemProblem    (2),
+            costLimit      (3),
+            resources      (4),
+            securityViolation    (5),
+            protocolError    (6),
+            lackOfActivity    (7),
+            peerAbort      (8),
+            unspecified      (9)}
+
+--Duplicate detection APDUs
+DuplicateDetectionRequest ::= SEQUENCE {
+  referenceId                      ReferenceId  OPTIONAL,
+  inputResultSetIds            [3] IMPLICIT SEQUENCE OF InternationalString,
+  outputResultSetName          [4] IMPLICIT InternationalString,
+  applicablePortionOfRecord    [5] IMPLICIT EXTERNAL OPTIONAL,
+  duplicateDetectionCriteria   [6] IMPLICIT SEQUENCE OF
+                                   DuplicateDetectionCriterion OPTIONAL,
+  clustering                   [7] IMPLICIT BOOLEAN OPTIONAL,
+                                        -- 'true' means "clustered".
+                                        -- This parameter may be omitted
+                                        -- only if retentionCriteria CHOICE is
+                                        -- 'numberOfEntries' and its value is 1.
+  retentionCriteria            [8] IMPLICIT SEQUENCE OF
+                                            RetentionCriterion,
+  sortCriteria                 [9] IMPLICIT SEQUENCE OF
+                                            SortCriterion OPTIONAL,
+  otherInfo                        OtherInformation OPTIONAL}
+
+DuplicateDetectionCriterion ::= CHOICE{
+                           levelOfMatch         [1] IMPLICIT INTEGER,
+                                -- a percentage; 1-100.
+                           caseSensitive        [2] IMPLICIT NULL,
+                           punctuationSensitive [3] IMPLICIT NULL,
+                           regularExpression    [4] IMPLICIT EXTERNAL,
+                           rsDuplicates         [5] IMPLICIT NULL
+                 -- values 6-100 reserved for future assignment.
+                                                       }
+
+RetentionCriterion ::= CHOICE{
+                          numberOfEntries       [1] IMPLICIT INTEGER, 
+                                                        --  greater than 0
+                          percentOfEntries      [2] IMPLICIT INTEGER,
+                                                        -- 1-100,
+                          duplicatesOnly        [3] IMPLICIT NULL,
+                                                 -- should not be chosen 
+                                                 -- if clustering is 'true'
+                          discardRsDuplicates   [4] IMPLICIT NULL
+                 -- values 5-100 reserved for future assignment.
+                                                       }
+
+SortCriterion ::= CHOICE{
+                         mostComprehensive      [1] IMPLICIT NULL,
+                         leastConmprehensive    [2] IMPLICIT NULL,
+                         mostRecent             [3] IMPLICIT NULL,
+                         oldest                 [4] IMPLICIT NULL,
+                         leastCost              [5] IMPLICIT NULL,
+                         preferredDatabases     [6] IMPLICIT
+                                     SEQUENCE OF InternationalString
+                 -- values 7-100 reserved for future assignment.
+}
+
+DuplicateDetectionResponse ::= SEQUENCE {
+  referenceId                          ReferenceId  OPTIONAL,
+  status                       [3]     IMPLICIT INTEGER{
+                                         success               (0),
+                                         failure               (1)},
+  resultSetCount               [4]     IMPLICIT INTEGER OPTIONAL,
+  diagnostics                  [5]     IMPLICIT SEQUENCE OF DiagRec OPTIONAL,
+  otherInfo                           OtherInformation OPTIONAL}
+
+-- Global auxiliary definitions
+  ReferenceId       ::=      [2]  IMPLICIT OCTET STRING
+  ResultSetId        ::=      [31]    IMPLICIT InternationalString
+  ElementSetName     ::=     [103]   IMPLICIT InternationalString
+  DatabaseName     ::=    [105]   IMPLICIT InternationalString
+  AttributeSetId     ::=       OBJECT IDENTIFIER
+
+
+-- OtherInformation
+  OtherInformation   ::= [201] IMPLICIT SEQUENCE OF SEQUENCE{
+    category            [1]   IMPLICIT InfoCategory OPTIONAL, 
+    information        CHOICE{
+      characterInfo        [2]  IMPLICIT InternationalString,
+      binaryInfo        [3]  IMPLICIT OCTET STRING,
+      externallyDefinedInfo    [4]  IMPLICIT EXTERNAL,
+      oid          [5]  IMPLICIT OBJECT IDENTIFIER}}
+--
+  InfoCategory ::= SEQUENCE{
+      categoryTypeId  [1]   IMPLICIT OBJECT IDENTIFIER OPTIONAL,
+      categoryValue  [2]   IMPLICIT INTEGER}
+
+
+-- Units
+  -- IntUnit is used when value and unit are supplied together. Unit, alone, is used when just
+  -- specifying a unit (without a value).  For example, IntUnit is used in Term, in an RPNQuery, or
+  -- it can be the datatype of an element within a retrieval record. Unit (alone) would be used in an
+  -- element request, when requesting data be returned according to a particular unit.
+
+  IntUnit ::= SEQUENCE{
+    value    [1] IMPLICIT INTEGER,
+    unitUsed  [2] IMPLICIT Unit}
+--
+  Unit ::= SEQUENCE{
+    unitSystem    [1] InternationalString OPTIONAL,    -- e.g. 'SI'
+    unitType    [2] StringOrNumeric OPTIONAL,    -- e.g. 'mass'
+    unit      [3] StringOrNumeric OPTIONAL,    -- e.g. 'kilograms'
+    scaleFactor    [4] IMPLICIT INTEGER OPTIONAL    -- e.g. 9 means 10**9
+        }
+
+--CharacterString
+  InternationalString ::= GeneralString
+    -- When version 2 is in force, this collapses to VisibleString. That is, only characters in the
+    -- visibleString repertoire may be used. (Datatype compatibility with version 2 is not affected,
+     -- because references are IMPLICIT.)  When version 3 is in force, the semantics of the
+    -- GeneralString content may be altered by negotiation during initialization. If no such
+    -- negotiation is in effect, then GeneralString semantics are in force.
+
+StringOrNumeric ::= CHOICE{
+  string    [1] IMPLICIT InternationalString,
+  numeric  [2] IMPLICIT INTEGER}
+
+END -- IR DEFINITIONS
+
+
+
+DiagnosticFormatDiag1 
+{Z39-50-diagnosticFormat diag-1 (2)} DEFINITIONS ::=
+BEGIN
+IMPORTS Term, Specification, AttributeList, SortElement, DatabaseName, 
+DefaultDiagFormat, InternationalString FROM Z39-50-APDU-1995;
+
+
+DiagnosticFormat ::=  SEQUENCE OF SEQUENCE{ 
+  diagnostic  [1] CHOICE{
+              defaultDiagRec    [1]  IMPLICIT DefaultDiagFormat,
+              explicitDiagnostic    [2]  DiagFormat} OPTIONAL, 
+  message  [2] IMPLICIT InternationalString OPTIONAL} 
+
+
+DiagFormat ::= CHOICE{
+
+tooMany  [1000]   IMPLICIT SEQUENCE{
+                tooManyWhat   [1]  IMPLICIT INTEGER{
+                                  argumentWords        (1), 
+                                  truncatedWords        (2), 
+                                  booleanOperators      (3),
+                                  incompleteSubfields    (4), 
+                                  characters          (5),
+                                  recordsRetrieved      (6), 
+                                  dataBasesSpecified      (7),
+                                  resultSetsCreated      (8), 
+                                  indexTermsProcessed    (9)},
+                max        [2]  IMPLICIT INTEGER OPTIONAL},
+
+
+
+
+
+
+
+badSpec    [1001]  IMPLICIT SEQUENCE{  -- element set name or specification
+                spec        [1] IMPLICIT Specification, -- esn or element spec not supported
+                db        [2] IMPLICIT DatabaseName OPTIONAL,
+                            -- if db specified, above spec not supported for db; otherwise,
+                            -- spec not supported period.
+                goodOnes    [3] IMPLICIT SEQUENCE OF Specification OPTIONAL  
+                            -- target supplies ones that are supported
+                            },
+
+
+dbUnavail  [1002]  IMPLICIT SEQUENCE{ -- database unavailable
+                db  [1] IMPLICIT DatabaseName,
+                why  [2] IMPLICIT SEQUENCE{
+                        reasonCode  [1] IMPLICIT INTEGER{
+                                      doesNotExist    (0),
+                                      existsButUnavail  (1),
+                                      locked      (2),
+                                      accessDenied    (3)} OPTIONAL,
+                        message    [2] IMPLICIT InternationalString OPTIONAL}},
+
+
+unSupOp  [1003]  IMPLICIT INTEGER{  -- unsupported operator
+                and     (0),
+                or      (1),
+                and-not  (2),
+                prox    (3)},
+
+
+attribute    [1004]  IMPLICIT SEQUENCE{
+                    -- Applies for unsupported attribute set, attribute type, 
+                    -- attribute value, or term (for a given attribute type or value).
+
+                id      [1]  IMPLICIT OBJECT IDENTIFIER,
+                   -- if only "id" occurs, then attribute set is not supported
+                type    [2]  IMPLICIT INTEGER OPTIONAL,
+                   -- must occur if value occurs.
+                value    [3]   IMPLICIT INTEGER OPTIONAL,
+                    -- if omitted, and Type occurs, then Type is what is unsupported
+                term    [4]  Term OPTIONAL
+                    -- If occurs, term is illegal or not supported, for attribute value,
+                    -- if value occurs; otherwise, for type.
+                                },
+
+
+attCombo  [1005]  IMPLICIT SEQUENCE{ -- attribute combination not supported
+              unsupportedCombination  [1] IMPLICIT AttributeList, 
+              recommendedAlternatives  [2] IMPLICIT SEQUENCE OF AttributeList OPTIONAL}, 
+
+
+
+
+term      [1006]  IMPLICIT SEQUENCE{
+                problem    [1] IMPLICIT INTEGER{
+                            codedValue  (1),
+                            unparsable  (2),
+                            tooShort    (3),
+                            type      (4)} OPTIONAL,
+                term      [2] Term},
+
+
+proximity  [1007] CHOICE{        -- proximity diagnostics:
+               resultSets  [1]    IMPLICIT NULL,         -- proximity between sets not supported
+              badSet    [2]    IMPLICIT InternationalString,  -- bad result set specified
+                 relation    [3]   IMPLICIT INTEGER,      -- 1 to 6 ; relation not supported
+              unit      [4]  IMPLICIT INTEGER,      -- unsupported unit code
+              distance    [5]  IMPLICIT INTEGER,      -- unsupported distance
+              attributes  [6]  AttributeList,             --  proximity not supported with specified
+                                                   -- attribute combination
+              ordered    [7]  IMPLICIT NULL,        -- ordered flag not supported
+              exclusion  [8]  IMPLICIT NULL          -- exclusion flag not supported
+                    },
+
+
+
+
+
+scan     [1008] CHOICE{      -- scan diagnostics:
+              nonZeroStepSize  [0] IMPLICIT NULL,  -- only zero step size supported
+              specifiedStepSize  [1] IMPLICIT NULL,  -- specified step size not supported
+              termList1      [3] IMPLICIT NULL,  -- term list not supported (no alternative supplied)
+              termList2      [4] IMPLICIT SEQUENCE OF AttributeList,
+                                          -- term list not supported (alternatives supplied)
+              posInResponse    [5] IMPLICIT INTEGER{  --value of positionInResponse not supported
+                              mustBeOne        (1),
+                              mustBePositive    (2),
+                              mustBeNonNegative  (3),
+                              other            (4)},
+              resources      [6] IMPLICIT NULL,   -- resources exhausted looking for satisfying terms
+              endOfList      [7] IMPLICIT NULL  -- beginning or end of term list
+                },
+
+
+sort       [1009] CHOICE{
+              sequence    [0]  IMPLICIT NULL,        -- cannot sort according to sequence
+              noRsName    [1]  IMPLICIT NULL,        -- no result set name supplied
+              tooMany    [2]  IMPLICIT INTEGER,      --  Too many input result sets,
+                                                --  maximum supplied.
+              incompatible  [3]  IMPLICIT NULL,        -- records with different formats
+                                                 -- not compatible for sorting
+              generic      [4]  IMPLICIT NULL,        -- generic sort not supported 
+                                                -- (db specific only)
+              dbSpecific    [5]  IMPLICIT NULL,        -- db specific sort not supported
+              sortElement    [6]  SortElement,
+              key        [7]  IMPLICIT INTEGER{
+                              tooMany  (1),    -- too many sort keys
+                              duplicate  (2)},    -- duplicate sort keys
+              action      [8]  IMPLICIT NULL,  -- unsupported missing data action
+              illegal      [9]  IMPLICIT INTEGER{
+                              relation  (1),  -- illegal sort relation
+                              case    (2),  -- illegal case value
+                              action  (3),   -- illegal missing data action
+                              sort    (4)},  -- illegal sort
+            inputTooLarge    [10]  IMPLICIT SEQUENCE OF InternationalString,
+                                      --   one or more of the input result sets too large to sort
+          aggregateTooLarge  [11]  IMPLICIT NULL  --  aggregate result set too large
+                          },
+
+segmentation  [1010]  CHOICE{
+                segmentCount  [0]    IMPLICIT NULL,
+                                  -- Cannot guarantee record will fit within max segments. Target
+                                  -- suggests that origin try again to retrieve record, without
+                                  -- including max-segment-count.
+                segmentSize  [1]    IMPLICIT INTEGER
+                                -- record cannot be segmented into fragments such that the largest
+                                -- will fit within max segment size specified. Target supplies (in
+                                -- bytes) the smallest acceptable value of Max-segment-size to
+                                -- retrieve the record.
+                          },
+
+
+extServices  [1011] CHOICE{
+                req        [1] IMPLICIT INTEGER{   -- bad request
+                            nameInUse    (1),  -- package name already in use
+                            noSuchName  (2),  -- no such package, on modify/delete
+                            quota        (3),  -- quota exceeded
+                            type        (4)},  -- extended service type not supported
+                permission  [2] IMPLICIT INTEGER{ -- permission denied on ES, because: 
+                            id         (1),    --   id not authorized, or
+                            modifyDelete  (2)},    -- cannot modify or delete
+                immediate  [3] IMPLICIT INTEGER{ -- immediate execution:
+                            failed      (1),    -- failed, 
+                            service      (2),    -- not supported for this service, or
+                            parameters    (3)    -- for these parameters.
+                                }},
+
+
+accessCtrl    [1012] CHOICE{
+                noUser    [1] IMPLICIT NULL,    -- no user to display challenge to
+                refused    [2] IMPLICIT NULL,    -- access control information refused by user
+                simple    [3] IMPLICIT NULL,    -- only simple form supported (target used
+                                          -- externally defined)
+                oid      [4] IMPLICIT SEQUENCE OF OBJECT IDENTIFIER,
+                                          -- oid not supported (origin supplies alternative
+                                          -- suggested oids)
+                alternative  [5] IMPLICIT SEQUENCE OF OBJECT IDENTIFIER,
+                                          -- origin insists that target use an alternative
+                                          -- challenge for this data (e.g. stronger                                     
+   
+                                          -- authentication or stronger Access control). The                            
+              -- origin supplies suggested alternative oids.
+                pwdInv    [6] IMPLICIT NULL,    -- password invalid
+                pwdExp    [7] IMPLICIT NULL      -- password expired
+                    },
+
+
+recordSyntax  [1013] IMPLICIT SEQUENCE{ -- record cannot be transferred in requested syntax
+              unsupportedSyntax    [1] IMPLICIT OBJECT IDENTIFIER, 
+              suggestedAlternatives  [2] IMPLICIT SEQUENCE OF OBJECT IDENTIFIER OPTIONAL}
+}
+
+END
+
+
+
+
+
+RecordSyntax-explain 
+{Z39-50-recordSyntax explain (100)} DEFINITIONS ::=
+
+BEGIN 
+IMPORTS AttributeSetId, Term, OtherInformation, DatabaseName, ElementSetName, IntUnit, Unit,
+ StringOrNumeric, Specification, InternationalString, AttributeList, AttributeElement FROM Z39-50-APDU-1995;
+EXPORTS LanguageCode;
+
+Explain-Record ::= CHOICE{
+  -- Each of these may be used as search term  when Use attribute is 'explain-category'.
+  targetInfo         [0]    IMPLICIT TargetInfo,
+  databaseInfo      [1]    IMPLICIT DatabaseInfo,
+  schemaInfo        [2]    IMPLICIT SchemaInfo,
+  tagSetInfo         [3]    IMPLICIT TagSetInfo,
+  recordSyntaxInfo    [4]    IMPLICIT RecordSyntaxInfo,
+  attributeSetInfo    [5]    IMPLICIT AttributeSetInfo,
+  termListInfo      [6]    IMPLICIT TermListInfo,
+  extendedServicesInfo  [7]    IMPLICIT ExtendedServicesInfo,
+  attributeDetails      [8]    IMPLICIT AttributeDetails,
+  termListDetails    [9]    IMPLICIT TermListDetails,
+  elementSetDetails    [10]  IMPLICIT ElementSetDetails,
+  retrievalRecordDetails  [11]   IMPLICIT RetrievalRecordDetails,
+  sortDetails             [12]   IMPLICIT SortDetails,
+  processing           [13]  IMPLICIT ProcessingInformation,
+  variants          [14]  IMPLICIT VariantSetInfo,
+  units          [15]    IMPLICIT UnitInfo,
+  categoryList            [100]  IMPLICIT CategoryList}
+
+-- Element set name 'B' (brief)  retrieves:
+--  -  'commonInfo' (except for otherInfo within commonInfo)
+--  -  key elements
+--  -  other elements designated as 'non-key brief elements'
+-- Esn 'description' retrieves brief elements as well as 'description', and specific additional descriptive
+-- elements if designated.  
+-- Element set name 'F' (full) retrieves all of the above, as well as those designated as "non-brief elements". Some
+-- elements designated as OPTIONAL may be mandatory in full records, and are so identified. (Note that all elements
+-- that are not part of the brief element set must be designated as OPTIONAL in the ASN.1, otherwise it would be
+-- illegal to omit them.)
+-- Other esns are defined (below) as needed.
+
+-- - - - - - - - - - - - -   Info Records
+  -- Info records are mainly for software consumption
+  -- They describe individual entities within the target system:
+  --   The target itself
+  --   Individual databases
+  --   Schemas
+  --   Tag sets
+  --   Record syntaxes
+  --   Attribute sets
+  --   Term lists
+  --   Extended services
+ --     The information about each Schema, Tag Set, Record Syntax and Attribute Set should
+  -- match the universal definitions of these items. The only exception is that a target may omit any
+  -- items it doesn't support, for example the description of the bib-1 attribute set may omit attributes
+  -- that the target does not support under any circumstances.
+  --      Databases that may be searched together can be listed in the dbCominations element of the TargetInfo record.  
+TargetInfo ::= SEQUENCE {
+  commonInfo      [0]    IMPLICIT CommonInfo OPTIONAL,
+    -- Key elements follow:
+  name          [1]    IMPLICIT InternationalString,
+    -- Non-key brief elements follow:
+  recent-news      [2]    IMPLICIT HumanString OPTIONAL,
+  icon          [3]    IMPLICIT IconObject OPTIONAL,
+  namedResultSets    [4]    IMPLICIT BOOLEAN,
+  multipleDBsearch    [5]    IMPLICIT BOOLEAN,
+  maxResultSets      [6]    IMPLICIT INTEGER OPTIONAL,
+  maxResultSize      [7]    IMPLICIT INTEGER OPTIONAL,
+  maxTerms        [8]    IMPLICIT INTEGER OPTIONAL,
+  timeoutInterval      [9]    IMPLICIT IntUnit OPTIONAL,
+  welcomeMessage    [10]  IMPLICIT HumanString OPTIONAL,
+    -- non-brief elements follow:
+  -- 'description' esn retrieves the following two (as well as brief):
+  contactInfo      [11]  IMPLICIT ContactInfo OPTIONAL,
+  description      [12]  IMPLICIT HumanString OPTIONAL,
+  nicknames        [13]  IMPLICIT SEQUENCE OF InternationalString OPTIONAL,
+  usage-restrictions    [14]  IMPLICIT HumanString OPTIONAL,
+  paymentAddr      [15]  IMPLICIT HumanString OPTIONAL,
+  hours          [16]  IMPLICIT HumanString OPTIONAL,
+  dbCombinations    [17]  IMPLICIT SEQUENCE OF DatabaseList OPTIONAL,
+  addresses        [18]  IMPLICIT SEQUENCE OF NetworkAddress OPTIONAL,
+  languages        [101]  IMPLICIT SEQUENCE OF InternationalString OPTIONAL,
+                  -- Languages supported for message strings.  Each is a three-character
+                  -- language code from Z39.53-1994.
+-- characterSets      [102]  this tag reserved for "character sets supported for name and message strings".
+  -- commonAccessInfo elements list objects the target supports. All objects listed in
+  -- AccessInfo for any individual database should also be listed here.
+  commonAccessInfo  [19]  IMPLICIT AccessInfo OPTIONAL}
+
+
+DatabaseInfo ::= SEQUENCE {
+      -- A target may provide "virtual databases" that are combinations of individual database. These
+      -- databases are indicated by the presence of subDbs in the combination database's DatabaseDescription.
+  commonInfo        [0]    IMPLICIT CommonInfo OPTIONAL,
+    -- Key elements follow:
+  name            [1]    IMPLICIT DatabaseName,
+    -- Non-key brief elements follow:
+  explainDatabase      [2]             IMPLICIT NULL OPTIONAL,
+                       -- If present, this database is the Explain database, or an Explain database
+                    -- for a different server, possibly on a different host. The means by which
+                    -- that server may be accessed is not addressed by this standard. One
+                    -- suggested possibility is an implementor agreement whereby the
+                    -- database name is a url which may be used to connect to the server.
+  nicknames          [3]    IMPLICIT SEQUENCE OF DatabaseName OPTIONAL,
+  icon            [4]    IMPLICIT IconObject OPTIONAL,
+  user-fee          [5]    IMPLICIT BOOLEAN,
+  available          [6]    IMPLICIT BOOLEAN,
+  titleString          [7]    IMPLICIT HumanString OPTIONAL,
+    -- Non-brief elements follow:
+  keywords          [8]    IMPLICIT SEQUENCE OF HumanString OPTIONAL,
+  description        [9]    IMPLICIT HumanString OPTIONAL,
+  associatedDbs        [10]  IMPLICIT DatabaseList OPTIONAL,
+                    -- databases that may be searched in combination with this one 
+
+  subDbs          [11]  IMPLICIT DatabaseList OPTIONAL,
+                        -- When present, this database is a composite representing the combined
+                     -- databases 'subDbs'. The individual subDbs are also available.
+  disclaimers        [12]  IMPLICIT HumanString OPTIONAL,
+  news            [13]  IMPLICIT HumanString OPTIONAL,
+  recordCount           [14]    CHOICE {
+                                   actualNumber  [0] IMPLICIT INTEGER,
+                                    approxNumber  [1] IMPLICIT INTEGER} OPTIONAL,
+  defaultOrder        [15]  IMPLICIT HumanString OPTIONAL,
+  avRecordSize        [16]  IMPLICIT INTEGER OPTIONAL,
+  maxRecordSize      [17]  IMPLICIT INTEGER OPTIONAL,
+  hours            [18]  IMPLICIT HumanString OPTIONAL,
+  bestTime          [19]  IMPLICIT HumanString OPTIONAL,
+  lastUpdate          [20]  IMPLICIT GeneralizedTime OPTIONAL,
+  updateInterval        [21]  IMPLICIT IntUnit OPTIONAL,
+  coverage          [22]  IMPLICIT HumanString OPTIONAL,
+  proprietary        [23]  IMPLICIT BOOLEAN OPTIONAL, -- mandatory in full record
+  copyrightText        [24]  IMPLICIT HumanString OPTIONAL,
+  copyrightNotice      [25]  IMPLICIT HumanString OPTIONAL,
+  producerContactInfo    [26]  IMPLICIT ContactInfo OPTIONAL,
+  supplierContactInfo      [27]  IMPLICIT ContactInfo OPTIONAL,
+  submissionContactInfo    [28]  IMPLICIT ContactInfo OPTIONAL,
+    -- accessInfo lists items connected with the database. All listed items should be in the target's AccessInfo.
+  accessInfo                [29]  IMPLICIT AccessInfo OPTIONAL}
+
+
+SchemaInfo ::= SEQUENCE {
+  commonInfo    [0]  IMPLICIT CommonInfo OPTIONAL,
+    -- Key elements follow:
+  schema      [1]  IMPLICIT OBJECT IDENTIFIER,
+    -- Non-key brief elements follow:
+  name        [2]  IMPLICIT InternationalString,
+    -- Non-brief elements follow:
+  description    [3]  IMPLICIT HumanString OPTIONAL,
+  tagTypeMapping  [4]  IMPLICIT SEQUENCE OF SEQUENCE {
+              tagType    [0] IMPLICIT INTEGER,
+              tagSet       [1] IMPLICIT OBJECT IDENTIFIER OPTIONAL,
+                -- If tagSet is omitted, then this tagType is for a tagSet locally defined
+                -- within the schema that cannot be referenced by another schema.
+              defaultTagType  [2] IMPLICIT NULL OPTIONAL
+                        } OPTIONAL,
+  recordStructure  [5]  IMPLICIT SEQUENCE OF ElementInfo OPTIONAL}
+
+
+  --  ElementInfo referenced in SchemaInfo and RecordSyntaxInfo
+    ElementInfo ::= SEQUENCE {
+      elementName  [1] IMPLICIT InternationalString,
+      elementTagPath  [2] IMPLICIT Path,
+      dataType      [3] ElementDataType OPTIONAL, -- If omitted, not specified. 
+       required         [4] IMPLICIT BOOLEAN,
+      repeatable     [5] IMPLICIT BOOLEAN,
+       description    [6] IMPLICIT HumanString OPTIONAL}
+
+
+  -- Path is referenced by ElementInfo as well as PerElementDetails
+             Path ::= SEQUENCE OF SEQUENCE{
+              tagType  [1] IMPLICIT INTEGER,
+              tagValue     [2] StringOrNumeric}
+      ElementDataType ::= CHOICE{
+            primitive  [0] IMPLICIT PrimitiveDataType,
+           structured  [1] IMPLICIT SEQUENCE OF ElementInfo}
+      PrimitiveDataType ::= INTEGER{
+            octetString        (0),
+            numeric           (1),
+            date            (2),
+            external        (3),
+            string          (4),
+            trueOrFalse       (5),
+            oid         (6),
+            intUnit        (7),
+        empty        (8),
+            noneOfTheAbove  (100) -- see 'description'
+            }
+
+
+TagSetInfo ::= SEQUENCE {
+  commonInfo  [0]  IMPLICIT CommonInfo OPTIONAL,
+    -- Key elements follow:
+  tagSet      [1]  IMPLICIT OBJECT IDENTIFIER,
+    -- non-key brief elements follow:
+  name      [2]  IMPLICIT InternationalString,
+    -- non-brief elements follow:
+  description  [3]  IMPLICIT HumanString OPTIONAL,
+  elements    [4]  IMPLICIT SEQUENCE OF SEQUENCE {
+              elementname  [1]  IMPLICIT InternationalString,
+               nicknames    [2]  IMPLICIT SEQUENCE OF InternationalString OPTIONAL,
+              elementTag     [3]  StringOrNumeric, 
+              description    [4]  IMPLICIT HumanString OPTIONAL, 
+            dataType       [5]  PrimitiveDataType OPTIONAL,
+              -- If the data type is expected to be structured, that is described in the schema info,
+              -- and datatype is omitted here.
+             otherTagInfo       OtherInformation OPTIONAL} OPTIONAL}
+
+RecordSyntaxInfo ::= SEQUENCE {
+  commonInfo    [0]  IMPLICIT CommonInfo OPTIONAL,
+    -- Key elements follow:
+  recordSyntax    [1]  IMPLICIT OBJECT IDENTIFIER,
+    -- Non-key brief elements follow:
+  name        [2]  IMPLICIT InternationalString,
+    -- non-brief elements follow:
+  transferSyntaxes  [3]  IMPLICIT SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,
+  description    [4]  IMPLICIT HumanString OPTIONAL,
+  asn1Module    [5]  IMPLICIT InternationalString OPTIONAL,
+  abstractStructure  [6]  IMPLICIT SEQUENCE OF ElementInfo OPTIONAL
+               -- Omitting abstractStructure only means target isn't using
+                 -- Explain to describe the structure, not that there is no structure.
+              }
+
+AttributeSetInfo ::= SEQUENCE {
+  commonInfo  [0]  IMPLICIT CommonInfo OPTIONAL,
+    -- Key elements follow:
+  attributeSet  [1]  IMPLICIT AttributeSetId,
+    -- non-key brief elements follow:
+  name      [2]  IMPLICIT InternationalString,
+    -- non-brief elements follow:
+  attributes    [3]  IMPLICIT SEQUENCE OF AttributeType OPTIONAL,
+            -- mandatory in full record
+  description   [4] IMPLICIT HumanString OPTIONAL}
+-- AttributeType referenced in AttributeSetInfo
+  AttributeType ::= SEQUENCE {
+      name             [0] IMPLICIT InternationalString OPTIONAL,
+      description      [1] IMPLICIT HumanString OPTIONAL,
+       attributeType    [2] IMPLICIT INTEGER,
+      attributeValues  [3] IMPLICIT SEQUENCE OF AttributeDescription}
+    AttributeDescription ::= SEQUENCE {
+        name                 [0] IMPLICIT InternationalString OPTIONAL,
+        description          [1] IMPLICIT HumanString OPTIONAL,
+        attributeValue       [2] StringOrNumeric,
+        equivalentAttributes  [3]  IMPLICIT SEQUENCE OF StringOrNumeric OPTIONAL
+                  -- each is an occurrence of 'attributeValue' from AttributeDescription for a
+                  -- different attribute. Equivalences listed here should be derived from the 
+                  -- attribute set definition, not from a particular server's behavior.  
+                    }
+
+
+TermListInfo ::= SEQUENCE{
+  commonInfo    [0]  IMPLICIT CommonInfo OPTIONAL,
+    -- Key elements follow:
+  databaseName  [1]  IMPLICIT DatabaseName,
+    -- Non-key brief elements follow:
+  termLists      [2] IMPLICIT SEQUENCE OF SEQUENCE{
+            name    [1] IMPLICIT InternationalString,
+            title    [2] IMPLICIT HumanString OPTIONAL,
+                                            -- Title is for users to see and can differ by language. Name, on the
+                      -- other hand is typically a short string not necessarily meant to be
+                       -- human-readable, and not variable by language.
+            searchCost   [3]   IMPLICIT INTEGER {
+                  optimized  (0),    -- The attribute (or combination) associated
+                            -- with this   list will do fast searches. 
+                      normal      (1),    -- The attribute (combination) will work as
+                            -- expected. So there's probably an index for the
+                            -- attribute (combination) or some similar
+                             -- mechanism.
+                      expensive   (2),    -- Can use the attribute (combination), but it
+                            -- might not provide satisfactory results.
+                            -- Probably there is no index, or post-
+                            -- processing of records is required.
+                      filter      (3)    -- can't search with this attribute (combination) alone.
+                         } OPTIONAL,
+              scanable  [4]  IMPLICIT BOOLEAN, -- 'true' means this list can be scanned.
+               broader    [5] IMPLICIT SEQUENCE OF InternationalString OPTIONAL,
+               narrower  [6] IMPLICIT SEQUENCE OF InternationalString OPTIONAL
+                       -- broader and narrower list alternative term lists related to this one.
+                       -- The term lists so listed should also be in this termLists structure.
+                          }
+  -- no non-brief elements
+            }
+
+
+ExtendedServicesInfo ::= SEQUENCE {
+  commonInfo          [0]  IMPLICIT CommonInfo OPTIONAL,
+    -- Key elements follow:
+  type          [1]  IMPLICIT OBJECT IDENTIFIER,
+    -- Non-key brief elements follow:
+  name                [2]  IMPLICIT InternationalString OPTIONAL,
+                -- should be supplied if privateType is 'true'
+  privateType      [3]  IMPLICIT BOOLEAN,
+  restrictionsApply    [5]  IMPLICIT BOOLEAN,  -- if 'true' see 'description'
+  feeApply              [6]  IMPLICIT BOOLEAN,  -- if 'true' see 'description'
+  available             [7]  IMPLICIT BOOLEAN,
+  retentionSupported    [8]  IMPLICIT BOOLEAN,
+  waitAction      [9]  IMPLICIT INTEGER{
+                waitSupported    (1),
+                waitAlways      (2),
+                waitNotSupported  (3),
+                depends      (4),
+                notSaying      (5)},
+  -- non-brief elements follow:
+    -- To get brief plus 'description' use esn 'description'
+  description           [10]  IMPLICIT HumanString OPTIONAL,
+      -- to get above elements and 'specificExplain' use esn 'specificExplain'
+  specificExplain    [11]  IMPLICIT EXTERNAL OPTIONAL,
+                  -- Use oid of specific ES, and select choice [3] 'explain'. Format
+                  -- to be developed in conjunction with the specific ES definition.
+    -- to get all elements except 'specificExplain', use esn 'asn'
+  esASN          [12]  IMPLICIT InternationalString OPTIONAL -- the ASN.1 for this ES
+                }
+
+-- - - - - - - - - - - - - Detail records
+ -- The detail records describe relationships among entities supported by the target. RetrievalRecordDetails describes
+ -- the way that schema elements are mapped into record elements. This mapping may be different for each
+ -- combination of database, schema, record syntax. The per-element details describe the default mapping.
+ -- Origin-request re-tagging can change that mapping. When multiple databases are listed in a databaseNames
+ -- element, the record applies equally to all of the listed databases.  This is unrelated to searching the databases
+ -- together. AttributeDetails describes how databases can be searched. Each supported attribute is listed, and the
+ -- allowable combinations can be described.
+
+
+AttributeDetails ::= SEQUENCE {
+  commonInfo        [0]  IMPLICIT CommonInfo OPTIONAL,
+    -- Key elements follow:
+  databaseName        [1]  IMPLICIT DatabaseName,
+    -- Non-brief elements follow:
+  attributesBySet        [2]  IMPLICIT SEQUENCE OF AttributeSetDetails OPTIONAL, 
+                  -- mandatory in full record
+  attributeCombinations    [3]  IMPLICIT AttributeCombinations OPTIONAL}
+
+
+
+
+-- AttributeSetDetails referenced by AttributeDetails
+  AttributeSetDetails ::= SEQUENCE {
+        attributeSet      [0] IMPLICIT AttributeSetId,
+          attributesByType  [1] IMPLICIT SEQUENCE OF AttributeTypeDetails }
+    AttributeTypeDetails ::= SEQUENCE {
+         attributeType     [0] IMPLICIT INTEGER,
+          defaultIfOmitted    [1] IMPLICIT OmittedAttributeInterpretation OPTIONAL,
+          attributeValues    [2] IMPLICIT SEQUENCE OF AttributeValue OPTIONAL }
+                          -- If no attributeValues are supplied, all values of this type are fully
+                    -- supported, and the descriptions in AttributeSetInfo are adequate.
+
+    OmittedAttributeInterpretation ::= SEQUENCE {
+        defaultValue           [0] StringOrNumeric OPTIONAL,
+                                -- A default value is listed if that's how the server works
+        defaultDescription  [1] IMPLICIT HumanString OPTIONAL }
+                          -- The human-readable description should generally be provided.
+                    -- It is legal for both default elements to be missing, which
+                    -- means that the target will allow the attribute type to be
+                    -- omitted, but isn't saying what it will do.
+
+    AttributeValue ::= SEQUENCE {
+        value              [0]  StringOrNumeric,
+        description        [1]  IMPLICIT HumanString OPTIONAL,
+        subAttributes     [2]  IMPLICIT SEQUENCE OF StringOrNumeric OPTIONAL,
+        superAttributes    [3]  IMPLICIT SEQUENCE OF StringOrNumeric OPTIONAL,
+        partialSupport    [4]  IMPLICIT NULL OPTIONAL }
+        -- partialSupport indicates that an attributeValue is accepted, but may not be processed in the
+        -- "expected" way. One important reason for this is composite databases: in this case partialSupport
+        -- may indicate that only some of the subDbs support the attribute, and others ignore it.
+
+
+
+TermListDetails ::= SEQUENCE{  -- one for each termList in TermListInfo
+  commonInfo    [0]  IMPLICIT CommonInfo OPTIONAL,
+    -- Key elements follow:
+  termListName    [1]  IMPLICIT InternationalString,
+    -- Non-key elements (all non-brief) follow:
+  description    [2]  IMPLICIT HumanString OPTIONAL,
+  attributes      [3]  IMPLICIT AttributeCombinations OPTIONAL,
+                          -- Pattern for attributes that hit this list. Mandatory in full record
+  scanInfo      [4]  IMPLICIT SEQUENCE {
+                maxStepSize         [0] IMPLICIT INTEGER OPTIONAL,
+                collatingSequence  [1] IMPLICIT HumanString OPTIONAL,
+                increasing            [2] IMPLICIT BOOLEAN OPTIONAL} OPTIONAL,
+            -- Occurs only if list is scanable. If list is scanable and if scanInfo is omitted, 
+            -- target doesn't consider these important.
+  estNumberTerms  [5]  IMPLICIT INTEGER OPTIONAL,
+  sampleTerms    [6]  IMPLICIT SEQUENCE OF Term OPTIONAL}
+
+
+
+ElementSetDetails ::= SEQUENCE {
+  -- ElementSetDetails describes the way that database records are mapped to record elements. This
+  -- mapping may be different for each combination of database name and element set. The database record
+   -- description is a schema, which may be private to the target. The schema's abstract record structure
+  -- and tag sets provide the vocabulary for discussing record content; their presence in the Explain
+  -- database does not imply support for complex retrieval specification.
+  commonInfo      [0]  IMPLICIT CommonInfo OPTIONAL,
+    -- Key elements follow:
+  databaseName      [1]  IMPLICIT DatabaseName,
+  elementSetName    [2]  IMPLICIT ElementSetName,
+  recordSyntax      [3]  IMPLICIT OBJECT IDENTIFIER,
+    -- Non-key Brief elements follow:
+  schema        [4]  IMPLICIT OBJECT IDENTIFIER,
+    -- Non-brief elements follow:
+  description      [5]  IMPLICIT HumanString OPTIONAL,
+  detailsPerElement    [6]  IMPLICIT SEQUENCE OF PerElementDetails OPTIONAL -- mandatory in full record
+              }
+
+
+RetrievalRecordDetails ::= SEQUENCE {
+  commonInfo      [0]  IMPLICIT CommonInfo OPTIONAL,
+    -- Key elements follow:
+  databaseName      [1]  IMPLICIT DatabaseName,
+  schema        [2]  IMPLICIT OBJECT IDENTIFIER,
+  recordSyntax      [3]  IMPLICIT OBJECT IDENTIFIER,
+    -- Non-brief elements follow:
+  description      [4]  IMPLICIT HumanString OPTIONAL,
+  detailsPerElement    [5]  IMPLICIT SEQUENCE OF PerElementDetails OPTIONAL
+                -- mandatory in full record
+            }
+
+-- PerElementDetails is referenced in RetrievalRecordDetails and ElementSetDetails.
+  PerElementDetails ::= SEQUENCE {
+      name      [0]    IMPLICIT InternationalString OPTIONAL,
+                   -- If the name is omitted, the record syntax's name for this element
+                  -- is appropriate.
+      recordTag    [1]    IMPLICIT RecordTag OPTIONAL,
+                   -- The record tag may be omitted if tags are inappropriate for the record
+                  -- syntax, or if the origin can be expected to know it for some other reason.
+      schemaTags    [2]    IMPLICIT SEQUENCE OF Path OPTIONAL,
+                      -- The information from the listed schema elements is combined
+                  -- in some way to produce the data sent in the listed record tag. The
+                  -- 'contents' element below may describe the logic used.
+      maxSize    [3]    IMPLICIT INTEGER OPTIONAL,
+      minSize    [4]    IMPLICIT INTEGER OPTIONAL,
+      avgSize      [5]    IMPLICIT INTEGER OPTIONAL,
+      fixedSize    [6]    IMPLICIT INTEGER OPTIONAL,
+      repeatable    [8]    IMPLICIT BOOLEAN,
+      required    [9]    IMPLICIT BOOLEAN, 
+                  -- 'required' really means that target will always supply the element.
+      description    [12]  IMPLICIT HumanString OPTIONAL,
+      contents    [13]  IMPLICIT HumanString OPTIONAL,
+      billingInfo    [14]  IMPLICIT HumanString OPTIONAL,
+      restrictions    [15]  IMPLICIT HumanString OPTIONAL,
+      alternateNames  [16]  IMPLICIT SEQUENCE OF InternationalString OPTIONAL,
+      genericNames  [17]  IMPLICIT SEQUENCE OF InternationalString OPTIONAL,
+      searchAccess  [18]  IMPLICIT AttributeCombinations OPTIONAL }
+      -- RecordTag referenced in PerElementDetails above
+        RecordTag ::= SEQUENCE {
+              qualifier  [0] StringOrNumeric OPTIONAL,
+                    -- E.g. tag set for GRS-1
+              tagValue  [1] StringOrNumeric}
+
+SortDetails ::= SEQUENCE {
+  commonInfo    [0]  IMPLICIT CommonInfo OPTIONAL,
+  -- Key elements follow:
+  databaseName    [1]  IMPLICIT DatabaseName,
+    -- No non-key brief elements
+    -- Non-brief elements follow:
+  sortKeys      [2]  IMPLICIT SEQUENCE OF SortKeyDetails OPTIONAL
+              -- mandatory in full record
+          }
+  SortKeyDetails ::= SEQUENCE {
+      description        [0]  IMPLICIT HumanString OPTIONAL,
+      elementSpecifications  [1]  IMPLICIT SEQUENCE OF Specification OPTIONAL,
+                      -- each specification is a way of specifying this same sort key
+      attributeSpecifications  [2]  IMPLICIT AttributeCombinations OPTIONAL,
+                      -- each combination is a way of specifying this same sort key
+      sortType                   [3]  CHOICE {
+                    character    [0]  IMPLICIT NULL,
+                    numeric    [1]  IMPLICIT NULL,
+                    structured    [2]  IMPLICIT HumanString} OPTIONAL,
+      caseSensitivity      [4]  IMPLICIT INTEGER {
+                      always    (0),  -- always case-sensitive
+                    never    (1),            -- never case-sensitive
+                    default-yes  (2),               -- case-sensitivity is as specified on request, and if not
+                            -- specified, case-sensitive.
+                    default-no  (3)} -- case-sensitivity is as specified on request, and if not
+                            -- specified, not case-sensitive.
+                          OPTIONAL}
+
+ProcessingInformation ::= SEQUENCE{
+  commonInfo      [0]  IMPLICIT CommonInfo OPTIONAL,
+    -- Key elements follow:
+  databaseName      [1]  IMPLICIT DatabaseName,
+  processingContext    [2]  IMPLICIT INTEGER {
+                  access        (0),   -- e.g. choosing databases
+                  search        (1),   -- e.g. "search strategies" or search forms 
+                  retrieval      (2),   -- e.g. recommended element combinations 
+                  record-presentation  (3),    -- display of retrieved records
+                  record-handling    (4)    -- handling (e.g. saving) of retrieved records
+        },
+  name          [3]  IMPLICIT InternationalString,
+  oid          [4]  IMPLICIT OBJECT IDENTIFIER,
+    -- No non-key brief elements
+    -- Non-brief elements follow:
+  description      [5]  IMPLICIT HumanString OPTIONAL,
+                -- use element set name 'description' to retrieve all except instructions.
+  instructions      [6]  IMPLICIT EXTERNAL OPTIONAL -- mandatory in full record
+              }
+
+
+VariantSetInfo ::= SEQUENCE {
+    -- A record in this category describes a variant set definition, i.e., classes, types, and values, for a specific
+    -- variant set definition supported by the target. Support by the target of a particular variant set definition
+    -- does not imply that the definition is supported for any specific database or element. 
+  commonInfo    [0] IMPLICIT CommonInfo OPTIONAL,
+  -- Key elements follow:
+  variantSet    [1] IMPLICIT OBJECT IDENTIFIER,
+  -- Non-key brief elements follow:
+  name      [2] IMPLICIT InternationalString,
+  -- Non-brief elements follow:
+  variants    [3] IMPLICIT SEQUENCE OF VariantClass OPTIONAL
+                   -- mandatory in full record
+           }
+
+  -- Subsidiary structures for VariantSetInfo
+    VariantClass ::= SEQUENCE {
+          name        [0] IMPLICIT InternationalString OPTIONAL,
+          description    [1] IMPLICIT HumanString OPTIONAL,
+          variantClass    [2] IMPLICIT INTEGER,
+          variantTypes  [3] IMPLICIT SEQUENCE OF VariantType}
+    VariantType ::= SEQUENCE {
+          name            [0] IMPLICIT InternationalString OPTIONAL,
+          description     [1] IMPLICIT HumanString OPTIONAL,
+          variantType    [2] IMPLICIT INTEGER,
+          variantValue  [3] IMPLICIT VariantValue OPTIONAL}
+    VariantValue ::= SEQUENCE {
+          dataType     [0] PrimitiveDataType,
+          values        [1] ValueSet OPTIONAL }
+    ValueSet ::= CHOICE {
+          range       [0] IMPLICIT ValueRange,
+          enumerated  [1] IMPLICIT SEQUENCE OF ValueDescription }
+    ValueRange ::= SEQUENCE {
+            -- At last one the following must be supplied, both may be supplied.
+          lower      [0] ValueDescription OPTIONAL,
+          upper     [1] ValueDescription OPTIONAL }
+    ValueDescription ::= CHOICE{
+      integer             INTEGER,
+          string              InternationalString,
+          octets              OCTET STRING,
+          oid                 OBJECT IDENTIFIER,
+          unit               [1]  IMPLICIT Unit,
+          valueAndUnit   [2]  IMPLICIT IntUnit 
+            -- oid and unit can't be used in a ValueRange
+            }
+
+
+
+UnitInfo ::= SEQUENCE {
+  commonInfo  [0] IMPLICIT CommonInfo OPTIONAL,
+  -- Key elements follow:
+  unitSystem   [1] IMPLICIT InternationalString,
+   -- No non-key brief elements
+   -- Non-brief elements follow:
+  description   [2] IMPLICIT HumanString OPTIONAL,
+  units      [3] IMPLICIT SEQUENCE OF UnitType OPTIONAL
+                         -- mandatory in full record
+           }
+
+  -- Subsidiary structures for UnitInfo
+    UnitType ::= SEQUENCE {
+      name    [0] IMPLICIT InternationalString OPTIONAL,
+      description  [1] IMPLICIT HumanString OPTIONAL,
+      unitType  [2] StringOrNumeric,
+      units     [3] IMPLICIT SEQUENCE OF Units}
+
+    Units ::= SEQUENCE {
+      name     [0] IMPLICIT InternationalString OPTIONAL,
+      description  [1] IMPLICIT HumanString OPTIONAL,
+      unit      [2] StringOrNumeric}
+
+CategoryList ::= SEQUENCE {
+  commonInfo      [0] IMPLICIT CommonInfo OPTIONAL,
+    -- Only one record expected per Explain database. All elements appear in brief presentation.
+  categories      [1] IMPLICIT SEQUENCE OF CategoryInfo }
+    CategoryInfo ::= SEQUENCE {
+           category          [1] IMPLICIT InternationalString,
+            originalCategory    [2] IMPLICIT InternationalString OPTIONAL,
+          description         [3] IMPLICIT HumanString OPTIONAL,
+         asn1Module      [4] IMPLICIT InternationalString OPTIONAL}
+
+
+-- - - - - - - - - - - - - - Subsidiary definitions
+
+CommonInfo ::= SEQUENCE {
+  dateAdded         [0] IMPLICIT GeneralizedTime OPTIONAL,
+  dateChanged       [1] IMPLICIT GeneralizedTime OPTIONAL,
+  expiry                [2] IMPLICIT GeneralizedTime OPTIONAL,
+  humanString-Language  [3] IMPLICIT LanguageCode OPTIONAL,
+  -- following not to occur for brief:
+  otherInfo          OtherInformation OPTIONAL}
+
+
+HumanString ::= SEQUENCE OF SEQUENCE {
+          language  [0] IMPLICIT LanguageCode OPTIONAL,
+        text        [1] IMPLICIT InternationalString}
+
+IconObject ::= SEQUENCE OF SEQUENCE{
+      -- Note that the "SEQUENCE OF" is to allow alternative representations of the same Icon; it is not
+      -- intended to allow multiple icons.
+  bodyType [1] CHOICE{
+           ianaType  [1] IMPLICIT InternationalString,
+          z3950type  [2] IMPLICIT InternationalString,
+           otherType  [3] IMPLICIT InternationalString},
+  content  [2] IMPLICIT OCTET STRING}
+
+
+LanguageCode ::= InternationalString  -- from ANSI/NISO Z39.53-1994 
+
+ContactInfo ::= SEQUENCE {
+  name           [0] IMPLICIT InternationalString OPTIONAL,
+  description  [1] IMPLICIT HumanString OPTIONAL,
+  address        [2] IMPLICIT HumanString OPTIONAL,
+  email         [3] IMPLICIT InternationalString OPTIONAL,
+  phone         [4] IMPLICIT InternationalString OPTIONAL}
+
+NetworkAddress ::= CHOICE {
+  internetAddress      [0] IMPLICIT SEQUENCE {
+                  hostAddress    [0]  IMPLICIT InternationalString,
+                  port       [1]  IMPLICIT INTEGER},
+  osiPresentationAddress    [1] IMPLICIT SEQUENCE { 
+                    pSel         [0] IMPLICIT InternationalString,  
+                    sSel         [1] IMPLICIT InternationalString OPTIONAL,  
+                    tSel        [2] IMPLICIT InternationalString OPTIONAL,  
+                    nSap      [3] IMPLICIT InternationalString},
+  other            [2] IMPLICIT SEQUENCE {  
+                      type        [0] IMPLICIT InternationalString,
+                address    [1] IMPLICIT InternationalString}}
+
+AccessInfo ::= SEQUENCE {
+    -- AccessInfo contains the fundamental information about what facilities are required to use this target
+    -- or server. For example, if an origin can handle none of the record syntaxes a database can provide, 
+    -- it might choose not to access the database.
+  queryTypesSupported  [0]    IMPLICIT SEQUENCE OF QueryTypeDetails OPTIONAL,
+  diagnosticsSets        [1]    IMPLICIT SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,
+  attributeSetIds          [2]    IMPLICIT SEQUENCE OF AttributeSetId OPTIONAL,
+  schemas                [3]    IMPLICIT SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,
+  recordSyntaxes         [4]    IMPLICIT SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,
+  resourceChallenges    [5]    IMPLICIT SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,
+  restrictedAccess       [6]    IMPLICIT AccessRestrictions OPTIONAL,
+  costInfo                 [8]    IMPLICIT Costs OPTIONAL,
+  variantSets       [9]    IMPLICIT SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,
+  elementSetNames    [10]  IMPLICIT SEQUENCE OF ElementSetName OPTIONAL,
+  unitSystems      [11]  IMPLICIT SEQUENCE OF InternationalString}
+
+-- begin auxiliary definitions for AccessInfo
+-- Begin Query Details
+QueryTypeDetails ::= CHOICE {
+  private       [0]    IMPLICIT PrivateCapabilities,
+  rpn            [1]    IMPLICIT RpnCapabilities,
+  iso8777          [2]    IMPLICIT Iso8777Capabilities,
+  z39-58      [100]  IMPLICIT HumanString,
+  erpn        [101]  IMPLICIT RpnCapabilities,
+  rankedList      [102]  IMPLICIT HumanString}
+
+PrivateCapabilities ::= SEQUENCE {
+  operators       [0]  IMPLICIT SEQUENCE OF SEQUENCE {
+              operator  [0] IMPLICIT InternationalString,
+              description  [1] IMPLICIT HumanString OPTIONAL } OPTIONAL,
+  searchKeys    [1]  IMPLICIT SEQUENCE OF SearchKey OPTIONAL,  -- field names that can be searched
+  description    [2]  IMPLICIT SEQUENCE OF HumanString OPTIONAL }
+
+RpnCapabilities ::= SEQUENCE {
+  operators                    [0] IMPLICIT SEQUENCE OF INTEGER OPTIONAL,
+                                        -- Omitted means all operators are supported.
+  resultSetAsOperandSupported  [1] IMPLICIT BOOLEAN,
+  restrictionOperandSupported    [2] IMPLICIT BOOLEAN,
+  proximity                    [3] IMPLICIT ProximitySupport OPTIONAL}
+
+Iso8777Capabilities ::= SEQUENCE {
+  searchKeys  [0]  IMPLICIT SEQUENCE OF SearchKey,  -- field names that may be searched
+  restrictions   [1]  IMPLICIT HumanString OPTIONAL 
+            -- Omitted means supported, not specifying units.
+              }
+
+ProximitySupport ::= SEQUENCE {
+  anySupport      [0]   IMPLICIT BOOLEAN,
+          -- 'false' means no proximity support, in which case unitsSupported not supplied.
+  unitsSupported  [1]   IMPLICIT SEQUENCE OF CHOICE{  
+             known  [1] IMPLICIT INTEGER, -- values from KnownProximityUnit
+          private  [2] IMPLICIT SEQUENCE{  
+                      unit    [0] IMPLICIT INTEGER,  
+                description  [1] HumanString OPTIONAL}} OPTIONAL}
+
+SearchKey ::= SEQUENCE {
+  searchKey     [0]  IMPLICIT InternationalString,
+  description     [1]  IMPLICIT HumanString OPTIONAL }
+-- End Query details
+AccessRestrictions ::= SEQUENCE OF SEQUENCE {
+  accessType      [0] INTEGER {
+                  any         (0),
+                  search         (1),
+                  present         (2),
+                  specific-elements  (3),
+                  extended-services  (4),
+            by-database      (5)},
+  accessText         [1]  IMPLICIT HumanString OPTIONAL,
+  accessChallenges  [2]  IMPLICIT SEQUENCE OF OBJECT IDENTIFIER OPTIONAL}
+
+Costs ::= SEQUENCE {
+  connectCharge    [0] IMPLICIT Charge OPTIONAL,    -- Per-connection charge
+  connectTime    [1] IMPLICIT Charge OPTIONAL,    -- Time-based charge
+  displayCharge     [2] IMPLICIT Charge OPTIONAL,    -- Per-record charge
+  searchCharge     [3] IMPLICIT Charge OPTIONAL,    -- Per-search charge
+  subscriptCharge  [4]  IMPLICIT Charge OPTIONAL,  -- Subscription charges
+  otherCharges    [5] IMPLICIT SEQUENCE OF SEQUENCE{   -- Other charges
+            forWhat  [1]  IMPLICIT HumanString,
+            charge    [2]  IMPLICIT Charge} OPTIONAL} 
+    Charge ::= SEQUENCE{
+        cost          [1] IMPLICIT IntUnit,
+        perWhat  [2] IMPLICIT Unit OPTIONAL,
+                      -- e.g. "second," "minute," "line," "record"...
+        text          [3] IMPLICIT HumanString OPTIONAL} 
+-- End Auxiliary definitions for AccessInfo
+
+DatabaseList ::= SEQUENCE OF DatabaseName
+
+AttributeCombinations ::= SEQUENCE {
+  defaultAttributeSet  [0] IMPLICIT AttributeSetId,
+                 -- Default for the combinations. Also probably a good choice for the default
+              -- in searches, but that isn't required.
+  legalCombinations  [1] IMPLICIT SEQUENCE OF AttributeCombination }
+
+
+AttributeCombination ::= SEQUENCE OF AttributeOccurrence
+            -- An AttributeCombination is a pattern for legal combination of attributes
+
+
+AttributeOccurrence ::= SEQUENCE {   
+      -- An AttributeOccurrence lists the legal values for a specific attribute type in a combination.
+       attributeSet       [0]  IMPLICIT AttributeSetId OPTIONAL,
+       attributeType      [1]  IMPLICIT INTEGER,
+       mustBeSupplied  [2]  IMPLICIT NULL OPTIONAL,
+       attributeValues    CHOICE {
+                      any-or-none  [3] IMPLICIT NULL, -- All supported values are OK 
+                      specific    [4] IMPLICIT SEQUENCE OF StringOrNumeric}}
+                                                  -- Only these values allowed
+END
+
+
+
+
+
+
+
+
+
+RecordSyntax-SUTRS
+{Z39-50-recordSyntax SUTRS (101)} DEFINITIONS ::=
+BEGIN 
+IMPORTS InternationalString  FROM Z39-50-APDU-1995;
+        SutrsRecord ::=  InternationalString
+-- Line terminator is ASCII LF (X'0A').
+-- Recommended maximum line length is 72 characters.
+END
+
+
+
+
+
+RecordSyntax-opac
+{Z39-50-recordSyntax opac (102)} DEFINITIONS ::=
+BEGIN 
+IMPORTS InternationalString  FROM Z39-50-APDU-1995;
+OPACRecord ::= SEQUENCE {
+  bibliographicRecord   [1]   IMPLICIT EXTERNAL OPTIONAL,
+  holdingsData     [2]   IMPLICIT SEQUENCE OF HoldingsRecord OPTIONAL}
+HoldingsRecord ::=  CHOICE {
+  marcHoldingsRecord  [1]   IMPLICIT EXTERNAL,
+  holdingsAndCirc  [2]  IMPLICIT HoldingsAndCircData}
+HoldingsAndCircData ::=  SEQUENCE {
+-- the following elements are required to display holdings in conformance with NISO standards.
+  typeOfRecord    [1]   IMPLICIT InternationalString OPTIONAL, -- LDR 06
+  encodingLevel    [2]   IMPLICIT InternationalString OPTIONAL, -- LDR 017
+  format      [3]   IMPLICIT InternationalString OPTIONAL, -- 007 00-01
+  receiptAcqStatus    [4]   IMPLICIT InternationalString OPTIONAL, -- 008 06
+  generalRetention    [5]   IMPLICIT InternationalString OPTIONAL, -- 008 12
+  completeness    [6]   IMPLICIT InternationalString OPTIONAL, -- 008 16
+       dateOfReport     [7]   IMPLICIT InternationalString OPTIONAL, -- 008 26-31
+  nucCode    [8]   IMPLICIT InternationalString OPTIONAL, -- 852 $a
+  localLocation    [9]   IMPLICIT InternationalString OPTIONAL, -- 852 $b
+  shelvingLocation  [10]   IMPLICIT InternationalString OPTIONAL, -- 852 $c
+  callNumber    [11]   IMPLICIT InternationalString OPTIONAL, -- 852 $h and $i
+  shelvingData     [12]   IMPLICIT InternationalString OPTIONAL, -- 852 $j thru $m
+  copyNumber    [13]   IMPLICIT InternationalString OPTIONAL, -- 852 $t
+  publicNote    [14]   IMPLICIT InternationalString OPTIONAL, -- 852 $z
+  reproductionNote  [15]   IMPLICIT InternationalString OPTIONAL, -- 843
+  termsUseRepro     [16]   IMPLICIT InternationalString OPTIONAL, -- 845
+  enumAndChron    [17]   IMPLICIT InternationalString OPTIONAL, -- all 85x, 86x
+  volumes     [18]   IMPLICIT SEQUENCE OF Volume OPTIONAL, 
+            -- repeats for each volume held
+  circulationData    [19]   IMPLICIT SEQUENCE OF CircRecord OPTIONAL 
+            -- repeats for each circulating item.
+            }
+Volume ::=  SEQUENCE {
+  enumeration    [1]   IMPLICIT InternationalString OPTIONAL,
+  chronology     [2]   IMPLICIT InternationalString OPTIONAL,
+  enumAndChron    [3]   IMPLICIT InternationalString OPTIONAL }
+CircRecord ::=  SEQUENCE {
+  availableNow    [1]   IMPLICIT BOOLEAN,
+  availablityDate    [2]   IMPLICIT InternationalString OPTIONAL,
+  availableThru      [3]   IMPLICIT InternationalString OPTIONAL,
+  restrictions     [4]   IMPLICIT InternationalString OPTIONAL,
+  itemId        [5]   IMPLICIT InternationalString OPTIONAL,
+  renewable        [6]   IMPLICIT BOOLEAN,
+  onHold        [7]   IMPLICIT BOOLEAN,
+  enumAndChron     [8]   IMPLICIT InternationalString OPTIONAL,
+  midspine    [9]   IMPLICIT InternationalString OPTIONAL,
+  temporaryLocation  [10]   IMPLICIT InternationalString OPTIONAL}
+END
+
+
+
+RecordSyntax-summary
+
+{Z39-50-recordSyntax summary (103)} DEFINITIONS ::=
+BEGIN 
+IMPORTS OtherInformation, InternationalString  FROM Z39-50-APDU-1995;
+BriefBib ::= SEQUENCE {
+  title           [1]   IMPLICIT InternationalString,
+  author            [2]   IMPLICIT InternationalString OPTIONAL,
+  callNumber         [3]   IMPLICIT InternationalString OPTIONAL,
+  recordType      [4]   IMPLICIT InternationalString OPTIONAL,
+  bibliographicLevel  [5]   IMPLICIT InternationalString OPTIONAL,
+  format        [6]   IMPLICIT SEQUENCE OF FormatSpec OPTIONAL,
+  publicationPlace    [7]   IMPLICIT InternationalString OPTIONAL,
+  publicationDate     [8]   IMPLICIT InternationalString OPTIONAL,
+  targetSystemKey   [9]   IMPLICIT InternationalString OPTIONAL,
+  satisfyingElement  [10]   IMPLICIT InternationalString OPTIONAL,
+  rank         [11]   IMPLICIT INTEGER OPTIONAL,
+  documentId     [12]   IMPLICIT InternationalString OPTIONAL,
+  abstract       [13]   IMPLICIT InternationalString OPTIONAL,
+  otherInfo        OtherInformation OPTIONAL}
+
+FormatSpec     ::=  SEQUENCE {
+  type         [1]   IMPLICIT InternationalString,
+  size      [2]   IMPLICIT INTEGER OPTIONAL,
+  bestPosn     [3]   IMPLICIT INTEGER OPTIONAL}
+END
+
+
+
+
+
+
+
+
+
+
+RecordSyntax-generic  -- For detailed semantics, see Appendix RET.
+{Z39-50-recordSyntax GRS-1 (105)} DEFINITIONS ::=
+BEGIN 
+EXPORTS Variant;
+IMPORTS IntUnit, Unit, InternationalString, StringOrNumeric, Term FROM Z39-50-APDU-1995;
+
+GenericRecord ::= SEQUENCE OF TaggedElement  
+TaggedElement ::= SEQUENCE {
+  tagType    [1] IMPLICIT INTEGER OPTIONAL,
+              -- If omitted, default should be supplied dynamically by tagSet-M; 
+              -- otherwise it should be statically specified by the schema.
+  tagValue    [2] StringOrNumeric,
+  tagOccurrence  [3] IMPLICIT INTEGER OPTIONAL,
+                             -- Occurrence within the database record, and relative to the parent. No
+              -- default; if omitted, target not telling or it is irrelevant.
+  content      [4] ElementData,
+  metaData    [5] IMPLICIT ElementMetaData OPTIONAL,
+  appliedVariant  [6] IMPLICIT Variant OPTIONAL}
+
+ElementData ::= CHOICE{
+  octets      OCTET STRING,
+  numeric    INTEGER,
+  date      GeneralizedTime,
+  ext        EXTERNAL,
+  string      InternationalString,
+  trueOrFalse    BOOLEAN,
+  oid        OBJECT IDENTIFIER,
+  intUnit          [1]  IMPLICIT IntUnit,
+   elementNotThere    [2] IMPLICIT NULL,  -- element requested but not there
+  elementEmpty      [3] IMPLICIT NULL,  -- element there, but empty
+  noDataRequested    [4] IMPLICIT NULL,  -- variant request said 'no data'
+  diagnostic        [5] IMPLICIT EXTERNAL,
+  subtree          [6] SEQUENCE OF TaggedElement -- recursive, for nested tags
+              }
+
+
+ElementMetaData ::= SEQUENCE{
+  seriesOrder        [1]   IMPLICIT Order OPTIONAL, -- only for a non-leaf node
+  usageRight        [2]   IMPLICIT Usage OPTIONAL,
+  hits            [3]    IMPLICIT SEQUENCE OF HitVector OPTIONAL,
+  displayName      [4]    IMPLICIT InternationalString OPTIONAL, 
+                    -- name for element that origin can use for display
+  supportedVariants    [5]   IMPLICIT SEQUENCE OF Variant OPTIONAL,
+  message        [6]    IMPLICIT InternationalString OPTIONAL,
+  elementDescriptor    [7]   IMPLICIT OCTET STRING OPTIONAL,
+  surrogateFor      [8]   IMPLICIT TagPath OPTIONAL,  
+                    -- the retrieved element is a surrogate for the element given by this path  
+  surrogateElement    [9]   IMPLICIT TagPath OPTIONAL,
+                    -- the element given by this path is a surrogate for the retrieved element
+    other          [99]  IMPLICIT EXTERNAL OPTIONAL}
+
+        TagPath ::= SEQUENCE  OF SEQUENCE{
+          tagType      [1]  IMPLICIT INTEGER OPTIONAL,
+            tagValue      [2]  StringOrNumeric,
+            tagOccurrence    [3]  IMPLICIT INTEGER OPTIONAL}
+
+
+
+Order ::= SEQUENCE{
+  ascending    [1] IMPLICIT BOOLEAN,
+              -- "true" means monotonically increasing (i.e. non-decreasing); 
+              -- "false" means monotonically decreasing (i.e. non-increasing).
+  order      [2] IMPLICIT INTEGER
+              -- Same as defined by 'elementOrdering' in tagSet-M, though this may be
+              -- overridden by schema.
+          }
+
+
+
+Usage ::= SEQUENCE  {
+  type        [1] IMPLICIT INTEGER{
+              redistributable    (1),   -- Element is freely redistributable.
+              restricted      (2),   -- Restriction contains statement.
+              licensePointer    (3)   -- Restriction contains license pointer.
+              },
+  restriction    [2] IMPLICIT InternationalString OPTIONAL}
+
+
+
+HitVector ::= SEQUENCE{ 
+    -- Each hit vector points to a fragment within the element, via location and/or token.
+  satisfier            Term OPTIONAL, -- sourceword, etc.
+  offsetIntoElement    [1] IMPLICIT IntUnit OPTIONAL,
+  length          [2] IMPLICIT IntUnit OPTIONAL,
+  hitRank          [3] IMPLICIT INTEGER OPTIONAL,
+  targetToken        [4] IMPLICIT OCTET STRING OPTIONAL
+                  -- Origin may use token subsequently within a variantRequest (in
+                  --  an elementRequest) to retrieve (or to refer to) the fragment.  
+              }
+
+
+
+
+Variant ::= SEQUENCE{
+    globalVariantSetId    [1] IMPLICIT OBJECT IDENTIFIER OPTIONAL,
+                  -- Applies to the triples below, when variantSetId omitted. If
+                  -- globalVariantSetId omitted, default applies. Default may be provided by
+                  -- the tagSet-M element defaultVariantSetId.
+
+
+
+
+  triples          [2]  IMPLICIT SEQUENCE OF SEQUENCE{
+                  variantSetId  [0]  IMPLICIT OBJECT IDENTIFIER OPTIONAL,
+                              -- If omitted, globalVariantSetId (above)
+                              -- applies, unless that too is omitted, in
+                               -- which case, default used.
+                  class      [1]  IMPLICIT INTEGER,
+                  type      [2]  IMPLICIT INTEGER,
+                  value      [3]  CHOICE{
+                               integer INTEGER,
+                               internationalString InternationalString,
+                               octetString OCTET STRING,
+                               objectIdentifier OBJECT IDENTIFIER,
+                               boolean BOOLEAN,
+                              null NULL,
+                          -- Following need context tags:
+                            unit      [1] IMPLICIT Unit, 
+                            valueAndUnit  [2] IMPLICIT IntUnit}}}
+END
+
+
+
+RecordSyntax-ESTaskPackage
+{Z39-50-recordSyntax ESTaskPackage (106)} DEFINITIONS ::=
+BEGIN 
+IMPORTS Permissions, InternationalString, IntUnit, DiagRec FROM Z39-50-APDU-1995;
+
+TaskPackage ::= SEQUENCE{
+  packageType      [1]   IMPLICIT OBJECT IDENTIFIER,
+                    -- oid of specific ES definition
+  packageName      [2]   IMPLICIT InternationalString OPTIONAL,
+  userId          [3]   IMPLICIT InternationalString OPTIONAL,
+  retentionTime      [4]   IMPLICIT IntUnit OPTIONAL,
+  permissions        [5]   IMPLICIT Permissions OPTIONAL,
+  description        [6]   IMPLICIT InternationalString OPTIONAL,
+  targetReference      [7]   IMPLICIT OCTET STRING OPTIONAL,
+  creationDateTime    [8]   IMPLICIT GeneralizedTime OPTIONAL,
+  taskStatus        [9]   IMPLICIT INTEGER{
+                      pending    (0),
+                      active    (1),
+                      complete  (2),
+                      aborted    (3)},
+  packageDiagnostics    [10]  IMPLICIT SEQUENCE OF DiagRec OPTIONAL,
+  taskSpecificParameters  [11]  IMPLICIT EXTERNAL
+                    -- Use oid for specific ES definition
+                    -- (same oid as packageType above)
+                    -- and select [2] "taskPackage."
+    } 
+END
+
+
+
+
+ResourceReport-Format-Resource-1
+{Z39-50-resourceReport resource-1 (1)} DEFINITIONS ::=
+BEGIN 
+IMPORTS InternationalString FROM Z39-50-APDU-1995;  
+--
+ResourceReport ::= SEQUENCE{
+estimates    [1]   IMPLICIT SEQUENCE OF Estimate,
+message      [2]   IMPLICIT InternationalString}
+--
+Estimate ::= SEQUENCE{
+type        [1]   IMPLICIT EstimateType,
+value        [2]   IMPLICIT INTEGER,  -- the actual estimate
+currency-code  [3]   IMPLICIT INTEGER OPTIONAL
+                -- code for representation of currencies defined in ISO 4217-1990.  
+                -- Applicable only to monetary estimates.
+                              }
+EstimateType ::= INTEGER{
+currentSearchRecords    (1),         -- estimated no. records in current (incomplete) result set for search
+finalSearchRecords       (2),        -- estimated no. records that will be in result set if search completes
+currentPresentRecords    (3),        -- estimated number of records in current (incomplete) set of
+                      -- records to be returned on Present
+finalPresentRecords      (4),  -- estimated number of records that will be in the set of records
+                      -- to be returned by Present if Present completes
+currentOpTimeProcessing  (5),  -- processing time (in .001 CPU seconds) used by operation so far
+finalOpTimeProcessing    (6),                -- estimated total processing time (in .001 CPU seconds) that will
+                              -- be used by this operation if it completes
+currentAssocTime      (7),  -- estimated processing time used by association (in .001 CPU sec.)
+currentOperationCost      (8),  -- estimated cost for this operation so far
+finalOperationCost      (9),  -- estimated cost for this operation if it completes
+currentAssocCost        (10),  -- estimated cost for this association so far
+finalOpTimeElapsed            (11),  -- estimated elapsed time for operation if it completes (in .001 sec.) 
+percentComplete         (12), -- estimated percent complete
+currentSearchAssocCost    (13),  -- estimated search cost for association so far
+currentPresentAssocCost  (14),  -- estimated present cost for this association so far
+currentConnectAssocCost    (15),  -- estimated connect time cost for association so far
+currentOtherAssocCost    (16)  -- estimated other cost (not included in 13-15) for association so far
+                  }
+END
+
+
+
+
+
+
+
+
+
+
+
+
+
+ResourceReport-Format-Resource-2
+{Z39-50-resourceReport resource-2 (2)} DEFINITIONS ::=
+BEGIN 
+IMPORTS InternationalString, StringOrNumeric, IntUnit FROM Z39-50-APDU-1995;  
+--
+ResourceReport ::= SEQUENCE{
+estimates    [1]   IMPLICIT SEQUENCE OF Estimate OPTIONAL,
+message      [2]   IMPLICIT InternationalString OPTIONAL}
+--
+Estimate ::= SEQUENCE{
+type      [1]   StringOrNumeric,
+              -- Numeric values of 1-16 are the same as used in Resource-1.
+value      [2]   IMPLICIT IntUnit
+              -- When expressing currency:
+              --    unitSystem (of Unit) is 'z3950'  (case insensitive)
+              --    unitType is 'iso4217-1990'       (case insensitive)
+              --    unit is currency code from ISO 4217-1990.
+}
+END
+
+
+
+
+
+AccessControlFormat-prompt-1
+{Z39-50-accessControl prompt-1 (1)} DEFINITIONS ::=
+BEGIN
+IMPORTS InternationalString, DiagRec FROM Z39-50-APDU-1995;
+--
+PromptObject ::= CHOICE{
+  challenge      [1] IMPLICIT Challenge,
+   response        [2] IMPLICIT Response}
+
+  Challenge ::= SEQUENCE OF SEQUENCE {
+    promptId      [1] PromptId,
+                    -- Target supplies a number (for an enumerated prompt) or string (for a non
+                    -- -enumerated prompt), for each prompt, and the origin returns it in response, for
+                    -- this prompt, so target may correlate the prompt response with the prompt.
+    defaultResponse  [2] IMPLICIT InternationalString OPTIONAL,
+     promptInfo      [3] CHOICE{ 
+                    character  [1] IMPLICIT InternationalString,
+                    encrypted  [2] IMPLICIT Encryption} OPTIONAL,
+                    -- Information corresponding to an enumerated prompt. For example if 'type', within
+                    -- PromptId, is 'copyright', then promptInfo may contain a copyright statement.  
+    regExpr        [4] IMPLICIT InternationalString OPTIONAL,
+                              -- A regular expression that promptResponse should match. See IEEE 1003.2
+                    -- Volume 1, Section 2.8 "Regular Expression Notation." For example if promptId
+                    -- is "Year of publication," regExpr might be "19[89][0-9]|20[0-9][0-9]".
+    responseRequired  [5] IMPLICIT NULL OPTIONAL,
+     allowedValues    [6] IMPLICIT SEQUENCE OF InternationalString OPTIONAL,
+                        -- e.g. promptId="Desired color"; allowed = 'red', 'blue','Green'.
+    shouldSave      [7] IMPLICIT NULL OPTIONAL,
+                        -- Target recommends that origin save the data that it prompts from the
+                     -- user corresponding to this prompt, because it is likely to be requested again (so
+                    -- origin might not have to prompt the user next time).
+        dataType        [8] IMPLICIT INTEGER{
+                             integer        (1),
+                          date            (2),
+                        float           (3),
+                        alphaNumeric  (4),
+                        url-urn       (5),
+                        boolean       (6)} OPTIONAL,
+                        -- Target telling origin type of data it wants. E.g., if "date" is specified,
+                        -- presumably the origin will try to prompt something "date-like" from the user.
+        diagnostic       [9] IMPLICIT EXTERNAL OPTIONAL
+                          -- Intended for repeat requests when there is an error the origin 
+                        -- should report to the user from previous attempt.
+                }
+
+
+  Response ::= SEQUENCE OF SEQUENCE {
+      promptId    [1] PromptId,
+                  -- Corresponds to a prompt in the challenge, or may be unprompted, for
+                  -- example "newPassword." If unprompted, should be "enumerated." 
+                  -- If this responds to a non-enumerated prompt, then nonEnumeratedPrompt
+                   -- should contain the prompt string from the challenge.
+    promptResponse  [2] CHOICE{
+                    string      [1] IMPLICIT InternationalString,
+                    accept      [2] IMPLICIT BOOLEAN,
+                    acknowledge  [3] IMPLICIT NULL,
+                    diagnostic    [4] DiagRec,
+                     encrypted    [5] IMPLICIT Encryption}}
+
+
+ PromptId ::= CHOICE{
+  enummeratedPrompt    [1] IMPLICIT SEQUENCE{
+                      type            [1] IMPLICIT INTEGER{
+                                      groupId    (0),
+                                      userId     (1),
+                                      password   (2),
+                                      newPassword  (3),
+                                      copyright    (4),
+                            -- When type on Challenge is 'copyright', promptInfo has text of
+                            -- copyright message to be displayed verbatim to the user. If
+                            -- promptResponse indicates 'acceptance', this indicates the user has been
+                            -- shown, and accepted, the terms of the copyright. This is not intended
+                            -- to be legally binding, but provides a good-faith attempt on
+                            -- the part of the target to inform the user of the copyright.
+                                      sessionId      (5)},
+                      suggestedString    [2] IMPLICIT InternationalString OPTIONAL},
+   nonEnumeratedPrompt  [2] IMPLICIT InternationalString}
+
+
+ Encryption ::= SEQUENCE{
+  cryptType    [1] IMPLICIT OCTET STRING OPTIONAL, 
+  credential    [2] IMPLICIT OCTET STRING OPTIONAL,
+                    --random number, SALT, or other factor
+  data        [3] IMPLICIT OCTET STRING}
+
+END
+
+
+
+
+AccessControlFormat-des-1
+{Z39-50-accessControlFormat  des-1 (2)} DEFINITIONS ::=
+BEGIN
+    DES-RN-Object ::= CHOICE {
+      challenge    [1]    IMPLICIT DRNType,
+      response      [2]    IMPLICIT DRNType}
+    DRNType ::= SEQUENCE{
+          userId        [1]    IMPLICIT OCTET STRING OPTIONAL,
+          salt          [2]    IMPLICIT OCTET STRING OPTIONAL,
+          randomNumber  [3]    IMPLICIT OCTET STRING}
+END
+
+
+AccessControlFormat-krb-1
+{Z39-50-accessControlFormat  krb-1 (3)} DEFINITIONS ::=
+BEGIN
+IMPORTS InternationalString FROM Z39-50-APDU-1995;
+
+     KRBObject ::= CHOICE {
+       challenge   [1]    IMPLICIT KRBRequest,
+       response    [2]    IMPLICIT KRBResponse}
+     KRBRequest ::= SEQUENCE{
+           service         [1]   IMPLICIT InternationalString,
+           instance        [2]   IMPLICIT InternationalString OPTIONAL,
+           realm          [3]   IMPLICIT InternationalString OPTIONAL}
+        -- target requests a ticket for the given service, instance, and realm
+     KRBResponse ::= SEQUENCE{
+           userid            [1]   IMPLICIT InternationalString OPTIONAL,
+           ticket           [2]  IMPLICIT OCTET STRING}
+        -- origin responds with a ticket for the requested service
+END
+
+
+
+
+
+
+
+
+
+ESFormat-PersistentResultSet
+{Z39-50-extendedService PersistentResultSet (1)} DEFINITIONS ::=
+BEGIN
+IMPORTS InternationalString FROM Z39-50-APDU-1995;
+PersistentResultSet ::= CHOICE{
+    esRequest    [1] IMPLICIT SEQUENCE{
+        toKeep    [1] IMPLICIT NULL,
+        notToKeep  [2] OriginPartNotToKeep OPTIONAL},
+    taskPackage  [2] IMPLICIT SEQUENCE{
+        originPart  [1] IMPLICIT NULL,
+        targetPart  [2] TargetPart OPTIONAL}}
+OriginPartNotToKeep ::= SEQUENCE{
+  originSuppliedResultSet  [1] IMPLICIT InternationalString OPTIONAL,
+          -- name of transient result set, supplied on request, mandatory unless function is 'delete'
+  replaceOrAppend    [2] IMPLICIT INTEGER{  -- only if function is "modify"
+          replace    (1),
+          append    (2)} OPTIONAL}
+TargetPart ::= SEQUENCE{
+  targetSuppliedResultSet  [1] IMPLICIT InternationalString OPTIONAL, 
+          -- Name of transient result set, supplied by target, representing the persistent result set to which
+          -- package pertains. Meaningful only when package  is presented. (i.e. not on ES response).
+  numberOfRecords  [2] IMPLICIT INTEGER OPTIONAL}
+END
+
+
+ESFormat-PersistentQuery
+{Z39-50-extendedService PersistentQuery (2)} DEFINITIONS ::=
+BEGIN
+IMPORTS Query, InternationalString, OtherInformation FROM Z39-50-APDU-1995;
+PersistentQuery ::= CHOICE{
+    esRequest      [1] IMPLICIT SEQUENCE{
+        toKeep    [1] OriginPartToKeep OPTIONAL,
+        notToKeep  [2] OriginPartNotToKeep},
+    taskPackage    [2] IMPLICIT SEQUENCE{
+        originPart  [1] OriginPartToKeep OPTIONAL,
+        targetPart  [2] TargetPart}}
+OriginPartToKeep ::= SEQUENCE{
+  dbNames        [2] IMPLICIT SEQUENCE OF InternationalString OPTIONAL,
+  additionalSearchInfo  [3] OtherInformation OPTIONAL}
+OriginPartNotToKeep ::= CHOICE{
+  package    [1] IMPLICIT InternationalString,
+  query    [2] Query}
+TargetPart ::= Query          
+END
+
+ESFormat-PeriodicQuerySchedule
+{Z39-50-extendedService PeriodicQuerySchedule (3)} DEFINITIONS ::=
+BEGIN
+IMPORTS Query, InternationalString, IntUnit FROM Z39-50-APDU-1995 
+ExportSpecification, Destination FROM ESFormat-ExportSpecification;
+
+PeriodicQuerySchedule ::= CHOICE{
+    esRequest    [1] IMPLICIT SEQUENCE{
+              toKeep    [1] OriginPartToKeep,
+              notToKeep  [2] OriginPartNotToKeep},
+    taskPackage    [2] IMPLICIT SEQUENCE{
+              originPart  [1] OriginPartToKeep,
+              targetPart  [2] TargetPart}}
+
+OriginPartToKeep ::=SEQUENCE{
+  activeFlag          [1] IMPLICIT BOOLEAN,
+  databaseNames        [2] IMPLICIT SEQUENCE OF InternationalString OPTIONAL,
+  resultSetDisposition      [3] IMPLICIT INTEGER{
+                    replace    (1),
+                    append    (2),
+                    createNew  (3)  -- Only if origin and target have agreement about
+                            -- naming convention for the resulting package,
+                             -- and only if no result set is specified.
+                } OPTIONAL,   -- Mandatory on 'create' if result set is specified, in
+                        -- which case it must be 'replace' or 'append.
+  alertDestination        [4] Destination OPTIONAL,
+  exportParameters      [5] CHOICE{
+                    packageName  [1]   IMPLICIT InternationalString,
+                    exportPackage  [2] ExportSpecification} OPTIONAL}
+
+OriginPartNotToKeep ::= SEQUENCE{
+  querySpec           [1] CHOICE{
+                    actualQuery    [1] Query,
+                    packageName  [2] IMPLICIT InternationalString} OPTIONAL,
+                  -- mandatory for 'create'
+  originSuggestedPeriod    [2] Period OPTIONAL,  -- mandatory for 'create'
+  expiration          [3] IMPLICIT GeneralizedTime OPTIONAL,
+  resultSetPackage        [4] IMPLICIT InternationalString OPTIONAL}
+
+TargetPart ::= SEQUENCE{
+  actualQuery        [1] Query,
+  targetStatedPeriod    [2] Period,
+                  -- Target supplies the period, which may be same as origin proposed.
+  expiration        [3] IMPLICIT GeneralizedTime OPTIONAL,
+                  -- Target supplies value for task package. It may be the same as origin
+                  -- proposed or different from (and overrides) origin proposal, but if
+                  -- omitted, there is no expiration.
+  resultSetPackage      [4] IMPLICIT InternationalString OPTIONAL,
+                  -- May be omitted only if exportParameters was supplied. Target
+                  -- supplies same name as origin supplied, if origin did supply a name.
+  lastQueryTime      [5] IMPLICIT GeneralizedTime,
+  lastResultNumber    [6] IMPLICIT INTEGER,
+  numberSinceModify    [7] IMPLICIT INTEGER OPTIONAL}
+
+
+
+
+  Period ::= CHOICE{
+                unit             [1] IMPLICIT IntUnit,
+                 businessDaily     [2] IMPLICIT NULL,
+              continuous       [3] IMPLICIT NULL,
+              other         [4] IMPLICIT InternationalString}
+END
+
+
+ESFormat-ItemOrder
+{Z39-50-extendedService ItemOrder (4)} DEFINITIONS ::=
+BEGIN
+IMPORTS InternationalString FROM Z39-50-APDU-1995;
+ItemOrder ::= CHOICE{
+    esRequest  [1] IMPLICIT SEQUENCE{
+              toKeep    [1] OriginPartToKeep OPTIONAL,
+              notToKeep  [2] OriginPartNotToKeep},
+    taskPackage  [2] IMPLICIT SEQUENCE{
+              originPart  [1] OriginPartToKeep OPTIONAL,
+              targetPart  [2] TargetPart}}
+OriginPartToKeep ::= SEQUENCE{
+  supplDescription    [1] IMPLICIT EXTERNAL OPTIONAL,
+  contact        [2] IMPLICIT SEQUENCE{
+                       name  [1]   IMPLICIT InternationalString OPTIONAL,
+                         phone  [2]   IMPLICIT InternationalString OPTIONAL,
+                       email  [3]   IMPLICIT InternationalString OPTIONAL} OPTIONAL,
+  addlBilling      [3] IMPLICIT SEQUENCE{
+                paymentMethod    [1]   CHOICE{
+                                  billInvoice              [0] IMPLICIT NULL,
+                                    prepay                [1] IMPLICIT NULL,
+                                    depositAccount        [2] IMPLICIT NULL,
+                                    creditCard          [3] IMPLICIT CreditCardInfo,
+                    cardInfoPreviouslySupplied  [4] IMPLICIT NULL,
+                    privateKnown        [5] IMPLICIT NULL,
+                    privateNotKnown      [6] IMPLICIT EXTERNAL},
+                customerReference  [2] IMPLICIT InternationalString OPTIONAL,
+                     customerPONumber  [3] IMPLICIT InternationalString OPTIONAL}
+                                 OPTIONAL}
+CreditCardInfo   ::= SEQUENCE{
+       nameOnCard    [1] IMPLICIT InternationalString,
+      expirationDate    [2] IMPLICIT InternationalString,
+    cardNumber      [3] IMPLICIT InternationalString} 
+
+OriginPartNotToKeep ::= SEQUENCE{ -- Corresponds to 'requestedItem' in service definition.
+      --  Must supply at least one, and may supply both.
+  resultSetItem    [1]   IMPLICIT SEQUENCE{  
+                resultSetId    [1]   IMPLICIT InternationalString,
+                    item      [2]   IMPLICIT INTEGER} OPTIONAL,
+  itemRequest      [2] IMPLICIT EXTERNAL OPTIONAL
+                -- When itemRequest is an ILL-Request APDU, 
+                -- use OID {iso standard 10161 abstract-syntax (2) ill-apdus (1)}
+              }
+
+TargetPart ::= SEQUENCE{
+  itemRequest      [1]  IMPLICIT EXTERNAL OPTIONAL,
+    -- When itemRequest is an ILL-Request APDU, use OID 1.0.10161.2.1 (as above)
+  statusOrErrorReport  [2] IMPLICIT EXTERNAL OPTIONAL,
+    -- When statusOrErrorReport is an ILL Status-Or-Error-Report APDU, use OID  1.0.10161.2.1 (as above)
+  auxiliaryStatus    [3]  IMPLICIT INTEGER{
+                notReceived      (1),
+                loanQueue      (2),
+                forwarded      (3),
+                unfilledCopyright  (4),
+                filledCopyright    (5)} OPTIONAL}
+END
+
+
+
+
+ESFormat-Update0
+{Z39-50-extendedService Update (5)} DEFINITIONS ::=
+BEGIN
+IMPORTS DiagRec, InternationalString FROM Z39-50-APDU-1995; 
+Update ::= CHOICE{
+    esRequest  [1] IMPLICIT SEQUENCE{
+              toKeep    [1] OriginPartToKeep,
+              notToKeep  [2] OriginPartNotToKeep},
+    taskPackage  [2] IMPLICIT SEQUENCE{
+              originPart  [1] OriginPartToKeep,
+              targetPart  [2] TargetPart}}
+
+
+OriginPartToKeep ::= SEQUENCE{
+  action          [1] IMPLICIT INTEGER{
+                   recordInsert    (1),
+                   recordReplace  (2),
+                  recordDelete  (3),
+                  elementUpdate  (4)},
+  databaseName      [2] IMPLICIT InternationalString,
+  schema          [3] IMPLICIT OBJECT IDENTIFIER OPTIONAL,
+  elementSetName      [4] IMPLICIT InternationalString OPTIONAL}
+
+
+OriginPartNotToKeep ::= SuppliedRecords
+
+
+TargetPart ::= SEQUENCE{
+  updateStatus    [1] IMPLICIT INTEGER{
+                  success  (1),
+                  partial  (2),
+                  failure  (3)},
+  globalDiagnostics  [2] IMPLICIT SEQUENCE OF DiagRec OPTIONAL,
+                -- These are non-surrogate diagnostics relating to the task, 
+                -- not to individual records.
+  taskPackageRecords  [3] IMPLICIT SEQUENCE OF TaskPackageRecordStructure
+                -- There should be a TaskPackageRecordStructure for every record
+                -- supplied. The target should create such a structure for every
+                      -- record immediately upon creating the task package to include
+                -- correlation information and status. The record itself would not
+                -- be included until processing for that record is complete.
+            }
+
+-- Auxiliary definitions for Update
+SuppliedRecords ::= SEQUENCE OF SEQUENCE{
+  recordId    [1] CHOICE{
+              number  [1] IMPLICIT INTEGER,
+              string  [2] IMPLICIT InternationalString,
+              opaque  [3]  IMPLICIT OCTET STRING} OPTIONAL,
+  supplementalId  [2] CHOICE{
+              timeStamp    [1] IMPLICIT GeneralizedTime,
+              versionNumber  [2] IMPLICIT InternationalString,
+              previousVersion  [3] IMPLICIT EXTERNAL} OPTIONAL,
+  correlationInfo  [3] IMPLICIT CorrelationInfo OPTIONAL,
+  record      [4] IMPLICIT EXTERNAL}
+
+CorrelationInfo ::= SEQUENCE{
+          -- origin may supply one or both for any record:
+  note  [1] IMPLICIT InternationalString OPTIONAL,
+  id    [2] IMPLICIT INTEGER OPTIONAL}
+
+TaskPackageRecordStructure ::= SEQUENCE{
+    recordOrSurDiag  [1] CHOICE {
+                record    [1] IMPLICIT EXTERNAL,
+                        -- Choose 'record' if recordStatus is 'success', and
+                        -- elementSetName was supplied.
+                diagnostic  [2] DiagRec
+                        -- Choose 'diagnostic', if RecordStatus is failure.
+                                } OPTIONAL,
+                -- The parameter recordOrSurDiag will thus be omitted only if
+                -- 'elementSetName' was omitted and recordStatus is
+                -- 'success'; or if record status is 'queued' or in 'process'.
+    correlationInfo    [2] IMPLICIT CorrelationInfo OPTIONAL,
+                -- This should be included if it was supplied by the origin.
+    recordStatus      [3] IMPLICIT INTEGER{
+                  success    (1),
+                  queued    (2),
+                  inProcess  (3),
+                  failure    (4)}}
+END
+
+
+ESFormat-ExportSpecification
+{Z39-50-extendedService ExportSpecification (6)} DEFINITIONS ::=
+BEGIN
+EXPORTS ExportSpecification, Destination; IMPORTS CompSpec, InternationalString FROM Z39-50-APDU-1995;
+ExportSpecification ::= CHOICE{
+    esRequest    [1] IMPLICIT SEQUENCE{
+        toKeep    [1] OriginPartToKeep,
+        notToKeep  [2] IMPLICIT NULL},
+    taskPackage    [2] IMPLICIT SEQUENCE{
+        originPart  [1] OriginPartToKeep,
+        targetPart  [2] IMPLICIT NULL}}
+OriginPartToKeep ::= SEQUENCE{
+  composition        [1] IMPLICIT CompSpec,
+  exportDestination    [2] Destination}
+
+  Destination ::= CHOICE{
+  phoneNumber    [1]    IMPLICIT InternationalString,
+  faxNumber      [2]   IMPLICIT InternationalString,
+  x400address      [3]   IMPLICIT InternationalString,
+  emailAddress    [4]   IMPLICIT InternationalString,
+  pagerNumber    [5]   IMPLICIT InternationalString,
+  ftpAddress      [6]   IMPLICIT InternationalString,
+  ftamAddress    [7]   IMPLICIT InternationalString,
+  printerAddress    [8]   IMPLICIT InternationalString,
+  other        [100]  IMPLICIT SEQUENCE{
+                  vehicle      [1]  IMPLICIT InternationalString  OPTIONAL,
+                  destination    [2] IMPLICIT InternationalString}}
+END
+
+
+
+
+ESFormat-ExportInvocation
+{Z39-50-extendedService ExportInvocation (7)} DEFINITIONS ::=
+BEGIN
+IMPORTS InternationalString, IntUnit FROM Z39-50-APDU-1995 
+ExportSpecification FROM ESFormat-ExportSpecification;
+ExportInvocation ::= CHOICE{
+    esRequest    [1] IMPLICIT SEQUENCE{
+        toKeep    [1] OriginPartToKeep,
+        notToKeep  [2] OriginPartNotToKeep},
+    taskPackage    [2] IMPLICIT SEQUENCE{
+        originPart  [1] OriginPartToKeep,
+        targetPart  [2] TargetPart OPTIONAL}}
+
+OriginPartToKeep ::= SEQUENCE{
+  exportSpec    [1] CHOICE{
+              packageName    [1] IMPLICIT InternationalString,
+              packageSpec    [2] ExportSpecification},
+  numberOfCopies  [2] IMPLICIT INTEGER}
+
+
+
+
+
+OriginPartNotToKeep  ::= SEQUENCE{
+  resultSetId      [1] IMPLICIT InternationalString,
+  records        [2] CHOICE{
+                all    [1] IMPLICIT NULL,
+                ranges  [2]   IMPLICIT SEQUENCE OF SEQUENCE{
+                        start  [1] IMPLICIT INTEGER,
+                        count  [2] IMPLICIT INTEGER OPTIONAL
+                          -- Count may be omitted only on last range, to indicate
+                          -- "all remaining records beginning with 'start'."
+                    }}}
+
+TargetPart   ::= SEQUENCE{
+    estimatedQuantity    [1] IMPLICIT IntUnit OPTIONAL,
+    quantitySoFar      [2] IMPLICIT IntUnit OPTIONAL,
+    estimatedCost      [3] IMPLICIT IntUnit OPTIONAL,
+    costSoFar        [4] IMPLICIT IntUnit OPTIONAL}
+END
+
+
+
+UserInfoFormat-searchResult-1
+{Z39-50-userInfoFormat searchResult-1 (1)} DEFINITIONS ::=
+BEGIN
+IMPORTS DatabaseName, Term, Query, IntUnit, InternationalString FROM Z39-50-APDU-1995;
+SearchInfoReport ::= SEQUENCE OF SEQUENCE{
+  subqueryId      [1] IMPLICIT InternationalString OPTIONAL, 
+                           -- shorthand identifier of subquery
+  fullQuery        [2] IMPLICIT BOOLEAN,     -- 'true' means this is the full query; 'false',
+                          -- a sub-query 
+  subqueryExpression    [3] QueryExpression OPTIONAL,  -- A subquery of the query as
+                          -- submitted. May be whole query;
+                          -- if so, "fullQuery" should be 'true'.
+  subqueryInterpretation  [4] QueryExpression OPTIONAL,  -- how target interpreted subquery
+  subqueryRecommendation  [5] QueryExpression OPTIONAL,  -- target-recommended alternative
+  subqueryCount      [6] IMPLICIT INTEGER OPTIONAL,  -- Number of records for this
+                          -- subQuery, across all of the specified
+                          -- databases. (If during search, via resource
+                           -- control, number of records so far).
+  subqueryWeight     [7] IMPLICIT IntUnit OPTIONAL,  -- relative weight of this subquery
+  resultsByDB          [8] IMPLICIT ResultsByDB OPTIONAL}
+
+ResultsByDB ::= SEQUENCE OF SEQUENCE{
+  databases      [1] CHOICE{
+            all     [1] IMPLICIT NULL,
+                  -- applies across all of the databases in Search PDU
+            list    [2]  IMPLICIT SEQUENCE OF DatabaseName
+                  -- applies across all databases in this list
+              },
+  count        [2] IMPLICIT INTEGER OPTIONAL,
+            -- Number of records for query component (and, as above, if during search,
+             -- via resource control, number of records so far).
+  resultSetName    [3] IMPLICIT InternationalString OPTIONAL
+                        -- Target-assigned result set by which subQuery is available. Should not
+             -- be provided unless processing for this query component is concluded (i.e.,
+            -- when this report comes during search, via resource control, as opposed
+            -- to after search, via additionalSearchInfo).
+              }
+
+QueryExpression ::=  CHOICE {
+                term   [1] IMPLICIT SEQUENCE{
+              queryTerm  [1]  Term,
+              termComment            [2] IMPLICIT InternationalString OPTIONAL},
+           query  [2] Query}
+END
+
+
+
+ElementSpecificationFormat-eSpec-1
+{Z39-50-elementSpec eSpec-1 (1)} DEFINITIONS ::=
+BEGIN
+IMPORTS Variant FROM RecordSyntax-generic
+StringOrNumeric, InternationalString FROM Z39-50-APDU-1995;
+--
+Espec-1 ::= SEQUENCE{
+  elementSetNames    [1] IMPLICIT SEQUENCE OF InternationalString OPTIONAL,
+                  -- Origin may include one or more element set names, each
+                  -- specifying a set of elements. Each of the elements is to be
+                  -- treated as an elementRequest in the form of simpleElement,
+                  -- where occurrence is 1. 
+  defaultVariantSetId    [2] IMPLICIT OBJECT IDENTIFIER OPTIONAL,
+                  -- If supplied, applies whenever variantRequest 
+                  -- does not include variantSetId. 
+  defaultVariantRequest  [3] IMPLICIT Variant OPTIONAL,
+                  -- If supplied, then for each simple elementRequest that does not
+                   -- include a variantRequest, the defaultVariantRequest applies.
+                  -- (defaultVariantRequest does not apply to a compositeRequest.)
+  defaultTagType      [4] IMPLICIT INTEGER OPTIONAL,
+                  -- If supplied, applies whenever 'tagType' (within 'tag' within TagPath) 
+                  -- is omitted.
+  elements        [5] IMPLICIT SEQUENCE OF ElementRequest OPTIONAL}
+--
+
+ElementRequest::= CHOICE{
+  simpleElement    [1]   IMPLICIT SimpleElement,
+  compositeElement  [2] IMPLICIT SEQUENCE{
+            elementList    [1] CHOICE{
+                  primitives    [1]   IMPLICIT SEQUENCE OF InternationalString,
+                              -- Origin may specify one or more element
+                              -- set names, each identifying a set of elements,
+                              -- and the composite element is the union.
+                  specs      [2] IMPLICIT SEQUENCE OF SimpleElement},
+
+            deliveryTag    [2] IMPLICIT TagPath,
+                          -- DeliveryTag tagPath for compositeElement may not
+                          -- include wildThing or wildPath.
+            variantRequest  [3] IMPLICIT Variant OPTIONAL}}
+
+SimpleElement ::= SEQUENCE{
+      path        [1] IMPLICIT TagPath,
+      variantRequest  [2] IMPLICIT Variant OPTIONAL}
+  
+
+TagPath ::= SEQUENCE OF CHOICE{  
+  specificTag  [1] IMPLICIT SEQUENCE{
+            tagType  [1] IMPLICIT INTEGER OPTIONAL,
+                      -- If omitted, then 'defaultTagType' (above) applies, if supplied, and
+                      -- if not supplied, then default listed in schema applies.
+            tagValue  [2] StringOrNumeric,
+             occurrence  [3] Occurrences OPTIONAL 
+                      -- default is "first occurrence"
+                  },
+  wildThing  [2] Occurrences,
+              -- Get Nth "thing" at this level, regardless of tag, for each N specified by
+            -- "Occurrences" (which may be 'all' meaning match every element at this level).
+            -- E.g., if "Occurrences" is 3, get third element regardless of its tag or the tag of
+            -- the first two elements.
+  wildPath  [3] IMPLICIT NULL
+              -- Match any tag, at this level or below, that is on a path for which next tag in this 
+              -- TagPath sequence occurs. WildPath may not be last member of the TagPath
+            -- sequence.
+                      }
+--
+
+Occurrences ::= CHOICE{
+  all    [1] IMPLICIT NULL,
+  last    [2] IMPLICIT NULL,
+  values  [3] IMPLICIT SEQUENCE{
+          start    [1] IMPLICIT INTEGER,
+                  -- if 'start' alone is included, then single occurrence is requested
+          howMany  [2] IMPLICIT INTEGER OPTIONAL
+                  -- For example, if 'start' is 5 and 'howMany' is 6, then request is for
+                  -- "occurrences 5 through 10."
+                  }}
+END
+