geonetwork-ui 2.3.0-dev.376e0e90 → 2.3.0-dev.f736344f

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/esm2022/libs/api/metadata-converter/src/index.mjs +5 -5
  2. package/esm2022/libs/api/metadata-converter/src/lib/gn4/atomic-operations.mjs +3 -3
  3. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +3 -3
  4. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.mjs +52 -0
  5. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.mjs +14 -0
  6. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/codelists/role.mapper.mjs +48 -0
  7. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/codelists/status.mapper.mjs +18 -0
  8. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/codelists/update-frequency.mapper.mjs +64 -0
  9. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/converter.mjs +130 -0
  10. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +62 -58
  11. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +58 -75
  12. package/esm2022/libs/api/metadata-converter/src/lib/metadata-base.mapper.mjs +14 -0
  13. package/esm2022/libs/api/metadata-converter/src/lib/xml-utils.mjs +14 -76
  14. package/esm2022/libs/api/repository/src/lib/gn4/gn4-repository.mjs +4 -4
  15. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  16. package/esm2022/libs/feature/editor/src/lib/services/editor.service.mjs +8 -8
  17. package/fesm2022/geonetwork-ui.mjs +245 -822
  18. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  19. package/libs/api/metadata-converter/src/index.d.ts +4 -4
  20. package/libs/api/metadata-converter/src/index.d.ts.map +1 -1
  21. package/libs/api/metadata-converter/src/lib/gn4/{gn4.converter.d.ts → gn4.metadata.mapper.d.ts} +5 -5
  22. package/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.d.ts.map +1 -0
  23. package/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.d.ts.map +1 -0
  24. package/libs/api/metadata-converter/src/lib/iso19139/codelists/role.mapper.d.ts.map +1 -0
  25. package/libs/api/metadata-converter/src/lib/iso19139/codelists/status.mapper.d.ts.map +1 -0
  26. package/libs/api/metadata-converter/src/lib/iso19139/codelists/update-frequency.mapper.d.ts.map +1 -0
  27. package/libs/api/metadata-converter/src/lib/iso19139/converter.d.ts +4 -0
  28. package/libs/api/metadata-converter/src/lib/iso19139/converter.d.ts.map +1 -0
  29. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts +6 -34
  30. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
  31. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts +3 -39
  32. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  33. package/libs/api/metadata-converter/src/lib/{base.converter.d.ts → metadata-base.mapper.d.ts} +3 -3
  34. package/libs/api/metadata-converter/src/lib/metadata-base.mapper.d.ts.map +1 -0
  35. package/libs/api/metadata-converter/src/lib/xml-utils.d.ts +1 -14
  36. package/libs/api/metadata-converter/src/lib/xml-utils.d.ts.map +1 -1
  37. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts +2 -2
  38. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts.map +1 -1
  39. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +4 -6
  40. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  41. package/libs/feature/editor/src/lib/services/editor.service.d.ts.map +1 -1
  42. package/package.json +1 -1
  43. package/src/libs/api/metadata-converter/src/index.ts +4 -4
  44. package/src/libs/api/metadata-converter/src/lib/fixtures/generic.records.ts +5 -32
  45. package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.ts +4 -11
  46. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +7 -33
  47. package/src/libs/api/metadata-converter/src/lib/gn4/atomic-operations.ts +2 -2
  48. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +2 -2
  49. package/src/libs/api/metadata-converter/src/lib/gn4/{gn4.converter.ts → gn4.metadata.mapper.ts} +2 -2
  50. package/src/libs/api/metadata-converter/src/lib/iso19139/converter.ts +196 -0
  51. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +82 -121
  52. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +95 -175
  53. package/src/libs/api/metadata-converter/src/lib/{base.converter.ts → metadata-base.mapper.ts} +2 -2
  54. package/src/libs/api/metadata-converter/src/lib/xml-utils.ts +16 -84
  55. package/src/libs/api/repository/src/lib/gn4/gn4-repository.ts +2 -2
  56. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +4 -9
  57. package/src/libs/feature/editor/src/lib/services/editor.service.ts +16 -27
  58. package/esm2022/libs/api/metadata-converter/src/lib/base.converter.mjs +0 -14
  59. package/esm2022/libs/api/metadata-converter/src/lib/find-converter.mjs +0 -15
  60. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.converter.mjs +0 -52
  61. package/esm2022/libs/api/metadata-converter/src/lib/gn4/index.mjs +0 -4
  62. package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/index.mjs +0 -2
  63. package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.mjs +0 -123
  64. package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.mjs +0 -116
  65. package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.mjs +0 -138
  66. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/index.mjs +0 -2
  67. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.mjs +0 -242
  68. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/individual-name.mjs +0 -18
  69. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/keyword.mapper.mjs +0 -14
  70. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/role.mapper.mjs +0 -48
  71. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/status.mapper.mjs +0 -18
  72. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/update-frequency.mapper.mjs +0 -64
  73. package/libs/api/metadata-converter/src/lib/base.converter.d.ts.map +0 -1
  74. package/libs/api/metadata-converter/src/lib/find-converter.d.ts +0 -3
  75. package/libs/api/metadata-converter/src/lib/find-converter.d.ts.map +0 -1
  76. package/libs/api/metadata-converter/src/lib/gn4/gn4.converter.d.ts.map +0 -1
  77. package/libs/api/metadata-converter/src/lib/gn4/index.d.ts +0 -4
  78. package/libs/api/metadata-converter/src/lib/gn4/index.d.ts.map +0 -1
  79. package/libs/api/metadata-converter/src/lib/iso19115-3/index.d.ts +0 -2
  80. package/libs/api/metadata-converter/src/lib/iso19115-3/index.d.ts.map +0 -1
  81. package/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.d.ts +0 -9
  82. package/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.d.ts.map +0 -1
  83. package/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.d.ts +0 -20
  84. package/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.d.ts.map +0 -1
  85. package/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.d.ts +0 -21
  86. package/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.d.ts.map +0 -1
  87. package/libs/api/metadata-converter/src/lib/iso19139/index.d.ts +0 -2
  88. package/libs/api/metadata-converter/src/lib/iso19139/index.d.ts.map +0 -1
  89. package/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.d.ts +0 -11
  90. package/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.d.ts.map +0 -1
  91. package/libs/api/metadata-converter/src/lib/iso19139/utils/individual-name.d.ts +0 -8
  92. package/libs/api/metadata-converter/src/lib/iso19139/utils/individual-name.d.ts.map +0 -1
  93. package/libs/api/metadata-converter/src/lib/iso19139/utils/keyword.mapper.d.ts.map +0 -1
  94. package/libs/api/metadata-converter/src/lib/iso19139/utils/role.mapper.d.ts.map +0 -1
  95. package/libs/api/metadata-converter/src/lib/iso19139/utils/status.mapper.d.ts.map +0 -1
  96. package/libs/api/metadata-converter/src/lib/iso19139/utils/update-frequency.mapper.d.ts.map +0 -1
  97. package/src/libs/api/metadata-converter/src/lib/find-converter.ts +0 -16
  98. package/src/libs/api/metadata-converter/src/lib/fixtures/metawal.records.ts +0 -580
  99. package/src/libs/api/metadata-converter/src/lib/gn4/index.ts +0 -3
  100. package/src/libs/api/metadata-converter/src/lib/iso19115-3/index.ts +0 -1
  101. package/src/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.ts +0 -176
  102. package/src/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.ts +0 -329
  103. package/src/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.ts +0 -513
  104. package/src/libs/api/metadata-converter/src/lib/iso19139/index.ts +0 -1
  105. package/src/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.ts +0 -327
  106. package/src/libs/api/metadata-converter/src/lib/iso19139/utils/individual-name.ts +0 -20
  107. /package/libs/api/metadata-converter/src/lib/iso19139/{utils → codelists}/keyword.mapper.d.ts +0 -0
  108. /package/libs/api/metadata-converter/src/lib/iso19139/{utils → codelists}/role.mapper.d.ts +0 -0
  109. /package/libs/api/metadata-converter/src/lib/iso19139/{utils → codelists}/status.mapper.d.ts +0 -0
  110. /package/libs/api/metadata-converter/src/lib/iso19139/{utils → codelists}/update-frequency.mapper.d.ts +0 -0
  111. /package/src/libs/api/metadata-converter/src/lib/iso19139/{utils → codelists}/keyword.mapper.ts +0 -0
  112. /package/src/libs/api/metadata-converter/src/lib/iso19139/{utils → codelists}/role.mapper.ts +0 -0
  113. /package/src/libs/api/metadata-converter/src/lib/iso19139/{utils → codelists}/status.mapper.ts +0 -0
  114. /package/src/libs/api/metadata-converter/src/lib/iso19139/{utils → codelists}/update-frequency.mapper.ts +0 -0
