Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 20 additions & 1 deletion docs/language_status/cobolrt_rules.json
Original file line number Diff line number Diff line change
Expand Up @@ -812,6 +812,24 @@
"status": "REFUSED",
"calibration": "uncalibrated"
},
{
"id": "RT-CBL-COUNTER-NONDIGIT-REFUSED",
"family": "CBL",
"title": "A STRING / UNSTRING POINTER, an UNSTRING TALLYING IN item and an INSPECT TALLYING counter are read before they store: a zoned one holding a non-digit is refused by name",
"methods": [
"counterNum"
],
"ibm": null,
"ibm_note": "IBM documents no result (ZONEDATA(PFD) assumes valid zone bits); the same ground as the receiver of ADD",
"options": [
"ZONEDATA"
],
"register": [
"C11"
],
"status": "REFUSED",
"calibration": "uncalibrated"
},
{
"id": "RT-CBL-COMPARE-NONDIGIT",
"family": "CBL",
Expand Down Expand Up @@ -1415,7 +1433,8 @@
"refuse",
"pScaled",
"refuseP",
"refuseReceiver"
"refuseReceiver",
"refuseCounter"
],
"site": "refuse",
"ibm": null,
Expand Down
10 changes: 10 additions & 0 deletions docs/language_status/register/C11.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,16 @@ reached: "yes (COMEN01C option `1!`; GenApp LGTESTP4's add)"
TRAN-ID`) can see a non-digit; CBSA 4, GenApp 23, the others 0 cannot. Per verb (#4692): ADD / SUBTRACT / MULTIPLY / DIVIDE
refuse a dirty receiver (above); MOVE and GIVING overwrite it, so the receiver is not read (modelled, measured);
COMPUTE reads it as an operand (modelled).
- **A non-digit in a POINTER / TALLYING item (#4692) -- REFUSED by name.** The same read-before-store as the receiver of
ADD: `INSPECT ... TALLYING ctr` and `UNSTRING ... TALLYING IN ctr` add to the counter's current value, and
`STRING ... WITH POINTER p` / `UNSTRING ... WITH POINTER p` read where to start. A zoned item holding a non-digit
there (a counter cleared by `MOVE SPACES`) is refused at run time (`Cobol.counterNum`: "a STRING / UNSTRING pointer
or tallying counter that is a zoned item holding a non-digit is not modelled"), on IBM's ground above (no result
documented); a digit-only one counts as ever. Tested over the five receiver shapes x INSPECT ALL / CHARACTERS,
UNSTRING TALLYING / POINTER, STRING POINTER, and the digit-only start of each (`test_det_nondigit_zoned.py`). A plain
item (no REDEFINES) cleared to spaces and then ADDed to is refused too (the lifted-item path goes through the same
`receiverNum`). Not covered, no burned program reads one: ADD CORRESPONDING, `PERFORM VARYING` / `SET ... UP BY`
steps of a dirty index.
- **A zoned item with a P position holding a non-digit, as a sender (#4685, #4692) -- REFUSED by name.** Measured against
cobc 3.1.2 (`-std=ibm -fsign=EBCDIC`, TRUNC STD and BIN): a left-P item (`PIC VPP99`) MOVEd to a binary item makes
the program hang (the 14-operation probe never finished; `timeout` killed it), and a right-P one (`PIC 99PP`) is
Expand Down
19 changes: 15 additions & 4 deletions gitgalaxy/tools/cobol_to_java/det/cobolrt/Cobol.java
Original file line number Diff line number Diff line change
Expand Up @@ -823,6 +823,17 @@ public static BigDecimal receiverNum(Field f, Charset cs) {
return num(f, cs);
}

/** The current value of a STRING / UNSTRING POINTER, an UNSTRING TALLYING IN or an INSPECT TALLYING counter (#4692,
* register C11): the statement reads the item before it stores, as ADD does its receiver. A zoned item holding a
* non-digit is refused by name for the same reason as {@link #receiverNum}; a digit-only one is read as ever. */
// [rule RT-CBL-COUNTER-NONDIGIT-REFUSED]
public static BigDecimal counterNum(Field f, Charset cs) {
if (f.kind == Field.Kind.NUMERIC_DISPLAY && Zoned.get(f, cs).dirty) {
throw Zoned.refuseCounter();
}
return num(f, cs);
}

/** A numeric item's value in a comparison (#4662): a zoned item holding a non-digit as the oracle compares it. */
// [rule RT-CBL-COMPARE-NONDIGIT]
public static BigDecimal cmpNum(Field f, Charset cs) {
Expand Down Expand Up @@ -1319,7 +1330,7 @@ private static boolean matches(byte[] hay, int at, byte[] pat) {
public static boolean string(Field into, Field pointer, Charset cs, StringPart... parts) {
int off = 0;
if (pointer != null) {
BigDecimal p = num(pointer, cs);
BigDecimal p = counterNum(pointer, cs);
if (p.compareTo(BigDecimal.ONE) < 0 || p.compareTo(BigDecimal.valueOf(into.len)) > 0) return true;
off = p.intValue() - 1;
}
Expand Down Expand Up @@ -1403,7 +1414,7 @@ public static boolean unstring(Field src, Field pointer, Field tallying, List<De
byte[] data = src.raw();
int off = 0;
if (pointer != null) {
BigDecimal p = num(pointer, cs);
BigDecimal p = counterNum(pointer, cs);
if (p.compareTo(BigDecimal.ONE) < 0 || p.compareTo(BigDecimal.valueOf(data.length)) > 0) return true;
off = p.intValue() - 1;
}
Expand Down Expand Up @@ -1440,7 +1451,7 @@ public static boolean unstring(Field src, Field pointer, Field tallying, List<De
filled++;
}
if (pointer != null) store(pointer, BigDecimal.valueOf(off + 1), false, cs);
if (tallying != null) store(tallying, num(tallying, cs).add(BigDecimal.valueOf(filled)), false, cs);
if (tallying != null) store(tallying, counterNum(tallying, cs).add(BigDecimal.valueOf(filled)), false, cs);
return off < data.length;
}

Expand Down Expand Up @@ -1588,7 +1599,7 @@ public static void inspect(Field target, Charset cs, Clause... clauses) {
for (int ci = 0; ci < clauses.length; ci++) {
Clause c = clauses[ci];
if (c.counter != null) {
store(c.counter, num(c.counter, cs).add(BigDecimal.valueOf(counts[ci])), false, cs);
store(c.counter, counterNum(c.counter, cs).add(BigDecimal.valueOf(counts[ci])), false, cs);
}
}
}
Expand Down
6 changes: 6 additions & 0 deletions gitgalaxy/tools/cobol_to_java/det/cobolrt/Zoned.java
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,12 @@ static UnsupportedOperationException refuseReceiver() {
return refuse("arithmetic whose receiver is");
}

/** The refusal of a non-digit in a POINTER / TALLYING item a STRING, UNSTRING or INSPECT reads before it stores
* (#4692). */
static UnsupportedOperationException refuseCounter() {
return refuse("a STRING / UNSTRING pointer or tallying counter that is");
}

private static BigDecimal scaled(BigInteger v, boolean neg, int scale) {
return new BigDecimal(neg ? v.negate() : v, scale);
}
Expand Down
54 changes: 28 additions & 26 deletions tests/cics_crucible/ports/pc-wizard/PCCONF/evidence.json
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
"tests/cics_crucible/ports/pc-wizard/PCCONF/overlay/cobolrt/standalone/Sysout.java",
"tests/cics_crucible/ports/pc-wizard/PCCONF/overlay/service/PcconfService.java"
],
"sha256": "a03a83ab9aa07b13cb2285c1dae4949fa702914c85b4720fdafc1edc5338f9be",
"sha256": "8d3a01d203b0ba9671771ae66e05ab140c2559c66cee85820a8dde3ddcde121f",
"entry_points": [
"handleTransaction",
"runTask"
Expand All @@ -47,7 +47,7 @@
"tests/cics_crucible/ports/pc-wizard/*/overlay/**"
],
"files": 30,
"sha256": "222a987d1aafe2a662fa51d0ce9b84be942efd67a7f5aa6805600765b6c6b72d"
"sha256": "6b10ab8a772890f0074eb2cfd4cbd7e8baad9cbd713a84807dbcca47166f005f"
},
"case": {
"paths": [
Expand All @@ -63,6 +63,7 @@
"tests/tools/equivalence_java.py",
"tests/tools/equivalence_inputs.py",
"tests/tools/equivalence_cics.py",
"tests/tools/equivalence_cics_containers.py",
"tests/tools/equivalence_call.py",
"tests/tools/equivalence_cache.py",
"tests/tools/equivalence_db2.py",
Expand All @@ -73,12 +74,12 @@
"tests/tools/cics_crucible.py",
"tests/tools/cics_crucible_compare.py"
],
"files": 14,
"sha256": "1a6764dd1fec1885c80fee90fc0f637d42a89a42e97b72e6f0a7503d9833fc04",
"files": 15,
"sha256": "89bdf27b94a206292e4ab905414c263ae8a27d9f32c8ca7be8e05d52da991c20",
"components": {
"harness:call": "61253984123d6c40caf524f699070e74326d454fe62b8ee8658cbfea27678730",
"harness:cics": "d9d3f63b387b2fd07a05780ece223c3df3a375235534675546f97040ac9270de",
"harness:core": "6f13d22bab57c67e9caaf5d2714906e9c7c0149a83dcfd6650e2514e2c478318",
"harness:call": "74c6c349861eb08f26d7b25f83b523f91dd883cfdd9c378075b3ce379a040b33",
"harness:cics": "efb861c5003490d73ee3aa741e4ddb4d0c5292be24c92b4093130844916a0426",
"harness:core": "943aa2440d0af07594519f318266e6591e638c33d84d44bf76e99b39b1377f15",
"harness:crucible": "7256c91cce7b59a0fc85800fe0910ea9b969c05320811aa4dd8214b8b1ee7b56",
"harness:db2": "e5278abdc64341d0e53d9bd81423cf2362cc2d2a791254e1e67aff17a0565fb4",
"harness:ims": "71164b208ceea480df6a1520645834ad1e7ff0a487416112cd22cec38d3fdfbe"
Expand All @@ -94,11 +95,11 @@
"paths": [
"gitgalaxy/tools/cobol_to_java/**"
],
"files": 91,
"sha256": "bb0ad4e37d7e9ee055a80839109ea0d61a2810ed5395579da255d4c829c01b49",
"files": 93,
"sha256": "9735d7919095e71f50e96712c191c0379dd35ab8f5741dc8f74f6a23d05d42f0",
"components": {
"generator:cobolrt/Accept.java": "d5e655d996990b1aa5e0bbcafd2803f98ef8a953aca49c9189476d4ccff1edcc",
"generator:cobolrt/Cobol.java": "18e4d232d7db68683d74699e1cddda0c6e2606b33b9f27f91b333754bd984824",
"generator:cobolrt/Cobol.java": "4c3961e169173aa39f2104d1a6dd2ff0d2ce2347ac41358855d31f41e2b4fe11",
"generator:cobolrt/Codec.java": "8745a23fd0c77d98660e59ce6fe364391d76eb8a12bd9d3b4f4426018652f420",
"generator:cobolrt/Editing.java": "2ea7c7da4d7aa9a4c07b3358d929740fdc65dd0e44a982cdf5ef6c5f80c15b25",
"generator:cobolrt/Field.java": "42603aaae152d6b50f1525d2f32e7ee06ab116bd56e9d9598594242305746894",
Expand All @@ -109,9 +110,9 @@
"generator:cobolrt/Lossless.java": "63b2383bf7af1a92e7bb67681568779e4a7a7cb93d8fdf49626a9b79478faece",
"generator:cobolrt/Sort.java": "c0c00763b985f8d4f2fd6b764052cd940411552f7c37349cb11814d0343e1262",
"generator:cobolrt/Storage.java": "bf9f9b58fb42e3f5287273714f3ec55d074f42f45ca59bd190849af5d122a0ec",
"generator:cobolrt/Zoned.java": "1fe487feb76a3d8bf6a09f9dcba044f288c585f83484a260f30a0ce57b93aa4e",
"generator:cobolrt/Zoned.java": "8244f9c4e847846349434c8c4c44e2dc10d02fa07b25f7635c68d3df5cbb284c",
"generator:cobolrt/batch/DetFiles.java": "e3e95239ad75ee5f5e6c695eda6f7958d7e77db4febd5e743403c8a8dfefac9c",
"generator:cobolrt/cics/DetCics.java": "b387e95b224033197424e9ebd4c0306561d410f1985ac8253a3028cfab6468d1",
"generator:cobolrt/cics/DetCics.java": "a43284c097b393834302c2abc40b4bfdea8c5ba5a1f316032582b6912dd9937f",
"generator:cobolrt/cics/DetJustify.java": "ecf7fab2a14ac125e87f05d7be9bbb13610d1423fc7410c644d00b5767fb812a",
"generator:cobolrt/cics/DetMq.java": "40204edf5e82cd78739db956e424860a0121cb3ec44e0a9c1e508ed41fcf3187",
"generator:cobolrt/dli/DetDli.java": "9ee267fbcd88f348c5bba5c8b236b4fd97c0cd25769ce8c691fd563b18e78b22",
Expand All @@ -130,21 +131,22 @@
"generator:cobolrt/sql/DetSql.java": "b58a70cc1fc4e675c9f358dbf2230e133426e0213ef082b732bc6fcfe9338698",
"generator:cobolrt/standalone/CobolAbend.java": "f8b72030ecb8862738c562b0c826ff9b1a085d92050664082f96e6107d5dfdb7",
"generator:cobolrt/standalone/Sysout.java": "407512cfedf89455f08193fe4aed96e26fdfc9fd34e8636a662b6574a5645b4f",
"generator:core": "68ac9255b6c72c2f2f6a2dc99d136e378282aec1c9c2c12d130e0769a2d9cb45",
"generator:core": "9f0f6c5957c86ec75a0a8c5891a4d0065e1d2901559a5e69055eef414c16483c",
"generator:det/__init__": "9dedbc9da92e2e4bfd260e7fd5fb78ee2e41a061466c948250d088ffaa464386",
"generator:det/bll": "c877bf4b36ef4b03cc2065ff58fcaaf05354e5021ee77265ad6c88dd47bc15e6",
"generator:det/cics": "70a827abfcf9ca1c2319f7b4e8fbb0d9b149dbb11ea50e5ef423aa44b2f08a8a",
"generator:det/bll": "d2733f29724746445eb38171372d0956fae4beb31b8ebf3259e1cb270cee9d98",
"generator:det/cics": "53777d4d088757d2892d96a52197fe409893cb5471f9d3f70da21260353c471a",
"generator:det/cics_containers": "5fc989229d444423f5b14d2c65a2c7c541efbe6cd0e5dc5a833beaf90c578b6b",
"generator:det/cvda": "894dce1a06a317be4fee0935fba219b066ef141e48f783953a5fe85c16338e26",
"generator:det/dli": "834aba674d85c25af1299ae19d8b49288f4bd831b578889d9bf40d83b5fea342",
"generator:det/dyncall": "19e29320d37a470811447e91448a577f53b1910f291371fc0889999b5f9f630a",
"generator:det/dyncall": "bd15eb2918020d644135fd7f2565937f836b05a223de5ca05af33f0ec7fb0a4f",
"generator:det/entity": "b6aa37067dc0413f6700ac83e7dd35610d8e2474aa607bdf54b5b8419ee4c7d6",
"generator:det/expr": "50f53f541efb6853fd8a97ba022a97e8a4f691d2bbde8655293f47f77f47a0af",
"generator:det/gen": "a3c01de91fac1bd5ea6a7be7a3ee22e40fba44ce5a34ebb45efc53c556ffba20",
"generator:det/expr": "fbb3c70683ccd2e64382901efe4846b8d908a8c3c7c9bfa9641c6ff6d48a9c4d",
"generator:det/gen": "3d4da1a24a8d52230b5a383005aa128dcdb6076be8a776e3e0c53de7184bf174",
"generator:det/hfp": "7371422d1821ad22c526f9ba0e37deaa0ffc38ed190c6ad76e7475d820df95a1",
"generator:det/layout": "e3c70e4dcbb512324b5b16a57dac4010e60d18b7926c06fff5edbd6cf1a79e3e",
"generator:det/mq": "25055224f7c943069e828db7a79887ca1f4e6f4a06ec3b9781c97b31226491a0",
"generator:det/osvs": "4ca3599a4d9a49bd17def291a921278d6f4f45858f65acaf75ae817c17644dd5",
"generator:det/program": "858a1a38920a09c8617b6ae593524ed6f40a1b1d3302b7f2f0f870351c120709",
"generator:det/program": "6c0afebabfbb2b25651eed8c83f95672b1696bb6683af32f107c46f7264bb7fd",
"generator:det/refine": "4daa99d7534a589b4b46b8517f4109b95f64c956cd101a890e57b6a59eac4e44",
"generator:det/source": "8bd64a1f9b6a3f3ae66fd9f8380a206be5a1601cdb84a24209f659822ce4919f",
"generator:det/sql": "7e45e405297510ec80e92b82c55d58e861bcfb37af4bc6a26a475798795ffd45",
Expand Down Expand Up @@ -185,10 +187,10 @@
}
}
},
"digest": "acf90989305bdeab3babfcdebb17e1cc5d0e4e47620586253a1b4e51e6fb7821"
"digest": "35b6a7e7cd99a84f4eaf64f640317bef72c84df042e5cd362d702d8fdf18b4e2"
},
"proof": {
"at": "2026-10-16T18:30:43Z",
"at": "2026-10-17T11:31:44Z",
"verdict": "proven",
"runs": 5,
"fault_runs": 0,
Expand Down Expand Up @@ -222,8 +224,8 @@
"sysout_compared": null,
"attributes_compared": null,
"java_failed": false,
"harness_commit": "f47c7b187d4d7e72fcb0993486b256d60827f223+uncommitted",
"inputs_digest": "acf90989305bdeab3babfcdebb17e1cc5d0e4e47620586253a1b4e51e6fb7821"
"harness_commit": "ab9b1b6cb79309cf6fc158544a3c4a860c8f9f26",
"inputs_digest": "35b6a7e7cd99a84f4eaf64f640317bef72c84df042e5cd362d702d8fdf18b4e2"
},
"coverage": {
"paragraphs": {
Expand All @@ -238,7 +240,7 @@
"handler_labels": null,
"source": "tests/cics_crucible/coverage.json#programs/pc-wizard/PCCONF",
"ledger_sha256": "3f9d5d6b0dc94e0c8b7fa7331a887cf2ac93b37bc98604be333c13bd0ba14213",
"inputs_digest": "acf90989305bdeab3babfcdebb17e1cc5d0e4e47620586253a1b4e51e6fb7821"
"inputs_digest": "35b6a7e7cd99a84f4eaf64f640317bef72c84df042e5cd362d702d8fdf18b4e2"
},
"reach": {
"entry_points": [
Expand Down Expand Up @@ -272,7 +274,7 @@
"ported_unproven": 0
},
"generated_compared": true,
"port_sha256": "a03a83ab9aa07b13cb2285c1dae4949fa702914c85b4720fdafc1edc5338f9be"
"port_sha256": "8d3a01d203b0ba9671771ae66e05ab140c2559c66cee85820a8dde3ddcde121f"
},
"mutation": {
"commit": "be2561306",
Expand Down Expand Up @@ -335,7 +337,7 @@
"provenance_file": {
"path": "tests/cics_crucible/ports/pc-wizard/PCCONF/provenance.json",
"format": "cics-crucible-port/1",
"sha256": "7ac8bd80c3722dd6f9c72961992b255e8a7d57a553574fafa32d31a6bfb2ab79"
"sha256": "1cf0a4b293214dbd0146fbf3a1b4a9c5fad932f7e5f8aa76db0609c0d822c59e"
},
"crucible_ref_proven": "v0.9.0 (3ca75ae0)"
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -823,6 +823,17 @@ public static BigDecimal receiverNum(Field f, Charset cs) {
return num(f, cs);
}

/** The current value of a STRING / UNSTRING POINTER, an UNSTRING TALLYING IN or an INSPECT TALLYING counter (#4692,
* register C11): the statement reads the item before it stores, as ADD does its receiver. A zoned item holding a
* non-digit is refused by name for the same reason as {@link #receiverNum}; a digit-only one is read as ever. */
// [rule RT-CBL-COUNTER-NONDIGIT-REFUSED]
public static BigDecimal counterNum(Field f, Charset cs) {
if (f.kind == Field.Kind.NUMERIC_DISPLAY && Zoned.get(f, cs).dirty) {
throw Zoned.refuseCounter();
}
return num(f, cs);
}

/** A numeric item's value in a comparison (#4662): a zoned item holding a non-digit as the oracle compares it. */
// [rule RT-CBL-COMPARE-NONDIGIT]
public static BigDecimal cmpNum(Field f, Charset cs) {
Expand Down Expand Up @@ -1319,7 +1330,7 @@ private static boolean matches(byte[] hay, int at, byte[] pat) {
public static boolean string(Field into, Field pointer, Charset cs, StringPart... parts) {
int off = 0;
if (pointer != null) {
BigDecimal p = num(pointer, cs);
BigDecimal p = counterNum(pointer, cs);
if (p.compareTo(BigDecimal.ONE) < 0 || p.compareTo(BigDecimal.valueOf(into.len)) > 0) return true;
off = p.intValue() - 1;
}
Expand Down Expand Up @@ -1403,7 +1414,7 @@ public static boolean unstring(Field src, Field pointer, Field tallying, List<De
byte[] data = src.raw();
int off = 0;
if (pointer != null) {
BigDecimal p = num(pointer, cs);
BigDecimal p = counterNum(pointer, cs);
if (p.compareTo(BigDecimal.ONE) < 0 || p.compareTo(BigDecimal.valueOf(data.length)) > 0) return true;
off = p.intValue() - 1;
}
Expand Down Expand Up @@ -1440,7 +1451,7 @@ public static boolean unstring(Field src, Field pointer, Field tallying, List<De
filled++;
}
if (pointer != null) store(pointer, BigDecimal.valueOf(off + 1), false, cs);
if (tallying != null) store(tallying, num(tallying, cs).add(BigDecimal.valueOf(filled)), false, cs);
if (tallying != null) store(tallying, counterNum(tallying, cs).add(BigDecimal.valueOf(filled)), false, cs);
return off < data.length;
}

Expand Down Expand Up @@ -1588,7 +1599,7 @@ public static void inspect(Field target, Charset cs, Clause... clauses) {
for (int ci = 0; ci < clauses.length; ci++) {
Clause c = clauses[ci];
if (c.counter != null) {
store(c.counter, num(c.counter, cs).add(BigDecimal.valueOf(counts[ci])), false, cs);
store(c.counter, counterNum(c.counter, cs).add(BigDecimal.valueOf(counts[ci])), false, cs);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,12 @@ static UnsupportedOperationException refuseReceiver() {
return refuse("arithmetic whose receiver is");
}

/** The refusal of a non-digit in a POINTER / TALLYING item a STRING, UNSTRING or INSPECT reads before it stores
* (#4692). */
static UnsupportedOperationException refuseCounter() {
return refuse("a STRING / UNSTRING pointer or tallying counter that is");
}

private static BigDecimal scaled(BigInteger v, boolean neg, int scale) {
return new BigDecimal(neg ? v.negate() : v, scale);
}
Expand Down
18 changes: 18 additions & 0 deletions tests/cics_crucible/ports/pc-wizard/PCCONF/provenance.json
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,24 @@
"runTask",
"handleTransaction"
]
},
{
"at": "2026-10-17T11:04:21+00:00",
"crucible_ref": "v0.9.0 (3ca75ae0)",
"summary": {
"back-and-fix": "1/1",
"back-clear-keeps-amount": "1/1",
"clear-and-bad-amount": "1/1",
"happy-post": "1/1",
"mapfail-clear-cancel": "1/1"
},
"port_sha256": "161388fe08f0c7a584090d56e636e9f6ac1fe7d324a952b18b58781363fb5eba",
"harness_commit": "75870682605183a7bb7be876a65f265af83a86fe",
"by": "tests/tools/crucible_port_provenance.py reprove (cics_crucible.py --sides java-ported java-facade --program PCCONF --report-dir)",
"entry_points": [
"runTask",
"handleTransaction"
]
}
]
}
Expand Down
Loading
Loading