yarramate 0.1.1 → 0.3.0
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.
- package/README.md +19 -4
- package/assets/likec4/specification.likec4 +500 -0
- package/dist/adapters/likec4-cli.js +202 -15
- package/dist/adapters/likec4-export.js +14 -1
- package/dist/adapters/likec4-project.js +16 -2
- package/dist/check-command.js +20 -2
- package/dist/cli-support.d.ts +7 -2
- package/dist/cli-support.js +3 -2
- package/dist/cli.js +30 -10
- package/dist/compiler.js +111 -0
- package/package.json +3 -2
- package/schema/yarramate-check-result.schema.json +15 -0
- package/schema/yarramate-core-contract.schema.json +2 -0
- package/schema/yarramate-document.schema.json +29 -0
- package/schema/yarramate-likec4-diagnostic-result.schema.json +1 -1
- package/schema/yarramate-likec4-project.schema.json +1 -0
- package/skills/yarramate-architecture/references/native-authoring.md +33 -1
package/README.md
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
# YarraMate
|
|
2
2
|
|
|
3
|
+
[](https://www.npmjs.com/package/yarramate)
|
|
4
|
+
[](https://github.com/yarrasys/yarramate/actions/workflows/ci.yml)
|
|
5
|
+
[](https://github.com/yarrasys/yarramate/actions/workflows/codeql.yml)
|
|
6
|
+
[](LICENSE)
|
|
7
|
+
|
|
3
8
|
YarraMate is a tool-neutral semantic architecture engine and guided
|
|
4
9
|
methodology. It turns architectural intent into deterministic, testable
|
|
5
10
|
context shared by people and agents.
|
|
@@ -94,8 +99,16 @@ pnpm docs:dev
|
|
|
94
99
|
|
|
95
100
|
## CLI
|
|
96
101
|
|
|
97
|
-
|
|
98
|
-
|
|
102
|
+
Install the published executable or invoke it directly with `npx`:
|
|
103
|
+
|
|
104
|
+
```sh
|
|
105
|
+
npm install --global yarramate
|
|
106
|
+
yarramate --help
|
|
107
|
+
|
|
108
|
+
npx yarramate check .yarramate/workspace.yaml
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
When developing the repository, build and invoke the same executable surface:
|
|
99
112
|
|
|
100
113
|
```sh
|
|
101
114
|
pnpm build
|
|
@@ -117,7 +130,7 @@ For a local consumer test, create a package artifact:
|
|
|
117
130
|
|
|
118
131
|
```sh
|
|
119
132
|
pnpm pack --pack-destination /tmp/yarramate-package
|
|
120
|
-
npm install --global /tmp/yarramate-package/yarramate
|
|
133
|
+
npm install --global /tmp/yarramate-package/yarramate-*.tgz
|
|
121
134
|
yarramate --help
|
|
122
135
|
```
|
|
123
136
|
|
|
@@ -169,6 +182,8 @@ You do not need to provide a solution, formal proposal, or implementation.
|
|
|
169
182
|
|
|
170
183
|
Read [CONTRIBUTING.md](CONTRIBUTING.md) before proposing changes to native
|
|
171
184
|
semantics or stable interfaces. Report suspected vulnerabilities according to
|
|
172
|
-
[SECURITY.md](SECURITY.md).
|
|
185
|
+
[SECURITY.md](SECURITY.md). Participation is governed by the
|
|
186
|
+
[Code of Conduct](CODE_OF_CONDUCT.md), and help channels are described in
|
|
187
|
+
[SUPPORT.md](SUPPORT.md).
|
|
173
188
|
|
|
174
189
|
YarraMate is available under the [MIT License](LICENSE).
|
|
@@ -0,0 +1,500 @@
|
|
|
1
|
+
// YarraMate semantic profile for LikeC4.
|
|
2
|
+
//
|
|
3
|
+
// This vocabulary is ArchiMate-inspired but independently expressed. The tags
|
|
4
|
+
// encode semantic coordinates; element kinds carry the human-facing notation.
|
|
5
|
+
specification {
|
|
6
|
+
color motivationColor #E8D7F1
|
|
7
|
+
color strategyColor #F3E5AB
|
|
8
|
+
color businessColor #FFF1B8
|
|
9
|
+
color applicationColor #C9E7FF
|
|
10
|
+
color technologyColor #D8F0D2
|
|
11
|
+
color physicalColor #D5E8D4
|
|
12
|
+
color implementationColor #F5D5CB
|
|
13
|
+
color compositeColor #E6E6E6
|
|
14
|
+
color relationColor #5B6470
|
|
15
|
+
|
|
16
|
+
tag layerMotivation
|
|
17
|
+
tag layerStrategy
|
|
18
|
+
tag layerBusiness
|
|
19
|
+
tag layerApplication
|
|
20
|
+
tag layerTechnology
|
|
21
|
+
tag layerPhysical
|
|
22
|
+
tag layerImplementation
|
|
23
|
+
tag layerComposite
|
|
24
|
+
|
|
25
|
+
tag aspectActive
|
|
26
|
+
tag aspectBehavior
|
|
27
|
+
tag aspectPassive
|
|
28
|
+
|
|
29
|
+
// Adapter-owned deployment presentation kinds.
|
|
30
|
+
deploymentNode environment {
|
|
31
|
+
notation 'Environment'
|
|
32
|
+
style { color technologyColor }
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
deploymentNode zone {
|
|
36
|
+
notation 'Zone'
|
|
37
|
+
style { color compositeColor }
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
deploymentNode host {
|
|
41
|
+
notation 'Host'
|
|
42
|
+
style { color technologyColor }
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
deploymentNode runtime {
|
|
46
|
+
notation 'Runtime'
|
|
47
|
+
style { color applicationColor }
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// ── Motivation ────────────────────────────────────────────────────────────
|
|
51
|
+
|
|
52
|
+
element stakeholder {
|
|
53
|
+
#layerMotivation
|
|
54
|
+
notation 'Stakeholder'
|
|
55
|
+
style { shape person; color motivationColor }
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
element driver {
|
|
59
|
+
#layerMotivation
|
|
60
|
+
notation 'Driver'
|
|
61
|
+
style { color motivationColor }
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
element assessment {
|
|
65
|
+
#layerMotivation
|
|
66
|
+
notation 'Assessment'
|
|
67
|
+
style { color motivationColor }
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
element goal {
|
|
71
|
+
#layerMotivation
|
|
72
|
+
notation 'Goal'
|
|
73
|
+
style { color motivationColor }
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
element outcome {
|
|
77
|
+
#layerMotivation
|
|
78
|
+
notation 'Outcome'
|
|
79
|
+
style { color motivationColor }
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
element principle {
|
|
83
|
+
#layerMotivation
|
|
84
|
+
notation 'Principle'
|
|
85
|
+
style { color motivationColor }
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
element requirement {
|
|
89
|
+
#layerMotivation
|
|
90
|
+
notation 'Requirement'
|
|
91
|
+
style { color motivationColor }
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
element constraint {
|
|
95
|
+
#layerMotivation
|
|
96
|
+
notation 'Constraint'
|
|
97
|
+
style { color motivationColor }
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
element meaning {
|
|
101
|
+
#layerMotivation
|
|
102
|
+
notation 'Meaning'
|
|
103
|
+
style { color motivationColor }
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
element value {
|
|
107
|
+
#layerMotivation
|
|
108
|
+
notation 'Value'
|
|
109
|
+
style { color motivationColor }
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// ── Strategy ──────────────────────────────────────────────────────────────
|
|
113
|
+
|
|
114
|
+
element resource {
|
|
115
|
+
#layerStrategy #aspectActive
|
|
116
|
+
notation 'Resource'
|
|
117
|
+
style { color strategyColor }
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
element capability {
|
|
121
|
+
#layerStrategy #aspectBehavior
|
|
122
|
+
notation 'Capability'
|
|
123
|
+
style { color strategyColor }
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
element valueStream {
|
|
127
|
+
#layerStrategy #aspectBehavior
|
|
128
|
+
notation 'Value stream'
|
|
129
|
+
style { color strategyColor }
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
element courseOfAction {
|
|
133
|
+
#layerStrategy #aspectBehavior
|
|
134
|
+
notation 'Course of action'
|
|
135
|
+
style { color strategyColor }
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// ── Business layer ────────────────────────────────────────────────────────
|
|
139
|
+
|
|
140
|
+
element businessActor {
|
|
141
|
+
#layerBusiness #aspectActive
|
|
142
|
+
notation 'Business actor'
|
|
143
|
+
style { shape person; color businessColor }
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
element businessRole {
|
|
147
|
+
#layerBusiness #aspectActive
|
|
148
|
+
notation 'Business role'
|
|
149
|
+
style { color businessColor }
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
element businessCollaboration {
|
|
153
|
+
#layerBusiness #aspectActive
|
|
154
|
+
notation 'Business collaboration'
|
|
155
|
+
style { color businessColor; multiple true }
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
element businessInterface {
|
|
159
|
+
#layerBusiness #aspectActive
|
|
160
|
+
notation 'Business interface'
|
|
161
|
+
style { color businessColor }
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
element businessProcess {
|
|
165
|
+
#layerBusiness #aspectBehavior
|
|
166
|
+
notation 'Business process'
|
|
167
|
+
style { color businessColor }
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
element businessFunction {
|
|
171
|
+
#layerBusiness #aspectBehavior
|
|
172
|
+
notation 'Business function'
|
|
173
|
+
style { color businessColor }
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
element businessInteraction {
|
|
177
|
+
#layerBusiness #aspectBehavior
|
|
178
|
+
notation 'Business interaction'
|
|
179
|
+
style { color businessColor }
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
element businessEvent {
|
|
183
|
+
#layerBusiness #aspectBehavior
|
|
184
|
+
notation 'Business event'
|
|
185
|
+
style { color businessColor }
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
element businessService {
|
|
189
|
+
#layerBusiness #aspectBehavior
|
|
190
|
+
notation 'Business service'
|
|
191
|
+
style { color businessColor }
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
element businessObject {
|
|
195
|
+
#layerBusiness #aspectPassive
|
|
196
|
+
notation 'Business object'
|
|
197
|
+
style { color businessColor }
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
element contract {
|
|
201
|
+
#layerBusiness #aspectPassive
|
|
202
|
+
notation 'Contract'
|
|
203
|
+
style { color businessColor }
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
element representation {
|
|
207
|
+
#layerBusiness #aspectPassive
|
|
208
|
+
notation 'Representation'
|
|
209
|
+
style { color businessColor }
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
element product {
|
|
213
|
+
#layerBusiness #aspectPassive
|
|
214
|
+
notation 'Product'
|
|
215
|
+
style { color businessColor }
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// ── Application layer ─────────────────────────────────────────────────────
|
|
219
|
+
|
|
220
|
+
element applicationComponent {
|
|
221
|
+
#layerApplication #aspectActive
|
|
222
|
+
notation 'Application component'
|
|
223
|
+
style { shape component; color applicationColor }
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
element applicationCollaboration {
|
|
227
|
+
#layerApplication #aspectActive
|
|
228
|
+
notation 'Application collaboration'
|
|
229
|
+
style { color applicationColor; multiple true }
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
element applicationInterface {
|
|
233
|
+
#layerApplication #aspectActive
|
|
234
|
+
notation 'Application interface'
|
|
235
|
+
style { color applicationColor }
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
element applicationFunction {
|
|
239
|
+
#layerApplication #aspectBehavior
|
|
240
|
+
notation 'Application function'
|
|
241
|
+
style { color applicationColor }
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
element applicationInteraction {
|
|
245
|
+
#layerApplication #aspectBehavior
|
|
246
|
+
notation 'Application interaction'
|
|
247
|
+
style { color applicationColor }
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
element applicationProcess {
|
|
251
|
+
#layerApplication #aspectBehavior
|
|
252
|
+
notation 'Application process'
|
|
253
|
+
style { color applicationColor }
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
element applicationEvent {
|
|
257
|
+
#layerApplication #aspectBehavior
|
|
258
|
+
notation 'Application event'
|
|
259
|
+
style { color applicationColor }
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
element applicationService {
|
|
263
|
+
#layerApplication #aspectBehavior
|
|
264
|
+
notation 'Application service'
|
|
265
|
+
style { color applicationColor }
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
element dataObject {
|
|
269
|
+
#layerApplication #aspectPassive
|
|
270
|
+
notation 'Data object'
|
|
271
|
+
style { shape storage; color applicationColor }
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
// ── Technology layer ──────────────────────────────────────────────────────
|
|
275
|
+
|
|
276
|
+
element node {
|
|
277
|
+
#layerTechnology #aspectActive
|
|
278
|
+
notation 'Node'
|
|
279
|
+
style { color technologyColor }
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
element device {
|
|
283
|
+
#layerTechnology #aspectActive
|
|
284
|
+
notation 'Device'
|
|
285
|
+
style { color technologyColor }
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
element systemSoftware {
|
|
289
|
+
#layerTechnology #aspectActive
|
|
290
|
+
notation 'System software'
|
|
291
|
+
style { color technologyColor }
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
element technologyCollaboration {
|
|
295
|
+
#layerTechnology #aspectActive
|
|
296
|
+
notation 'Technology collaboration'
|
|
297
|
+
style { color technologyColor; multiple true }
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
element technologyInterface {
|
|
301
|
+
#layerTechnology #aspectActive
|
|
302
|
+
notation 'Technology interface'
|
|
303
|
+
style { color technologyColor }
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
element path {
|
|
307
|
+
#layerTechnology #aspectActive
|
|
308
|
+
notation 'Path'
|
|
309
|
+
style { color technologyColor }
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
element communicationNetwork {
|
|
313
|
+
#layerTechnology #aspectActive
|
|
314
|
+
notation 'Communication network'
|
|
315
|
+
style { color technologyColor }
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
element technologyFunction {
|
|
319
|
+
#layerTechnology #aspectBehavior
|
|
320
|
+
notation 'Technology function'
|
|
321
|
+
style { color technologyColor }
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
element technologyProcess {
|
|
325
|
+
#layerTechnology #aspectBehavior
|
|
326
|
+
notation 'Technology process'
|
|
327
|
+
style { color technologyColor }
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
element technologyInteraction {
|
|
331
|
+
#layerTechnology #aspectBehavior
|
|
332
|
+
notation 'Technology interaction'
|
|
333
|
+
style { color technologyColor }
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
element technologyEvent {
|
|
337
|
+
#layerTechnology #aspectBehavior
|
|
338
|
+
notation 'Technology event'
|
|
339
|
+
style { color technologyColor }
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
element technologyService {
|
|
343
|
+
#layerTechnology #aspectBehavior
|
|
344
|
+
notation 'Technology service'
|
|
345
|
+
style { color technologyColor }
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
element artifact {
|
|
349
|
+
#layerTechnology #aspectPassive
|
|
350
|
+
notation 'Artifact'
|
|
351
|
+
style { color technologyColor }
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
// ── Physical layer ────────────────────────────────────────────────────────
|
|
355
|
+
|
|
356
|
+
element equipment {
|
|
357
|
+
#layerPhysical #aspectActive
|
|
358
|
+
notation 'Equipment'
|
|
359
|
+
style { color physicalColor }
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
element facility {
|
|
363
|
+
#layerPhysical #aspectActive
|
|
364
|
+
notation 'Facility'
|
|
365
|
+
style { color physicalColor }
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
element distributionNetwork {
|
|
369
|
+
#layerPhysical #aspectActive
|
|
370
|
+
notation 'Distribution network'
|
|
371
|
+
style { color physicalColor }
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
element material {
|
|
375
|
+
#layerPhysical #aspectPassive
|
|
376
|
+
notation 'Material'
|
|
377
|
+
style { color physicalColor }
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
// ── Implementation and migration ─────────────────────────────────────────
|
|
381
|
+
|
|
382
|
+
element workPackage {
|
|
383
|
+
#layerImplementation #aspectBehavior
|
|
384
|
+
notation 'Work package'
|
|
385
|
+
style { color implementationColor }
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
element deliverable {
|
|
389
|
+
#layerImplementation #aspectPassive
|
|
390
|
+
notation 'Deliverable'
|
|
391
|
+
style { color implementationColor }
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
element implementationEvent {
|
|
395
|
+
#layerImplementation #aspectBehavior
|
|
396
|
+
notation 'Implementation event'
|
|
397
|
+
style { color implementationColor }
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
element plateau {
|
|
401
|
+
#layerImplementation
|
|
402
|
+
notation 'Plateau'
|
|
403
|
+
style { color implementationColor }
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
element gap {
|
|
407
|
+
#layerImplementation
|
|
408
|
+
notation 'Gap'
|
|
409
|
+
style { color implementationColor }
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
// ── Composite and relationship connectors ────────────────────────────────
|
|
413
|
+
|
|
414
|
+
element grouping {
|
|
415
|
+
#layerComposite
|
|
416
|
+
notation 'Grouping'
|
|
417
|
+
style { color compositeColor; border dashed }
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
element location {
|
|
421
|
+
#layerComposite
|
|
422
|
+
notation 'Location'
|
|
423
|
+
style { color compositeColor }
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
element andJunction {
|
|
427
|
+
#layerComposite
|
|
428
|
+
notation 'AND junction'
|
|
429
|
+
style { color compositeColor }
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
element orJunction {
|
|
433
|
+
#layerComposite
|
|
434
|
+
notation 'OR junction'
|
|
435
|
+
style { color compositeColor }
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
// ── Relationships ─────────────────────────────────────────────────────────
|
|
439
|
+
|
|
440
|
+
relationship composition {
|
|
441
|
+
description 'Strong whole-part relationship.'
|
|
442
|
+
color relationColor
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
relationship aggregation {
|
|
446
|
+
description 'Weak whole-part relationship.'
|
|
447
|
+
color relationColor
|
|
448
|
+
line dashed
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
relationship assignment {
|
|
452
|
+
description 'Allocation of responsibility, execution, or use.'
|
|
453
|
+
color relationColor
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
relationship realization {
|
|
457
|
+
description 'Implementation or fulfillment of a more abstract concept.'
|
|
458
|
+
color relationColor
|
|
459
|
+
line dashed
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
relationship serving {
|
|
463
|
+
description 'Functionality made available to another concept.'
|
|
464
|
+
color relationColor
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
relationship access {
|
|
468
|
+
description 'Use, creation, modification, or reading of passive structure.'
|
|
469
|
+
color relationColor
|
|
470
|
+
line dashed
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
relationship influence {
|
|
474
|
+
description 'Effect on a motivation concept.'
|
|
475
|
+
color relationColor
|
|
476
|
+
line dotted
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
relationship association {
|
|
480
|
+
description 'Semantically relevant connection not expressed more specifically.'
|
|
481
|
+
color relationColor
|
|
482
|
+
line dashed
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
relationship triggering {
|
|
486
|
+
description 'Temporal or causal precedence between behaviors or events.'
|
|
487
|
+
color relationColor
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
relationship flow {
|
|
491
|
+
description 'Transfer of information, value, goods, or another object.'
|
|
492
|
+
color relationColor
|
|
493
|
+
line dashed
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
relationship specialization {
|
|
497
|
+
description 'Concept is a more specific form of another concept.'
|
|
498
|
+
color relationColor
|
|
499
|
+
}
|
|
500
|
+
}
|