@@ -0,0 +1,130 @@
1
+ import { createDocument, createElement, getRootElement, parseXmlString, xmlToString, } from '../xml-utils';
2
+ import { writeAbstract, writeContacts, writeDatasetCreated, writeDatasetUpdated, writeDistributions, writeGraphicOverviews, writeKeywords, writeKind, writeLegalConstraints, writeLicenses, writeLineage, writeOnlineResources, writeOtherConstraints, writeOwnerOrganization, writeRecordUpdated, writeSecurityConstraints, writeSpatialRepresentation, writeStatus, writeTopics, writeTitle, writeUniqueIdentifier, writeUpdateFrequency, } from './write-parts';
3
+ import { readAbstract, readContacts, readDatasetCreated, readDatasetUpdated, readDistributions, readIsoTopics, readKeywords, readKind, readLegalConstraints, readLicenses, readLineage, readOnlineResources, readOtherConstraints, readOverviews, readOwnerOrganization, readRecordUpdated, readRecordPublished, readSecurityConstraints, readSpatialExtents, readSpatialRepresentation, readStatus, readTemporalExtents, readTitle, readUniqueIdentifier, readUpdateFrequency, } from './read-parts';
4
+ import { isEqual } from '../convert-utils';
5
+ export function toModel(xml) {
6
+ const doc = parseXmlString(xml);
7
+ const rootEl = getRootElement(doc);
8
+ const uniqueIdentifier = readUniqueIdentifier(rootEl);
9
+ const kind = readKind(rootEl);
10
+ const ownerOrganization = readOwnerOrganization(rootEl);
11
+ const title = readTitle(rootEl);
12
+ const abstract = readAbstract(rootEl);
13
+ const contacts = readContacts(rootEl);
14
+ const recordUpdated = readRecordUpdated(rootEl);
15
+ const recordCreated = recordUpdated;
16
+ const recordPublished = readRecordPublished(rootEl);
17
+ const keywords = readKeywords(rootEl);
18
+ const topics = readIsoTopics(rootEl);
19
+ const legalConstraints = readLegalConstraints(rootEl);
20
+ const otherConstraints = readOtherConstraints(rootEl);
21
+ const securityConstraints = readSecurityConstraints(rootEl);
22
+ const licenses = readLicenses(rootEl);
23
+ const overviews = readOverviews(rootEl);
24
+ if (kind === 'dataset') {
25
+ const status = readStatus(rootEl);
26
+ const datasetCreated = readDatasetCreated(rootEl);
27
+ const datasetUpdated = readDatasetUpdated(rootEl);
28
+ const spatialRepresentation = readSpatialRepresentation(rootEl);
29
+ const spatialExtents = readSpatialExtents(rootEl);
30
+ const temporalExtents = readTemporalExtents(rootEl);
31
+ const lineage = readLineage(rootEl);
32
+ const distributions = readDistributions(rootEl);
33
+ const updateFrequency = readUpdateFrequency(rootEl);
34
+ return {
35
+ uniqueIdentifier,
36
+ kind,
37
+ languages: [],
38
+ recordCreated,
39
+ recordUpdated,
40
+ recordPublished,
41
+ status,
42
+ title,
43
+ abstract,
44
+ ownerOrganization,
45
+ contacts,
46
+ contactsForResource: [],
47
+ keywords,
48
+ topics,
49
+ licenses,
50
+ legalConstraints,
51
+ securityConstraints,
52
+ otherConstraints,
53
+ ...(datasetCreated && { datasetCreated }),
54
+ ...(datasetUpdated && { datasetUpdated }),
55
+ lineage,
56
+ ...(spatialRepresentation && { spatialRepresentation }),
57
+ overviews,
58
+ spatialExtents,
59
+ temporalExtents,
60
+ distributions,
61
+ updateFrequency,
62
+ };
63
+ }
64
+ else {
65
+ const onlineResources = readOnlineResources(rootEl);
66
+ return {
67
+ uniqueIdentifier,
68
+ kind,
69
+ languages: [],
70
+ recordCreated,
71
+ recordUpdated,
72
+ recordPublished,
73
+ title,
74
+ abstract,
75
+ ownerOrganization,
76
+ contacts,
77
+ keywords,
78
+ topics,
79
+ licenses,
80
+ legalConstraints,
81
+ securityConstraints,
82
+ otherConstraints,
83
+ overviews,
84
+ onlineResources,
85
+ };
86
+ }
87
+ }
88
+ export function toXml(record, originalXml) {
89
+ const originalDoc = originalXml ? parseXmlString(originalXml) : null;
90
+ const originalRecord = originalXml ? toModel(originalXml) : null;
91
+ const rootEl = originalDoc
92
+ ? getRootElement(originalDoc)
93
+ : createElement('gmd:MD_Metadata')();
94
+ function fieldChanged(name) {
95
+ return originalRecord !== null
96
+ ? !isEqual(record[name], originalRecord[name])
97
+ : true;
98
+ }
99
+ writeUniqueIdentifier(record, rootEl);
100
+ writeKind(record, rootEl);
101
+ fieldChanged('ownerOrganization') && writeOwnerOrganization(record, rootEl);
102
+ fieldChanged('recordUpdated') && writeRecordUpdated(record, rootEl);
103
+ writeTitle(record, rootEl);
104
+ writeAbstract(record, rootEl);
105
+ fieldChanged('contacts') && writeContacts(record, rootEl);
106
+ fieldChanged('keywords') && writeKeywords(record, rootEl);
107
+ fieldChanged('topics') && writeTopics(record, rootEl);
108
+ fieldChanged('legalConstraints') && writeLegalConstraints(record, rootEl);
109
+ fieldChanged('securityConstraints') &&
110
+ writeSecurityConstraints(record, rootEl);
111
+ fieldChanged('licenses') && writeLicenses(record, rootEl);
112
+ fieldChanged('otherConstraints') && writeOtherConstraints(record, rootEl);
113
+ if (record.kind === 'dataset') {
114
+ writeStatus(record, rootEl);
115
+ fieldChanged('updateFrequency') && writeUpdateFrequency(record, rootEl);
116
+ fieldChanged('datasetCreated') && writeDatasetCreated(record, rootEl);
117
+ fieldChanged('datasetUpdated') && writeDatasetUpdated(record, rootEl);
118
+ fieldChanged('spatialRepresentation') &&
119
+ writeSpatialRepresentation(record, rootEl);
120
+ fieldChanged('overviews') && writeGraphicOverviews(record, rootEl);
121
+ fieldChanged('distributions') && writeDistributions(record, rootEl);
122
+ writeLineage(record, rootEl);
123
+ }
124
+ else {
125
+ fieldChanged('onlineResources') && writeOnlineResources(record, rootEl);
126
+ }
127
+ const newDocument = createDocument(rootEl);
128
+ return xmlToString(newDocument);
129
+ }
130
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hcGkvbWV0YWRhdGEtY29udmVydGVyL3NyYy9saWIvaXNvMTkxMzkvY29udmVydGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUtBLE9BQU8sRUFDTCxjQUFjLEVBQ2QsYUFBYSxFQUNiLGNBQWMsRUFDZCxjQUFjLEVBQ2QsV0FBVyxHQUNaLE1BQU0sY0FBYyxDQUFBO0FBQ3JCLE9BQU8sRUFDTCxhQUFhLEVBQ2IsYUFBYSxFQUNiLG1CQUFtQixFQUNuQixtQkFBbUIsRUFDbkIsa0JBQWtCLEVBQ2xCLHFCQUFxQixFQUNyQixhQUFhLEVBQ2IsU0FBUyxFQUNULHFCQUFxQixFQUNyQixhQUFhLEVBQ2IsWUFBWSxFQUNaLG9CQUFvQixFQUNwQixxQkFBcUIsRUFDckIsc0JBQXNCLEVBQ3RCLGtCQUFrQixFQUNsQix3QkFBd0IsRUFDeEIsMEJBQTBCLEVBQzFCLFdBQVcsRUFDWCxXQUFXLEVBQ1gsVUFBVSxFQUNWLHFCQUFxQixFQUNyQixvQkFBb0IsR0FDckIsTUFBTSxlQUFlLENBQUE7QUFDdEIsT0FBTyxFQUNMLFlBQVksRUFDWixZQUFZLEVBQ1osa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQixpQkFBaUIsRUFDakIsYUFBYSxFQUNiLFlBQVksRUFDWixRQUFRLEVBQ1Isb0JBQW9CLEVBQ3BCLFlBQVksRUFDWixXQUFXLEVBQ1gsbUJBQW1CLEVBQ25CLG9CQUFvQixFQUNwQixhQUFhLEVBQ2IscUJBQXFCLEVBQ3JCLGlCQUFpQixFQUNqQixtQkFBbUIsRUFDbkIsdUJBQXVCLEVBQ3ZCLGtCQUFrQixFQUNsQix5QkFBeUIsRUFDekIsVUFBVSxFQUNWLG1CQUFtQixFQUNuQixTQUFTLEVBQ1Qsb0JBQW9CLEVBQ3BCLG1CQUFtQixHQUNwQixNQUFNLGNBQWMsQ0FBQTtBQUNyQixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sa0JB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SUFBSSxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUE7UUFDckUsWUFBWSxDQUFDLHVCQUF1QixDQUFDO1lBQ25DLDBCQUEwQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQTtRQUM1QyxZQUFZLENBQUMsV0FBVyxDQUFDLElBQUkscUJBQXFCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBQ2xFLFlBQVksQ0FBQyxlQUFlLENBQUMsSUFBSSxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUE7UUFDbkUsWUFBWSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQTtLQUM3QjtTQUFNO1FBQ0wsWUFBWSxDQUFDLGlCQUFpQixDQUFDLElBQUksb0JBQW9CLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFBO0tBQ3hFO0lBRUQsTUFBTSxXQUFXLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQzFDLE9BQU8sV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFBO0FBQ2pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDYXRhbG9nUmVjb3JkLFxuICBEYXRhc2V0UmVjb3JkLFxuICBTZXJ2aWNlUmVjb3JkLFxufSBmcm9tICcuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9kb21haW4vc3JjL2xpYi9tb2RlbC9yZWNvcmQnXG5pbXBvcnQge1xuICBjcmVhdGVEb2N1bWVudCxcbiAgY3JlYXRlRWxlbWVudCxcbiAgZ2V0Um9vdEVsZW1lbnQsXG4gIHBhcnNlWG1sU3RyaW5nLFxuICB4bWxUb1N0cmluZyxcbn0gZnJvbSAnLi4veG1sLXV0aWxzJ1xuaW1wb3J0IHtcbiAgd3JpdGVBYnN0cmFjdCxcbiAgd3JpdGVDb250YWN0cyxcbiAgd3JpdGVEYXRhc2V0Q3JlYXRlZCxcbiAgd3JpdGVEYXRhc2V0VXBkYXRlZCxcbiAgd3JpdGVEaXN0cmlidXRpb25zLFxuICB3cml0ZUdyYXBoaWNPdmVydmlld3MsXG4gIHdyaXRlS2V5d29yZHMsXG4gIHdyaXRlS2luZCxcbiAgd3JpdGVMZWdhbENvbnN0cmFpbnRzLFxuICB3cml0ZUxpY2Vuc2VzLFxuICB3cml0ZUxpbmVhZ2UsXG4gIHdyaXRlT25saW5lUmVzb3VyY2VzLFxuICB3cml0ZU90aGVyQ29uc3RyYWludHMsXG4gIHdyaXRlT3duZXJPcmdhbml6YXRpb24sXG4gIHdyaXRlUmVjb3JkVXBkYXRlZCxcbiAgd3JpdGVTZWN1cml0eUNvbnN0cmFpbnRzLFxuICB3cml0ZVNwYXRpYWxSZXByZXNlbnRhdGlvbixcbiAgd3JpdGVTdGF0dXMsXG4gIHdyaXRlVG9waWNzLFxuICB3cml0ZVRpdGxlLFxuICB3cml0ZVVuaXF1ZUlkZW50aWZpZXIsXG4gIHdyaXRlVXBkYXRlRnJlcXVlbmN5LFxufSBmcm9tICcuL3dyaXRlLXBhcnRzJ1xuaW1wb3J0IHtcbiAgcmVhZEFic3RyYWN0LFxuICByZWFkQ29udGFjdHMsXG4gIHJlYWREYXRhc2V0Q3JlYXRlZCxcbiAgcmVhZERhdGFzZXRVcGRhdGVkLFxuICByZWFkRGlzdHJpYnV0aW9ucyxcbiAgcmVhZElzb1RvcGljcyxcbiAgcmVhZEtleXdvcmRzLFxuICByZWFkS2luZCxcbiAgcmVhZExlZ2FsQ29uc3RyYWludHMsXG4gIHJlYWRMaWNlbnNlcyxcbiAgcmVhZExpbmVhZ2UsXG4gIHJlYWRPbmxpbmVSZXNvdXJjZXMsXG4gIHJlYWRPdGhlckNvbnN0cmFpbnRzLFxuICByZWFkT3ZlcnZpZXdzLFxuICByZWFkT3duZXJPcmdhbml6YXRpb24sXG4gIHJlYWRSZWNvcmRVcGRhdGVkLFxuICByZWFkUmVjb3JkUHVibGlzaGVkLFxuICByZWFkU2VjdXJpdHlDb25zdHJhaW50cyxcbiAgcmVhZFNwYXRpYWxFeHRlbnRzLFxuICByZWFkU3BhdGlhbFJlcHJlc2VudGF0aW9uLFxuICByZWFkU3RhdHVzLFxuICByZWFkVGVtcG9yYWxFeHRlbnRzLFxuICByZWFkVGl0bGUsXG4gIHJlYWRVbmlxdWVJZGVudGlmaWVyLFxuICByZWFkVXBkYXRlRnJlcXVlbmN5LFxufSBmcm9tICcuL3JlYWQtcGFydHMnXG5pbXBvcnQgeyBpc0VxdWFsIH0gZnJvbSAnLi4vY29udmVydC11dGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIHRvTW9kZWwoeG1sOiBzdHJpbmcpOiBDYXRhbG9nUmVjb3JkIHtcbiAgY29uc3QgZG9jID0gcGFyc2VYbWxTdHJpbmcoeG1sKVxuICBjb25zdCByb290RWwgPSBnZXRSb290RWxlbWVudChkb2MpXG5cbiAgY29uc3QgdW5pcXVlSWRlbnRpZmllciA9IHJlYWRVbmlxdWVJZGVudGlmaWVyKHJvb3RFbClcbiAgY29uc3Qga2luZCA9IHJlYWRLaW5kKHJvb3RFbClcbiAgY29uc3Qgb3duZXJPcmdhbml6YXRpb24gPSByZWFkT3duZXJPcmdhbml6YXRpb24ocm9vdEVsKVxuICBjb25zdCB0aXRsZSA9IHJlYWRUaXRsZShyb290RWwpXG4gIGNvbnN0IGFic3RyYWN0ID0gcmVhZEFic3RyYWN0KHJvb3RFbClcbiAgY29uc3QgY29udGFjdHMgPSByZWFkQ29udGFjdHMocm9vdEVsKVxuICBjb25zdCByZWNvcmRVcGRhdGVkID0gcmVhZFJlY29yZFVwZGF0ZWQocm9vdEVsKVxuICBjb25zdCByZWNvcmRDcmVhdGVkID0gcmVjb3JkVXBkYXRlZFxuICBjb25zdCByZWNvcmRQdWJsaXNoZWQgPSByZWFkUmVjb3JkUHVibGlzaGVkKHJvb3RFbClcbiAgY29uc3Qga2V5d29yZHMgPSByZWFkS2V5d29yZHMocm9vdEVsKVxuICBjb25zdCB0b3BpY3MgPSByZWFkSXNvVG9waWNzKHJvb3RFbClcbiAgY29uc3QgbGVnYWxDb25zdHJhaW50cyA9IHJlYWRMZWdhbENvbnN0cmFpbnRzKHJvb3RFbClcbiAgY29uc3Qgb3RoZXJDb25zdHJhaW50cyA9IHJlYWRPdGhlckNvbnN0cmFpbnRzKHJvb3RFbClcbiAgY29uc3Qgc2VjdXJpdHlDb25zdHJhaW50cyA9IHJlYWRTZWN1cml0eUNvbnN0cmFpbnRzKHJvb3RFbClcbiAgY29uc3QgbGljZW5zZXMgPSByZWFkTGljZW5zZXMocm9vdEVsKVxuICBjb25zdCBvdmVydmlld3MgPSByZWFkT3ZlcnZpZXdzKHJvb3RFbClcblxuICBpZiAoa2luZCA9PT0gJ2RhdGFzZXQnKSB7XG4gICAgY29uc3Qgc3RhdHVzID0gcmVhZFN0YXR1cyhyb290RWwpXG4gICAgY29uc3QgZGF0YXNldENyZWF0ZWQgPSByZWFkRGF0YXNldENyZWF0ZWQocm9vdEVsKVxuICAgIGNvbnN0IGRhdGFzZXRVcGRhdGVkID0gcmVhZERhdGFzZXRVcGRhdGVkKHJvb3RFbClcbiAgICBjb25zdCBzcGF0aWFsUmVwcmVzZW50YXRpb24gPSByZWFkU3BhdGlhbFJlcHJlc2VudGF0aW9uKHJvb3RFbClcbiAgICBjb25zdCBzcGF0aWFsRXh0ZW50cyA9IHJlYWRTcGF0aWFsRXh0ZW50cyhyb290RWwpXG4gICAgY29uc3QgdGVtcG9yYWxFeHRlbnRzID0gcmVhZFRlbXBvcmFsRXh0ZW50cyhyb290RWwpXG4gICAgY29uc3QgbGluZWFnZSA9IHJlYWRMaW5lYWdlKHJvb3RFbClcbiAgICBjb25zdCBkaXN0cmlidXRpb25zID0gcmVhZERpc3RyaWJ1dGlvbnMocm9vdEVsKVxuICAgIGNvbnN0IHVwZGF0ZUZyZXF1ZW5jeSA9IHJlYWRVcGRhdGVGcmVxdWVuY3kocm9vdEVsKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHVuaXF1ZUlkZW50aWZpZXIsXG4gICAgICBraW5kLFxuICAgICAgbGFuZ3VhZ2VzOiBbXSxcbiAgICAgIHJlY29yZENyZWF0ZWQsXG4gICAgICByZWNvcmRVcGRhdGVkLFxuICAgICAgcmVjb3JkUHVibGlzaGVkLFxuICAgICAgc3RhdHVzLFxuICAgICAgdGl0bGUsXG4gICAgICBhYnN0cmFjdCxcbiAgICAgIG93bmVyT3JnYW5pemF0aW9uLFxuICAgICAgY29udGFjdHMsXG4gICAgICBjb250YWN0c0ZvclJlc291cmNlOiBbXSwgLy8gRklYTUU6IGlzIHRoYXQgcmVhbGx5IHVzZWZ1bD8/XG4gICAgICBrZXl3b3JkcyxcbiAgICAgIHRvcGljcyxcbiAgICAgIGxpY2Vuc2VzLFxuICAgICAgbGVnYWxDb25zdHJhaW50cyxcbiAgICAgIHNlY3VyaXR5Q29uc3RyYWludHMsXG4gICAgICBvdGhlckNvbnN0cmFpbnRzLFxuICAgICAgLi4uKGRhdGFzZXRDcmVhdGVkICYmIHsgZGF0YXNldENyZWF0ZWQgfSksXG4gICAgICAuLi4oZGF0YXNldFVwZGF0ZWQgJiYgeyBkYXRhc2V0VXBkYXRlZCB9KSxcbiAgICAgIGxpbmVhZ2UsXG4gICAgICAuLi4oc3BhdGlhbFJlcHJlc2VudGF0aW9uICYmIHsgc3BhdGlhbFJlcHJlc2VudGF0aW9uIH0pLFxuICAgICAgb3ZlcnZpZXdzLFxuICAgICAgc3BhdGlhbEV4dGVudHMsXG4gICAgICB0ZW1wb3JhbEV4dGVudHMsXG4gICAgICBkaXN0cmlidXRpb25zLFxuICAgICAgdXBkYXRlRnJlcXVlbmN5LFxuICAgIH0gYXMgRGF0YXNldFJlY29yZFxuICB9IGVsc2Uge1xuICAgIGNvbnN0IG9ubGluZVJlc291cmNlcyA9IHJlYWRPbmxpbmVSZXNvdXJjZXMocm9vdEVsKVxuICAgIHJldHVybiB7XG4gICAgICB1bmlxdWVJZGVudGlmaWVyLFxuICAgICAga2luZCxcbiAgICAgIGxhbmd1YWdlczogW10sXG4gICAgICByZWNvcmRDcmVhdGVkLFxuICAgICAgcmVjb3JkVXBkYXRlZCxcbiAgICAgIHJlY29yZFB1Ymxpc2hlZCxcbiAgICAgIHRpdGxlLFxuICAgICAgYWJzdHJhY3QsXG4gICAgICBvd25lck9yZ2FuaXphdGlvbixcbiAgICAgIGNvbnRhY3RzLFxuICAgICAga2V5d29yZHMsXG4gICAgICB0b3BpY3MsXG4gICAgICBsaWNlbnNlcyxcbiAgICAgIGxlZ2FsQ29uc3RyYWludHMsXG4gICAgICBzZWN1cml0eUNvbnN0cmFpbnRzLFxuICAgICAgb3RoZXJDb25zdHJhaW50cyxcbiAgICAgIG92ZXJ2aWV3cyxcbiAgICAgIG9ubGluZVJlc291cmNlcyxcbiAgICB9IGFzIFNlcnZpY2VSZWNvcmRcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9YbWwocmVjb3JkOiBDYXRhbG9nUmVjb3JkLCBvcmlnaW5hbFhtbD86IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG9yaWdpbmFsRG9jID0gb3JpZ2luYWxYbWwgPyBwYXJzZVhtbFN0cmluZyhvcmlnaW5hbFhtbCkgOiBudWxsXG4gIGNvbnN0IG9yaWdpbmFsUmVjb3JkID0gb3JpZ2luYWxYbWwgPyB0b01vZGVsKG9yaWdpbmFsWG1sKSA6IG51bGxcbiAgY29uc3Qgcm9vdEVsID0gb3JpZ2luYWxEb2NcbiAgICA/IGdldFJvb3RFbGVtZW50KG9yaWdpbmFsRG9jKVxuICAgIDogY3JlYXRlRWxlbWVudCgnZ21kOk1EX01ldGFkYXRhJykoKVxuXG4gIGZ1bmN0aW9uIGZpZWxkQ2hhbmdlZChuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gb3JpZ2luYWxSZWNvcmQgIT09IG51bGxcbiAgICAgID8gIWlzRXF1YWwocmVjb3JkW25hbWVdLCBvcmlnaW5hbFJlY29yZFtuYW1lXSlcbiAgICAgIDogdHJ1ZVxuICB9XG5cbiAgd3JpdGVVbmlxdWVJZGVudGlmaWVyKHJlY29yZCwgcm9vdEVsKVxuICB3cml0ZUtpbmQocmVjb3JkLCByb290RWwpXG4gIGZpZWxkQ2hhbmdlZCgnb3duZXJPcmdhbml6YXRpb24nKSAmJiB3cml0ZU93bmVyT3JnYW5pemF0aW9uKHJlY29yZCwgcm9vdEVsKVxuICBmaWVsZENoYW5nZWQoJ3JlY29yZFVwZGF0ZWQnKSAmJiB3cml0ZVJlY29yZFVwZGF0ZWQocmVjb3JkLCByb290RWwpXG4gIHdyaXRlVGl0bGUocmVjb3JkLCByb290RWwpXG4gIHdyaXRlQWJzdHJhY3QocmVjb3JkLCByb290RWwpXG4gIGZpZWxkQ2hhbmdlZCgnY29udGFjdHMnKSAmJiB3cml0ZUNvbnRhY3RzKHJlY29yZCwgcm9vdEVsKVxuICBmaWVsZENoYW5nZWQoJ2tleXdvcmRzJykgJiYgd3JpdGVLZXl3b3JkcyhyZWNvcmQsIHJvb3RFbClcbiAgZmllbGRDaGFuZ2VkKCd0b3BpY3MnKSAmJiB3cml0ZVRvcGljcyhyZWNvcmQsIHJvb3RFbClcbiAgZmllbGRDaGFuZ2VkKCdsZWdhbENvbnN0cmFpbnRzJykgJiYgd3JpdGVMZWdhbENvbnN0cmFpbnRzKHJlY29yZCwgcm9vdEVsKVxuICBmaWVsZENoYW5nZWQoJ3NlY3VyaXR5Q29uc3RyYWludHMnKSAmJlxuICAgIHdyaXRlU2VjdXJpdHlDb25zdHJhaW50cyhyZWNvcmQsIHJvb3RFbClcbiAgZmllbGRDaGFuZ2VkKCdsaWNlbnNlcycpICYmIHdyaXRlTGljZW5zZXMocmVjb3JkLCByb290RWwpXG4gIGZpZWxkQ2hhbmdlZCgnb3RoZXJDb25zdHJhaW50cycpICYmIHdyaXRlT3RoZXJDb25zdHJhaW50cyhyZWNvcmQsIHJvb3RFbClcblxuICBpZiAocmVjb3JkLmtpbmQgPT09ICdkYXRhc2V0Jykge1xuICAgIHdyaXRlU3RhdHVzKHJlY29yZCwgcm9vdEVsKVxuICAgIGZpZWxkQ2hhbmdlZCgndXBkYXRlRnJlcXVlbmN5JykgJiYgd3JpdGVVcGRhdGVGcmVxdWVuY3kocmVjb3JkLCByb290RWwpXG4gICAgZmllbGRDaGFuZ2VkKCdkYXRhc2V0Q3JlYXRlZCcpICYmIHdyaXRlRGF0YXNldENyZWF0ZWQocmVjb3JkLCByb290RWwpXG4gICAgZmllbGRDaGFuZ2VkKCdkYXRhc2V0VXBkYXRlZCcpICYmIHdyaXRlRGF0YXNldFVwZGF0ZWQocmVjb3JkLCByb290RWwpXG4gICAgZmllbGRDaGFuZ2VkKCdzcGF0aWFsUmVwcmVzZW50YXRpb24nKSAmJlxuICAgICAgd3JpdGVTcGF0aWFsUmVwcmVzZW50YXRpb24ocmVjb3JkLCByb290RWwpXG4gICAgZmllbGRDaGFuZ2VkKCdvdmVydmlld3MnKSAmJiB3cml0ZUdyYXBoaWNPdmVydmlld3MocmVjb3JkLCByb290RWwpXG4gICAgZmllbGRDaGFuZ2VkKCdkaXN0cmlidXRpb25zJykgJiYgd3JpdGVEaXN0cmlidXRpb25zKHJlY29yZCwgcm9vdEVsKVxuICAgIHdyaXRlTGluZWFnZShyZWNvcmQsIHJvb3RFbClcbiAgfSBlbHNlIHtcbiAgICBmaWVsZENoYW5nZWQoJ29ubGluZVJlc291cmNlcycpICYmIHdyaXRlT25saW5lUmVzb3VyY2VzKHJlY29yZCwgcm9vdEVsKVxuICB9XG5cbiAgY29uc3QgbmV3RG9jdW1lbnQgPSBjcmVhdGVEb2N1bWVudChyb290RWwpXG4gIHJldHVybiB4bWxUb1N0cmluZyhuZXdEb2N1bWVudClcbn1cbiJdfQ==