occam-verify-cli 0.0.470 → 0.0.472
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/lib/constants.js +4 -8
- package/lib/context/file.js +9 -9
- package/lib/context/metaproof.js +38 -32
- package/lib/context/proof.js +35 -29
- package/lib/equality.js +22 -0
- package/lib/metaSubstitution.js +12 -52
- package/lib/rule.js +15 -19
- package/lib/step/metaproof.js +114 -0
- package/lib/step/proof.js +68 -0
- package/lib/substitution.js +16 -56
- package/lib/utilities/array.js +2 -5
- package/lib/utilities/node.js +105 -0
- package/lib/verify/antecedent.js +4 -4
- package/lib/verify/derivation.js +16 -18
- package/lib/verify/equality.js +18 -5
- package/lib/verify/metaDerivation.js +16 -18
- package/lib/verify/metaproof.js +10 -51
- package/lib/verify/metastatement/qualified.js +1 -7
- package/lib/verify/metastatement/unqualified.js +2 -9
- package/lib/verify/premiseOrPremises.js +4 -4
- package/lib/verify/proof.js +11 -52
- package/lib/verify/statement/qualified.js +1 -7
- package/lib/verify/statement/unqualified.js +2 -9
- package/package.json +1 -1
- package/src/constants.js +1 -2
- package/src/context/file.js +6 -6
- package/src/context/metaproof.js +32 -31
- package/src/context/proof.js +30 -29
- package/src/equality.js +8 -0
- package/src/metaSubstitution.js +16 -87
- package/src/rule.js +19 -26
- package/src/step/metaproof.js +99 -0
- package/src/step/proof.js +30 -0
- package/src/substitution.js +19 -90
- package/src/utilities/array.js +1 -1
- package/src/utilities/node.js +149 -0
- package/src/verify/antecedent.js +3 -3
- package/src/verify/derivation.js +17 -18
- package/src/verify/equality.js +29 -11
- package/src/verify/metaDerivation.js +17 -18
- package/src/verify/metaproof.js +20 -91
- package/src/verify/metastatement/qualified.js +0 -9
- package/src/verify/metastatement/unqualified.js +1 -12
- package/src/verify/premiseOrPremises.js +3 -3
- package/src/verify/proof.js +21 -92
- package/src/verify/statement/qualified.js +0 -9
- package/src/verify/statement/unqualified.js +1 -13
- package/lib/assertion.js +0 -147
- package/lib/metaAssertion.js +0 -200
- package/lib/utilities/metastatement.js +0 -45
- package/lib/utilities/statement.js +0 -45
- package/src/assertion.js +0 -150
- package/src/metaAssertion.js +0 -245
- package/src/utilities/metastatement.js +0 -50
- package/src/utilities/statement.js +0 -50
package/src/verify/metaproof.js
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import
|
|
3
|
+
import MetaproofStep from "../step/metaproof";
|
|
4
4
|
import verifyMetaDerivation from "../verify/metaDerivation";
|
|
5
5
|
import verifyQualifiedMetastatement from "./metastatement/qualified";
|
|
6
6
|
|
|
7
|
+
import { matchNode } from "../utilities/node";
|
|
7
8
|
import { nodeQuery } from "../utilities/query";
|
|
8
9
|
|
|
9
|
-
const
|
|
10
|
+
const metastatementNodeQuery = nodeQuery("/qualifiedMetastatement/metastatement!"),
|
|
11
|
+
metaDerivationNodeQuery = nodeQuery("/metaproof/metaDerivation!"),
|
|
10
12
|
qualifiedMetastatementNodeQuery = nodeQuery("/metaproof/qualifiedMetastatement!");
|
|
11
13
|
|
|
12
14
|
export default function verifyMetaproof(metaproofNode, conclusion, metaproofContext) {
|
|
@@ -25,23 +27,30 @@ export default function verifyMetaproof(metaproofNode, conclusion, metaproofCont
|
|
|
25
27
|
}
|
|
26
28
|
|
|
27
29
|
if (qualifiedMetastatementNode !== null) {
|
|
30
|
+
metaproofContext.setDerived();
|
|
31
|
+
|
|
28
32
|
qualifiedMetastatementVerified = verifyQualifiedMetastatement(qualifiedMetastatementNode, metaproofContext);
|
|
29
33
|
|
|
34
|
+
metaproofContext.resetDerived();
|
|
35
|
+
|
|
30
36
|
if (qualifiedMetastatementVerified) {
|
|
31
|
-
const
|
|
37
|
+
const metastatementNode = metastatementNodeQuery(qualifiedMetastatementNode),
|
|
38
|
+
metaproofStep = MetaproofStep.fromMetastatementNode(metastatementNode);
|
|
32
39
|
|
|
33
|
-
metaproofContext.
|
|
40
|
+
metaproofContext.addMetaproofStep(metaproofStep);
|
|
34
41
|
}
|
|
35
42
|
}
|
|
36
43
|
|
|
37
44
|
if (metaDerivationVerified || qualifiedMetastatementVerified) {
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
metastatementNode =
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
+
const lastMetaproofStep = metaproofContext.getLastMetaproofStep(),
|
|
46
|
+
metaproofStep = lastMetaproofStep, ///
|
|
47
|
+
metastatementNode = metaproofStep.getMetastatementNode(),
|
|
48
|
+
conclusionMetastatementNode = conclusion.getMetastatementNode(),
|
|
49
|
+
nodeA = metastatementNode, ///
|
|
50
|
+
nodeB = conclusionMetastatementNode, ///
|
|
51
|
+
nodeMatches = matchNode(nodeA, nodeB);
|
|
52
|
+
|
|
53
|
+
metaproofVerified = nodeMatches; ///
|
|
45
54
|
}
|
|
46
55
|
|
|
47
56
|
metaproofVerified ?
|
|
@@ -50,83 +59,3 @@ export default function verifyMetaproof(metaproofNode, conclusion, metaproofCont
|
|
|
50
59
|
|
|
51
60
|
return metaproofVerified;
|
|
52
61
|
}
|
|
53
|
-
|
|
54
|
-
function matchMetaProofMetastatementNode(metaAssertionMetastatementNode, metastatementNode) {
|
|
55
|
-
const metaAssertionNonTerminalNode = metaAssertionMetastatementNode, ///
|
|
56
|
-
nonTerminalNode = metastatementNode, ///
|
|
57
|
-
metaAssertionNonTerminalNodeMatches = matchMetaProofNonTerminalNode(metaAssertionNonTerminalNode, nonTerminalNode),
|
|
58
|
-
metaAssertionMetastatementNodeMatches = metaAssertionNonTerminalNodeMatches; ///
|
|
59
|
-
|
|
60
|
-
return metaAssertionMetastatementNodeMatches;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
function matchMetaProofNode(metaAssertionNode, node) {
|
|
64
|
-
let metaAssertionNodeMatches = false;
|
|
65
|
-
|
|
66
|
-
const nodeTerminalNode = node.isTerminalNode(),
|
|
67
|
-
ruleNodeTerminalNode = metaAssertionNode.isTerminalNode();
|
|
68
|
-
|
|
69
|
-
if (nodeTerminalNode === ruleNodeTerminalNode) {
|
|
70
|
-
if (nodeTerminalNode) {
|
|
71
|
-
const terminalNode = node, ///
|
|
72
|
-
metaAssertionTerminalNode = metaAssertionNode, ///
|
|
73
|
-
metaAssertionTerminalNodeMatches = matchMetaProofTerminalNode(metaAssertionTerminalNode, terminalNode);
|
|
74
|
-
|
|
75
|
-
metaAssertionNodeMatches = metaAssertionTerminalNodeMatches; ///
|
|
76
|
-
} else {
|
|
77
|
-
const nonTerminalNode = node, ///
|
|
78
|
-
metaAssertionNonTerminalNode = metaAssertionNode, ///
|
|
79
|
-
metaAssertionNonTerminalNodeMatches = matchMetaProofNonTerminalNode(metaAssertionNonTerminalNode, nonTerminalNode);
|
|
80
|
-
|
|
81
|
-
metaAssertionNodeMatches = metaAssertionNonTerminalNodeMatches; ///
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
return metaAssertionNodeMatches;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
function matchMetaProofNodes(metaAssertionNodes, nodes) {
|
|
89
|
-
let metaAssertionNodesMatches = false;
|
|
90
|
-
|
|
91
|
-
const nodesLength = nodes.length,
|
|
92
|
-
metaAssertionNodesLength = metaAssertionNodes.length;
|
|
93
|
-
|
|
94
|
-
if (nodesLength === metaAssertionNodesLength) {
|
|
95
|
-
metaAssertionNodesMatches = nodes.every((node, index) => {
|
|
96
|
-
const metaAssertionNode = metaAssertionNodes[index],
|
|
97
|
-
metaAssertionNodeMatches = matchMetaProofNode(metaAssertionNode, node);
|
|
98
|
-
|
|
99
|
-
if (metaAssertionNodeMatches) {
|
|
100
|
-
return true;
|
|
101
|
-
}
|
|
102
|
-
})
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
return metaAssertionNodesMatches;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
function matchMetaProofTerminalNode(metaAssertionTerminalNode, terminalNode) {
|
|
109
|
-
const matches = metaAssertionTerminalNode.match(terminalNode),
|
|
110
|
-
metaAssertionTerminalNodeMatches = matches; ///
|
|
111
|
-
|
|
112
|
-
return metaAssertionTerminalNodeMatches;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
function matchMetaProofNonTerminalNode(metaAssertionNonTerminalNode, nonTerminalNode) {
|
|
116
|
-
let metaAssertionNonTerminalNodeMatches = false;
|
|
117
|
-
|
|
118
|
-
const ruleName = nonTerminalNode.getRuleName(),
|
|
119
|
-
metaAssertionRuleName = metaAssertionNonTerminalNode.getRuleName(); ///
|
|
120
|
-
|
|
121
|
-
if (ruleName === metaAssertionRuleName) {
|
|
122
|
-
const childNodes = nonTerminalNode.getChildNodes(),
|
|
123
|
-
metaAssertionChildNodes = metaAssertionNonTerminalNode.getChildNodes(),
|
|
124
|
-
nodes = childNodes, ///
|
|
125
|
-
metaAssertionNodes = metaAssertionChildNodes, ///
|
|
126
|
-
metaAssertionNodesMatches = matchMetaProofNodes(metaAssertionNodes, nodes);
|
|
127
|
-
|
|
128
|
-
metaAssertionNonTerminalNodeMatches = metaAssertionNodesMatches; ///
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
return metaAssertionNonTerminalNodeMatches;
|
|
132
|
-
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import { nodeAsString } from "../../utilities/string";
|
|
4
3
|
import { nodeQuery, referenceNameFromReferenceNode } from "../../utilities/query";
|
|
5
4
|
|
|
6
5
|
const referenceNodeQuery = nodeQuery("/qualifiedMetastatement/qualification!/reference!"),
|
|
@@ -11,10 +10,6 @@ export default function verifyQualifiedMetastatement(qualifiedMetastatementNode,
|
|
|
11
10
|
|
|
12
11
|
metaproofContext.begin(qualifiedMetastatementNode);
|
|
13
12
|
|
|
14
|
-
const qualifiedMetastatementString = nodeAsString(qualifiedMetastatementNode);
|
|
15
|
-
|
|
16
|
-
metaproofContext.debug(`Verifying the '${qualifiedMetastatementString}' qualified metastatement...`);
|
|
17
|
-
|
|
18
13
|
const metastatementNode = metastatementNodeQuery(qualifiedMetastatementNode);
|
|
19
14
|
|
|
20
15
|
if (metastatementNode !== null) {
|
|
@@ -29,10 +24,6 @@ export default function verifyQualifiedMetastatement(qualifiedMetastatementNode,
|
|
|
29
24
|
}
|
|
30
25
|
}
|
|
31
26
|
|
|
32
|
-
if (qualifiedMetastatementVerified) {
|
|
33
|
-
metaproofContext.info(`Verified the '${qualifiedMetastatementString}' qualified metastatement.`);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
27
|
qualifiedMetastatementVerified ?
|
|
37
28
|
metaproofContext.complete(qualifiedMetastatementNode) :
|
|
38
29
|
metaproofContext.halt(qualifiedMetastatementNode);
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import MetaAssertion from "../../metaAssertion";
|
|
4
3
|
import verifyMetastatement from "../../verify/metastatement";
|
|
5
4
|
|
|
6
5
|
import { nodeQuery } from "../../utilities/query";
|
|
7
|
-
import { nodeAsString } from "../../utilities/string";
|
|
8
6
|
|
|
9
7
|
const metastatementNodeQuery = nodeQuery("/unqualifiedMetastatement/metastatement!");
|
|
10
8
|
|
|
@@ -13,10 +11,6 @@ export default function verifyUnqualifiedMetastatement(unqualifiedMetastatementN
|
|
|
13
11
|
|
|
14
12
|
metaproofContext.begin(unqualifiedMetastatementNode);
|
|
15
13
|
|
|
16
|
-
const unqualifiedMetastatementString = nodeAsString(unqualifiedMetastatementNode);
|
|
17
|
-
|
|
18
|
-
metaproofContext.debug(`Verifying the '${unqualifiedMetastatementString}' unqualified metastatement...`);
|
|
19
|
-
|
|
20
14
|
const metastatementNode = metastatementNodeQuery(unqualifiedMetastatementNode);
|
|
21
15
|
|
|
22
16
|
if (metastatementNode !== null) {
|
|
@@ -26,8 +20,7 @@ export default function verifyUnqualifiedMetastatement(unqualifiedMetastatementN
|
|
|
26
20
|
const derived = metaproofContext.isDerived();
|
|
27
21
|
|
|
28
22
|
if (derived) {
|
|
29
|
-
const
|
|
30
|
-
metaAssertionMatches = metaproofContext.matchMetaAssertion(metaAssertion);
|
|
23
|
+
const metaAssertionMatches = metaproofContext.matchMetastatement(metastatementNode);
|
|
31
24
|
|
|
32
25
|
unqualifiedMetastatementVerified = metaAssertionMatches; ///
|
|
33
26
|
} else {
|
|
@@ -36,10 +29,6 @@ export default function verifyUnqualifiedMetastatement(unqualifiedMetastatementN
|
|
|
36
29
|
}
|
|
37
30
|
}
|
|
38
31
|
|
|
39
|
-
if (unqualifiedMetastatementVerified) {
|
|
40
|
-
metaproofContext.info(`Verified the '${unqualifiedMetastatementString}' unqualified metastatement.`);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
32
|
unqualifiedMetastatementVerified ?
|
|
44
33
|
metaproofContext.complete(unqualifiedMetastatementNode) :
|
|
45
34
|
metaproofContext.halt(unqualifiedMetastatementNode);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
import Premise from "../premise";
|
|
4
|
-
import
|
|
4
|
+
import MetaproofStep from "../step/metaproof";
|
|
5
5
|
import verifyUnqualifiedMetastatement from "../verify/metastatement/unqualified";
|
|
6
6
|
|
|
7
7
|
import { nodeQuery, nodesQuery } from "../utilities/query";
|
|
@@ -21,12 +21,12 @@ export default function verifyPremiseOrPremises(premiseOrPremisesNode, premises,
|
|
|
21
21
|
|
|
22
22
|
if (unqualifiedMetastatementVerified) {
|
|
23
23
|
const metastatementNode = metastatementNodeQuery(unqualifiedMetastatementNode),
|
|
24
|
-
|
|
24
|
+
metaproofStep = MetaproofStep.fromMetastatementNode(metastatementNode),
|
|
25
25
|
premise = Premise.fromMetastatementNode(metastatementNode);
|
|
26
26
|
|
|
27
27
|
premises.push(premise);
|
|
28
28
|
|
|
29
|
-
metaproofContext.
|
|
29
|
+
metaproofContext.addMetaproofStep(metaproofStep);
|
|
30
30
|
|
|
31
31
|
return true;
|
|
32
32
|
}
|
package/src/verify/proof.js
CHANGED
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import
|
|
3
|
+
import ProofStep from "../step/proof";
|
|
4
4
|
import verifyDerivation from "../verify/derivation";
|
|
5
5
|
import verifyQualifiedStatement from "./statement/qualified";
|
|
6
6
|
|
|
7
|
+
import { matchNode } from "../utilities/node";
|
|
7
8
|
import { nodeQuery } from "../utilities/query";
|
|
8
9
|
|
|
9
|
-
const
|
|
10
|
+
const statementNodeQuery = nodeQuery("/qualifiedStatement/statement!"),
|
|
11
|
+
derivationNodeQuery = nodeQuery("/proof/derivation!"),
|
|
10
12
|
qualifiedStatementNodeQuery = nodeQuery("/proof/qualifiedStatement!");
|
|
11
13
|
|
|
12
|
-
export default function verifyProof(proofNode,
|
|
14
|
+
export default function verifyProof(proofNode, conclusion, proofContext) {
|
|
13
15
|
let proofVerified = false;
|
|
14
16
|
|
|
15
17
|
proofContext.begin(proofNode);
|
|
@@ -25,23 +27,30 @@ export default function verifyProof(proofNode, consequent, proofContext) {
|
|
|
25
27
|
}
|
|
26
28
|
|
|
27
29
|
if (qualifiedStatementNode !== null) {
|
|
30
|
+
proofContext.setDerived();
|
|
31
|
+
|
|
28
32
|
qualifiedStatementVerified = verifyQualifiedStatement(qualifiedStatementNode, proofContext);
|
|
29
33
|
|
|
34
|
+
proofContext.resetDerived();
|
|
35
|
+
|
|
30
36
|
if (qualifiedStatementVerified) {
|
|
31
|
-
const
|
|
37
|
+
const statementNode = statementNodeQuery(qualifiedStatementNode),
|
|
38
|
+
proofStep = ProofStep.fromStatementNode(statementNode);
|
|
32
39
|
|
|
33
|
-
proofContext.
|
|
40
|
+
proofContext.addProofStep(proofStep);
|
|
34
41
|
}
|
|
35
42
|
}
|
|
36
43
|
|
|
37
44
|
if (derivationVerified || qualifiedStatementVerified) {
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
statementNode =
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
+
const lastProofStep = proofContext.getLastProofStep(),
|
|
46
|
+
proofStep = lastProofStep, ///
|
|
47
|
+
statementNode = proofStep.getStatementNode(),
|
|
48
|
+
conclusionStatementNode = conclusion.getStatementNode(),
|
|
49
|
+
nodeA = statementNode, ///
|
|
50
|
+
nodeB = conclusionStatementNode, ///
|
|
51
|
+
nodeMatches = matchNode(nodeA, nodeB);
|
|
52
|
+
|
|
53
|
+
proofVerified = nodeMatches; ///
|
|
45
54
|
}
|
|
46
55
|
|
|
47
56
|
proofVerified ?
|
|
@@ -50,83 +59,3 @@ export default function verifyProof(proofNode, consequent, proofContext) {
|
|
|
50
59
|
|
|
51
60
|
return proofVerified;
|
|
52
61
|
}
|
|
53
|
-
|
|
54
|
-
function matchProofStatementNode(assertionStatementNode, statementNode) {
|
|
55
|
-
const assertionNonTerminalNode = assertionStatementNode, ///
|
|
56
|
-
nonTerminalNode = statementNode, ///
|
|
57
|
-
assertionNonTerminalNodeMatches = matchProofNonTerminalNode(assertionNonTerminalNode, nonTerminalNode),
|
|
58
|
-
assertionStatementNodeMatches = assertionNonTerminalNodeMatches; ///
|
|
59
|
-
|
|
60
|
-
return assertionStatementNodeMatches;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
function matchProofNode(assertionNode, node) {
|
|
64
|
-
let assertionNodeMatches = false;
|
|
65
|
-
|
|
66
|
-
const nodeTerminalNode = node.isTerminalNode(),
|
|
67
|
-
ruleNodeTerminalNode = assertionNode.isTerminalNode();
|
|
68
|
-
|
|
69
|
-
if (nodeTerminalNode === ruleNodeTerminalNode) {
|
|
70
|
-
if (nodeTerminalNode) {
|
|
71
|
-
const terminalNode = node, ///
|
|
72
|
-
assertionTerminalNode = assertionNode, ///
|
|
73
|
-
assertionTerminalNodeMatches = matchProofTerminalNode(assertionTerminalNode, terminalNode);
|
|
74
|
-
|
|
75
|
-
assertionNodeMatches = assertionTerminalNodeMatches; ///
|
|
76
|
-
} else {
|
|
77
|
-
const nonTerminalNode = node, ///
|
|
78
|
-
assertionNonTerminalNode = assertionNode, ///
|
|
79
|
-
assertionNonTerminalNodeMatches = matchProofNonTerminalNode(assertionNonTerminalNode, nonTerminalNode);
|
|
80
|
-
|
|
81
|
-
assertionNodeMatches = assertionNonTerminalNodeMatches; ///
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
return assertionNodeMatches;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
function matchProofNodes(assertionNodes, nodes) {
|
|
89
|
-
let assertionNodesMatches = false;
|
|
90
|
-
|
|
91
|
-
const nodesLength = nodes.length,
|
|
92
|
-
assertionNodesLength = assertionNodes.length;
|
|
93
|
-
|
|
94
|
-
if (nodesLength === assertionNodesLength) {
|
|
95
|
-
assertionNodesMatches = nodes.every((node, index) => {
|
|
96
|
-
const assertionNode = assertionNodes[index],
|
|
97
|
-
assertionNodeMatches = matchProofNode(assertionNode, node);
|
|
98
|
-
|
|
99
|
-
if (assertionNodeMatches) {
|
|
100
|
-
return true;
|
|
101
|
-
}
|
|
102
|
-
})
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
return assertionNodesMatches;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
function matchProofTerminalNode(assertionTerminalNode, terminalNode) {
|
|
109
|
-
const matches = assertionTerminalNode.match(terminalNode),
|
|
110
|
-
assertionTerminalNodeMatches = matches; ///
|
|
111
|
-
|
|
112
|
-
return assertionTerminalNodeMatches;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
function matchProofNonTerminalNode(assertionNonTerminalNode, nonTerminalNode) {
|
|
116
|
-
let assertionNonTerminalNodeMatches = false;
|
|
117
|
-
|
|
118
|
-
const ruleName = nonTerminalNode.getRuleName(),
|
|
119
|
-
assertionRuleName = assertionNonTerminalNode.getRuleName(); ///
|
|
120
|
-
|
|
121
|
-
if (ruleName === assertionRuleName) {
|
|
122
|
-
const childNodes = nonTerminalNode.getChildNodes(),
|
|
123
|
-
assertionChildNodes = assertionNonTerminalNode.getChildNodes(),
|
|
124
|
-
nodes = childNodes, ///
|
|
125
|
-
assertionNodes = assertionChildNodes, ///
|
|
126
|
-
assertionNodesMatches = matchProofNodes(assertionNodes, nodes);
|
|
127
|
-
|
|
128
|
-
assertionNonTerminalNodeMatches = assertionNodesMatches; ///
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
return assertionNonTerminalNodeMatches;
|
|
132
|
-
}
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
import verifyStatement from "../../verify/statement";
|
|
4
4
|
|
|
5
|
-
import { nodeAsString } from "../../utilities/string";
|
|
6
5
|
import { nodeQuery, referenceNameFromReferenceNode } from "../../utilities/query";
|
|
7
6
|
|
|
8
7
|
const statementNodeQuery = nodeQuery("/qualifiedStatement/statement!"),
|
|
@@ -13,10 +12,6 @@ export default function verifyQualifiedStatement(qualifiedStatementNode, proofCo
|
|
|
13
12
|
|
|
14
13
|
proofContext.begin(qualifiedStatementNode);
|
|
15
14
|
|
|
16
|
-
const qualifiedStatementString = nodeAsString(qualifiedStatementNode);
|
|
17
|
-
|
|
18
|
-
proofContext.debug(`Verifying the '${qualifiedStatementString}' qualified statement...`);
|
|
19
|
-
|
|
20
15
|
const statementNode = statementNodeQuery(qualifiedStatementNode);
|
|
21
16
|
|
|
22
17
|
if (statementNode !== null) {
|
|
@@ -33,10 +28,6 @@ export default function verifyQualifiedStatement(qualifiedStatementNode, proofCo
|
|
|
33
28
|
}
|
|
34
29
|
}
|
|
35
30
|
|
|
36
|
-
if (qualifiedStatementVerified) {
|
|
37
|
-
proofContext.info(`Verified the '${qualifiedStatementString}' qualified statement.`);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
31
|
qualifiedStatementVerified ?
|
|
41
32
|
proofContext.complete(qualifiedStatementNode) :
|
|
42
33
|
proofContext.halt(qualifiedStatementNode);
|
|
@@ -2,10 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import verifyStatement from "../../verify/statement";
|
|
4
4
|
|
|
5
|
-
import Assertion from "../../assertion";
|
|
6
|
-
|
|
7
5
|
import { nodeQuery } from "../../utilities/query";
|
|
8
|
-
import { nodeAsString } from "../../utilities/string";
|
|
9
6
|
|
|
10
7
|
const statementNodeQuery = nodeQuery("/unqualifiedStatement/statement!");
|
|
11
8
|
|
|
@@ -14,10 +11,6 @@ export default function verifyUnqualifiedStatement(unqualifiedStatementNode, pro
|
|
|
14
11
|
|
|
15
12
|
proofContext.begin(unqualifiedStatementNode);
|
|
16
13
|
|
|
17
|
-
const unqualifiedStatementString = nodeAsString(unqualifiedStatementNode);
|
|
18
|
-
|
|
19
|
-
proofContext.debug(`Verifying the '${unqualifiedStatementString}' unqualified statement...`);
|
|
20
|
-
|
|
21
14
|
const statementNode = statementNodeQuery(unqualifiedStatementNode);
|
|
22
15
|
|
|
23
16
|
if (statementNode !== null) {
|
|
@@ -27,8 +20,7 @@ export default function verifyUnqualifiedStatement(unqualifiedStatementNode, pro
|
|
|
27
20
|
const derived = proofContext.isDerived();
|
|
28
21
|
|
|
29
22
|
if (derived) {
|
|
30
|
-
const
|
|
31
|
-
assertionMatches = proofContext.matchAssertion(assertion);
|
|
23
|
+
const assertionMatches = proofContext.matchStatement(statementNode);
|
|
32
24
|
|
|
33
25
|
unqualifiedStatementVerified = assertionMatches; ///
|
|
34
26
|
} else {
|
|
@@ -37,10 +29,6 @@ export default function verifyUnqualifiedStatement(unqualifiedStatementNode, pro
|
|
|
37
29
|
}
|
|
38
30
|
}
|
|
39
31
|
|
|
40
|
-
if (unqualifiedStatementVerified) {
|
|
41
|
-
proofContext.info(`Verified the '${unqualifiedStatementString}' unqualified statement.`);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
32
|
unqualifiedStatementVerified ?
|
|
45
33
|
proofContext.complete(unqualifiedStatementNode) :
|
|
46
34
|
proofContext.halt(unqualifiedStatementNode);
|
package/lib/assertion.js
DELETED
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
Object.defineProperty(exports, "default", {
|
|
6
|
-
enumerable: true,
|
|
7
|
-
get: function() {
|
|
8
|
-
return Assertion;
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
var _query = require("./utilities/query");
|
|
12
|
-
function _classCallCheck(instance, Constructor) {
|
|
13
|
-
if (!(instance instanceof Constructor)) {
|
|
14
|
-
throw new TypeError("Cannot call a class as a function");
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
function _defineProperties(target, props) {
|
|
18
|
-
for(var i = 0; i < props.length; i++){
|
|
19
|
-
var descriptor = props[i];
|
|
20
|
-
descriptor.enumerable = descriptor.enumerable || false;
|
|
21
|
-
descriptor.configurable = true;
|
|
22
|
-
if ("value" in descriptor) descriptor.writable = true;
|
|
23
|
-
Object.defineProperty(target, descriptor.key, descriptor);
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
function _createClass(Constructor, protoProps, staticProps) {
|
|
27
|
-
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
|
|
28
|
-
if (staticProps) _defineProperties(Constructor, staticProps);
|
|
29
|
-
return Constructor;
|
|
30
|
-
}
|
|
31
|
-
var statementNodeQuery = (0, _query.nodeQuery)("/*/statement!");
|
|
32
|
-
var Assertion = /*#__PURE__*/ function() {
|
|
33
|
-
function Assertion(subproofNode, statementNode) {
|
|
34
|
-
_classCallCheck(this, Assertion);
|
|
35
|
-
this.subproofNode = subproofNode;
|
|
36
|
-
this.statementNode = statementNode;
|
|
37
|
-
}
|
|
38
|
-
_createClass(Assertion, [
|
|
39
|
-
{
|
|
40
|
-
key: "getNonTerminalNode",
|
|
41
|
-
value: function getNonTerminalNode() {
|
|
42
|
-
var nonTerminalNode = this.statementNode !== null ? this.statementNode : null;
|
|
43
|
-
return nonTerminalNode;
|
|
44
|
-
}
|
|
45
|
-
},
|
|
46
|
-
{
|
|
47
|
-
key: "getSubproofNode",
|
|
48
|
-
value: function getSubproofNode() {
|
|
49
|
-
return this.subproofNode;
|
|
50
|
-
}
|
|
51
|
-
},
|
|
52
|
-
{
|
|
53
|
-
key: "getStatementNode",
|
|
54
|
-
value: function getStatementNode() {
|
|
55
|
-
return this.statementNode;
|
|
56
|
-
}
|
|
57
|
-
},
|
|
58
|
-
{
|
|
59
|
-
key: "match",
|
|
60
|
-
value: function match(assertion) {
|
|
61
|
-
var matches = false;
|
|
62
|
-
var statementNode = assertion.getstatementNode();
|
|
63
|
-
if (statementNode !== null && this.statementNode !== null) {
|
|
64
|
-
var nonTerminalNode = this.statementNode, assertionNonTerminalNode = statementNode, assertionNonTerminalNodeMatches = matchAssertionNonTerminalNode(assertionNonTerminalNode, nonTerminalNode);
|
|
65
|
-
matches = assertionNonTerminalNodeMatches; ///
|
|
66
|
-
}
|
|
67
|
-
return matches;
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
], [
|
|
71
|
-
{
|
|
72
|
-
key: "fromSubproofNode",
|
|
73
|
-
value: function fromSubproofNode(subproofNode) {
|
|
74
|
-
var statementNode = null, assertion = new Assertion(subproofNode, statementNode);
|
|
75
|
-
return assertion;
|
|
76
|
-
}
|
|
77
|
-
},
|
|
78
|
-
{
|
|
79
|
-
key: "fromStatementNode",
|
|
80
|
-
value: function fromStatementNode(statementNode) {
|
|
81
|
-
var subproofNode = null, assertion = new Assertion(subproofNode, statementNode);
|
|
82
|
-
return assertion;
|
|
83
|
-
}
|
|
84
|
-
},
|
|
85
|
-
{
|
|
86
|
-
key: "fromQualifiedStatementNode",
|
|
87
|
-
value: function fromQualifiedStatementNode(qualifiedStatementNode) {
|
|
88
|
-
var subproofNode = null, statementNode = statementNodeQuery(qualifiedStatementNode), assertion = new Assertion(subproofNode, statementNode);
|
|
89
|
-
return assertion;
|
|
90
|
-
}
|
|
91
|
-
},
|
|
92
|
-
{
|
|
93
|
-
key: "fromUnqualifiedStatementNode",
|
|
94
|
-
value: function fromUnqualifiedStatementNode(unqualifiedStatementNode) {
|
|
95
|
-
var subproofNode = null, statementNode = statementNodeQuery(unqualifiedStatementNode), assertion = new Assertion(subproofNode, statementNode);
|
|
96
|
-
return assertion;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
]);
|
|
100
|
-
return Assertion;
|
|
101
|
-
}();
|
|
102
|
-
function matchAssertionNode(assertionNode, node) {
|
|
103
|
-
var assertionNodeMatches = false;
|
|
104
|
-
var nodeTerminalNode = node.isTerminalNode(), ruleNodeTerminalNode = assertionNode.isTerminalNode();
|
|
105
|
-
if (nodeTerminalNode === ruleNodeTerminalNode) {
|
|
106
|
-
if (nodeTerminalNode) {
|
|
107
|
-
var terminalNode = node, assertionTerminalNode = assertionNode, assertionTerminalNodeMatches = matchAssertionTerminalNode(assertionTerminalNode, terminalNode);
|
|
108
|
-
assertionNodeMatches = assertionTerminalNodeMatches; ///
|
|
109
|
-
} else {
|
|
110
|
-
var nonTerminalNode = node, assertionNonTerminalNode = assertionNode, assertionNonTerminalNodeMatches = matchAssertionNonTerminalNode(assertionNonTerminalNode, nonTerminalNode);
|
|
111
|
-
assertionNodeMatches = assertionNonTerminalNodeMatches; ///
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
return assertionNodeMatches;
|
|
115
|
-
}
|
|
116
|
-
function matchAssertionChildNodes(assertionChildNodes, childNodes) {
|
|
117
|
-
var assertionChildNodesMatches = false;
|
|
118
|
-
var childNodesLength = childNodes.length, assertionChildNodesLength = assertionChildNodes.length;
|
|
119
|
-
if (childNodesLength === assertionChildNodesLength) {
|
|
120
|
-
assertionChildNodesMatches = childNodes.every(function(childNode, index) {
|
|
121
|
-
var assertionChildNode = assertionChildNodes[index], assertionNode = assertionChildNode, node = childNode, assertionNodeMatches = matchAssertionNode(assertionNode, node);
|
|
122
|
-
if (assertionNodeMatches) {
|
|
123
|
-
return true;
|
|
124
|
-
}
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
|
-
return assertionChildNodesMatches;
|
|
128
|
-
}
|
|
129
|
-
function matchAssertionTerminalNode(assertionTerminalNode, terminalNode) {
|
|
130
|
-
var assertionTerminalNodeMatches = false;
|
|
131
|
-
var matches = assertionTerminalNode.match(terminalNode);
|
|
132
|
-
if (matches) {
|
|
133
|
-
assertionTerminalNodeMatches = true;
|
|
134
|
-
}
|
|
135
|
-
return assertionTerminalNodeMatches;
|
|
136
|
-
}
|
|
137
|
-
function matchAssertionNonTerminalNode(assertionNonTerminalNode, nonTerminalNode) {
|
|
138
|
-
var assertionNonTerminalNodeMatches = false;
|
|
139
|
-
var ruleName = nonTerminalNode.getRuleName(), assertionRuleName = assertionNonTerminalNode.getRuleName(); ///
|
|
140
|
-
if (ruleName === assertionRuleName) {
|
|
141
|
-
var childNodes = nonTerminalNode.getChildNodes(), assertionChildNodes = assertionNonTerminalNode.getChildNodes(), assertionChildNodesMatches = matchAssertionChildNodes(assertionChildNodes, childNodes);
|
|
142
|
-
assertionNonTerminalNodeMatches = assertionChildNodesMatches; ///
|
|
143
|
-
}
|
|
144
|
-
return assertionNonTerminalNodeMatches;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9hc3NlcnRpb24uanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7IG5vZGVRdWVyeSB9IGZyb20gXCIuL3V0aWxpdGllcy9xdWVyeVwiO1xuXG5jb25zdCBzdGF0ZW1lbnROb2RlUXVlcnkgPSBub2RlUXVlcnkoXCIvKi9zdGF0ZW1lbnQhXCIpO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBc3NlcnRpb24ge1xuICBjb25zdHJ1Y3RvcihzdWJwcm9vZk5vZGUsIHN0YXRlbWVudE5vZGUpIHtcbiAgICB0aGlzLnN1YnByb29mTm9kZSA9IHN1YnByb29mTm9kZTtcbiAgICB0aGlzLnN0YXRlbWVudE5vZGUgPSBzdGF0ZW1lbnROb2RlO1xuICB9XG5cbiAgZ2V0Tm9uVGVybWluYWxOb2RlKCkge1xuICAgIGNvbnN0IG5vblRlcm1pbmFsTm9kZSA9ICh0aGlzLnN0YXRlbWVudE5vZGUgIT09IG51bGwpID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlbWVudE5vZGUgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbDtcblxuICAgIHJldHVybiBub25UZXJtaW5hbE5vZGU7XG4gIH1cblxuICBnZXRTdWJwcm9vZk5vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3VicHJvb2ZOb2RlO1xuICB9XG5cbiAgZ2V0U3RhdGVtZW50Tm9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnROb2RlO1xuICB9XG5cbiAgbWF0Y2goYXNzZXJ0aW9uKSB7XG4gICAgbGV0IG1hdGNoZXMgPSBmYWxzZTtcblxuICAgIGNvbnN0IHN0YXRlbWVudE5vZGUgPSBhc3NlcnRpb24uZ2V0c3RhdGVtZW50Tm9kZSgpO1xuXG4gICAgaWYgKChzdGF0ZW1lbnROb2RlICE9PSBudWxsKSAmJiAodGhpcy5zdGF0ZW1lbnROb2RlICE9PSBudWxsKSkge1xuICAgICAgY29uc3Qgbm9uVGVybWluYWxOb2RlID0gdGhpcy5zdGF0ZW1lbnROb2RlLCAvLy9cbiAgICAgICAgICAgIGFzc2VydGlvbk5vblRlcm1pbmFsTm9kZSA9IHN0YXRlbWVudE5vZGUsIC8vL1xuICAgICAgICAgICAgYXNzZXJ0aW9uTm9uVGVybWluYWxOb2RlTWF0Y2hlcyA9IG1hdGNoQXNzZXJ0aW9uTm9uVGVybWluYWxOb2RlKGFzc2VydGlvbk5vblRlcm1pbmFsTm9kZSwgbm9uVGVybWluYWxOb2RlKTtcblxuICAgICAgbWF0Y2hlcyA9IGFzc2VydGlvbk5vblRlcm1pbmFsTm9kZU1hdGNoZXM7ICAvLy9cbiAgICB9XG5cbiAgICByZXR1cm4gbWF0Y2hlcztcbiAgfVxuXG4gIHN0YXRpYyBmcm9tU3VicHJvb2ZOb2RlKHN1YnByb29mTm9kZSkge1xuICAgIGNvbnN0IHN0YXRlbWVudE5vZGUgPSBudWxsLFxuICAgICAgICAgIGFzc2VydGlvbiA9IG5ldyBBc3NlcnRpb24oc3VicHJvb2ZOb2RlLCBzdGF0ZW1lbnROb2RlKTtcblxuICAgIHJldHVybiBhc3NlcnRpb247XG4gIH1cblxuICBzdGF0aWMgZnJvbVN0YXRlbWVudE5vZGUoc3RhdGVtZW50Tm9kZSkge1xuICAgIGNvbnN0IHN1YnByb29mTm9kZSA9IG51bGwsXG4gICAgICAgICAgYXNzZXJ0aW9uID0gbmV3IEFzc2VydGlvbihzdWJwcm9vZk5vZGUsIHN0YXRlbWVudE5vZGUpO1xuXG4gICAgcmV0dXJuIGFzc2VydGlvbjtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tUXVhbGlmaWVkU3RhdGVtZW50Tm9kZShxdWFsaWZpZWRTdGF0ZW1lbnROb2RlKSB7XG4gICAgY29uc3Qgc3VicHJvb2ZOb2RlID0gbnVsbCxcbiAgICAgICAgICBzdGF0ZW1lbnROb2RlID0gc3RhdGVtZW50Tm9kZVF1ZXJ5KHF1YWxpZmllZFN0YXRlbWVudE5vZGUpLFxuICAgICAgICAgIGFzc2VydGlvbiA9IG5ldyBBc3NlcnRpb24oc3VicHJvb2ZOb2RlLCBzdGF0ZW1lbnROb2RlKTtcblxuICAgIHJldHVybiBhc3NlcnRpb247XG4gIH1cblxuICBzdGF0aWMgZnJvbVVucXVhbGlmaWVkU3RhdGVtZW50Tm9kZSh1bnF1YWxpZmllZFN0YXRlbWVudE5vZGUpIHtcbiAgICBjb25zdCBzdWJwcm9vZk5vZGUgPSBudWxsLFxuICAgICAgICAgIHN0YXRlbWVudE5vZGUgPSBzdGF0ZW1lbnROb2RlUXVlcnkodW5xdWFsaWZpZWRTdGF0ZW1lbnROb2RlKSxcbiAgICAgICAgICBhc3NlcnRpb24gPSBuZXcgQXNzZXJ0aW9uKHN1YnByb29mTm9kZSwgc3RhdGVtZW50Tm9kZSk7XG5cbiAgICByZXR1cm4gYXNzZXJ0aW9uO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hdGNoQXNzZXJ0aW9uTm9kZShhc3NlcnRpb25Ob2RlLCBub2RlKSB7XG4gIGxldCBhc3NlcnRpb25Ob2RlTWF0Y2hlcyA9IGZhbHNlO1xuXG4gIGNvbnN0IG5vZGVUZXJtaW5hbE5vZGUgPSBub2RlLmlzVGVybWluYWxOb2RlKCksXG4gICAgICAgIHJ1bGVOb2RlVGVybWluYWxOb2RlID0gYXNzZXJ0aW9uTm9kZS5pc1Rlcm1pbmFsTm9kZSgpO1xuXG4gIGlmIChub2RlVGVybWluYWxOb2RlID09PSBydWxlTm9kZVRlcm1pbmFsTm9kZSkge1xuICAgIGlmIChub2RlVGVybWluYWxOb2RlKSB7XG4gICAgICBjb25zdCB0ZXJtaW5hbE5vZGUgPSBub2RlLCAgLy8vXG4gICAgICAgICAgICBhc3NlcnRpb25UZXJtaW5hbE5vZGUgPSBhc3NlcnRpb25Ob2RlLCAgLy8vXG4gICAgICAgICAgICBhc3NlcnRpb25UZXJtaW5hbE5vZGVNYXRjaGVzID0gbWF0Y2hBc3NlcnRpb25UZXJtaW5hbE5vZGUoYXNzZXJ0aW9uVGVybWluYWxOb2RlLCB0ZXJtaW5hbE5vZGUpO1xuXG4gICAgICBhc3NlcnRpb25Ob2RlTWF0Y2hlcyA9IGFzc2VydGlvblRlcm1pbmFsTm9kZU1hdGNoZXM7ICAvLy9cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgbm9uVGVybWluYWxOb2RlID0gbm9kZSwgLy8vXG4gICAgICAgICAgICBhc3NlcnRpb25Ob25UZXJtaW5hbE5vZGUgPSBhc3NlcnRpb25Ob2RlLCAgLy8vXG4gICAgICAgICAgICBhc3NlcnRpb25Ob25UZXJtaW5hbE5vZGVNYXRjaGVzID0gbWF0Y2hBc3NlcnRpb25Ob25UZXJtaW5hbE5vZGUoYXNzZXJ0aW9uTm9uVGVybWluYWxOb2RlLCBub25UZXJtaW5hbE5vZGUpO1xuXG4gICAgICBhc3NlcnRpb25Ob2RlTWF0Y2hlcyA9IGFzc2VydGlvbk5vblRlcm1pbmFsTm9kZU1hdGNoZXM7IC8vL1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhc3NlcnRpb25Ob2RlTWF0Y2hlcztcbn1cblxuZnVuY3Rpb24gbWF0Y2hBc3NlcnRpb25DaGlsZE5vZGVzKGFzc2VydGlvbkNoaWxkTm9kZXMsIGNoaWxkTm9kZXMpIHtcbiAgbGV0IGFzc2VydGlvbkNoaWxkTm9kZXNNYXRjaGVzID0gZmFsc2U7XG5cbiAgY29uc3QgY2hpbGROb2Rlc0xlbmd0aCA9IGNoaWxkTm9kZXMubGVuZ3RoLFxuICAgICAgICBhc3NlcnRpb25DaGlsZE5vZGVzTGVuZ3RoID0gYXNzZXJ0aW9uQ2hpbGROb2Rlcy5sZW5ndGg7XG5cbiAgaWYgKGNoaWxkTm9kZXNMZW5ndGggPT09IGFzc2VydGlvbkNoaWxkTm9kZXNMZW5ndGgpIHtcbiAgICBhc3NlcnRpb25DaGlsZE5vZGVzTWF0Y2hlcyA9IGNoaWxkTm9kZXMuZXZlcnkoKGNoaWxkTm9kZSwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGFzc2VydGlvbkNoaWxkTm9kZSA9IGFzc2VydGlvbkNoaWxkTm9kZXNbaW5kZXhdLFxuICAgICAgICAgICAgYXNzZXJ0aW9uTm9kZSA9IGFzc2VydGlvbkNoaWxkTm9kZSwgLy8vXG4gICAgICAgICAgICBub2RlID0gY2hpbGROb2RlLCAvLy9cbiAgICAgICAgICAgIGFzc2VydGlvbk5vZGVNYXRjaGVzID0gbWF0Y2hBc3NlcnRpb25Ob2RlKGFzc2VydGlvbk5vZGUsIG5vZGUpO1xuXG4gICAgICBpZiAoYXNzZXJ0aW9uTm9kZU1hdGNoZXMpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBhc3NlcnRpb25DaGlsZE5vZGVzTWF0Y2hlcztcbn1cblxuZnVuY3Rpb24gbWF0Y2hBc3NlcnRpb25UZXJtaW5hbE5vZGUoYXNzZXJ0aW9uVGVybWluYWxOb2RlLCB0ZXJtaW5hbE5vZGUpIHtcbiAgbGV0IGFzc2VydGlvblRlcm1pbmFsTm9kZU1hdGNoZXMgPSBmYWxzZTtcblxuICBjb25zdCBtYXRjaGVzID0gYXNzZXJ0aW9uVGVybWluYWxOb2RlLm1hdGNoKHRlcm1pbmFsTm9kZSk7XG5cbiAgaWYgKG1hdGNoZXMpIHtcbiAgICBhc3NlcnRpb25UZXJtaW5hbE5vZGVNYXRjaGVzID0gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBhc3NlcnRpb25UZXJtaW5hbE5vZGVNYXRjaGVzO1xufVxuXG5mdW5jdGlvbiBtYXRjaEFzc2VydGlvbk5vblRlcm1pbmFsTm9kZShhc3NlcnRpb25Ob25UZXJtaW5hbE5vZGUsIG5vblRlcm1pbmFsTm9kZSkge1xuICBsZXQgYXNzZXJ0aW9uTm9uVGVybWluYWxOb2RlTWF0Y2hlcyA9IGZhbHNlO1xuXG4gIGNvbnN0IHJ1bGVOYW1lID0gbm9uVGVybWluYWxOb2RlLmdldFJ1bGVOYW1lKCksXG4gICAgICAgIGFzc2VydGlvblJ1bGVOYW1lID0gYXNzZXJ0aW9uTm9uVGVybWluYWxOb2RlLmdldFJ1bGVOYW1lKCk7IC8vL1xuXG4gIGlmIChydWxlTmFtZSA9PT0gYXNzZXJ0aW9uUnVsZU5hbWUpIHtcbiAgICBjb25zdCBjaGlsZE5vZGVzID0gbm9uVGVybWluYWxOb2RlLmdldENoaWxkTm9kZXMoKSxcbiAgICAgICAgICBhc3NlcnRpb25DaGlsZE5vZGVzID0gYXNzZXJ0aW9uTm9uVGVybWluYWxOb2RlLmdldENoaWxkTm9kZXMoKSxcbiAgICAgICAgICBhc3NlcnRpb25DaGlsZE5vZGVzTWF0Y2hlcyA9IG1hdGNoQXNzZXJ0aW9uQ2hpbGROb2Rlcyhhc3NlcnRpb25DaGlsZE5vZGVzLCBjaGlsZE5vZGVzKTtcblxuICAgIGFzc2VydGlvbk5vblRlcm1pbmFsTm9kZU1hdGNoZXMgPSBhc3NlcnRpb25DaGlsZE5vZGVzTWF0Y2hlczsgLy8vXG4gIH1cblxuICByZXR1cm4gYXNzZXJ0aW9uTm9uVGVybWluYWxOb2RlTWF0Y2hlcztcbn1cbiJdLCJuYW1lcyI6WyJBc3NlcnRpb24iLCJzdGF0ZW1lbnROb2RlUXVlcnkiLCJub2RlUXVlcnkiLCJzdWJwcm9vZk5vZGUiLCJzdGF0ZW1lbnROb2RlIiwiZ2V0Tm9uVGVybWluYWxOb2RlIiwibm9uVGVybWluYWxOb2RlIiwiZ2V0U3VicHJvb2ZOb2RlIiwiZ2V0U3RhdGVtZW50Tm9kZSIsIm1hdGNoIiwiYXNzZXJ0aW9uIiwibWF0Y2hlcyIsImdldHN0YXRlbWVudE5vZGUiLCJhc3NlcnRpb25Ob25UZXJtaW5hbE5vZGUiLCJhc3NlcnRpb25Ob25UZXJtaW5hbE5vZGVNYXRjaGVzIiwibWF0Y2hBc3NlcnRpb25Ob25UZXJtaW5hbE5vZGUiLCJmcm9tU3VicHJvb2ZOb2RlIiwiZnJvbVN0YXRlbWVudE5vZGUiLCJmcm9tUXVhbGlmaWVkU3RhdGVtZW50Tm9kZSIsInF1YWxpZmllZFN0YXRlbWVudE5vZGUiLCJmcm9tVW5xdWFsaWZpZWRTdGF0ZW1lbnROb2RlIiwidW5xdWFsaWZpZWRTdGF0ZW1lbnROb2RlIiwibWF0Y2hBc3NlcnRpb25Ob2RlIiwiYXNzZXJ0aW9uTm9kZSIsIm5vZGUiLCJhc3NlcnRpb25Ob2RlTWF0Y2hlcyIsIm5vZGVUZXJtaW5hbE5vZGUiLCJpc1Rlcm1pbmFsTm9kZSIsInJ1bGVOb2RlVGVybWluYWxOb2RlIiwidGVybWluYWxOb2RlIiwiYXNzZXJ0aW9uVGVybWluYWxOb2RlIiwiYXNzZXJ0aW9uVGVybWluYWxOb2RlTWF0Y2hlcyIsIm1hdGNoQXNzZXJ0aW9uVGVybWluYWxOb2RlIiwibWF0Y2hBc3NlcnRpb25DaGlsZE5vZGVzIiwiYXNzZXJ0aW9uQ2hpbGROb2RlcyIsImNoaWxkTm9kZXMiLCJhc3NlcnRpb25DaGlsZE5vZGVzTWF0Y2hlcyIsImNoaWxkTm9kZXNMZW5ndGgiLCJsZW5ndGgiLCJhc3NlcnRpb25DaGlsZE5vZGVzTGVuZ3RoIiwiZXZlcnkiLCJjaGlsZE5vZGUiLCJpbmRleCIsImFzc2VydGlvbkNoaWxkTm9kZSIsInJ1bGVOYW1lIiwiZ2V0UnVsZU5hbWUiLCJhc3NlcnRpb25SdWxlTmFtZSIsImdldENoaWxkTm9kZXMiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O2VBTXFCQTs7O3FCQUpLOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUUxQixJQUFNQyxxQkFBcUJDLElBQUFBLGdCQUFTLEVBQUM7QUFFdEIsSUFBQSxBQUFNRiwwQkFxRWxCLEFBckVZO2FBQU1BLFVBQ1BHLFlBQVksRUFBRUMsYUFBYTs4QkFEcEJKO1FBRWpCLElBQUksQ0FBQ0csWUFBWSxHQUFHQTtRQUNwQixJQUFJLENBQUNDLGFBQWEsR0FBR0E7O2lCQUhKSjs7WUFNbkJLLEtBQUFBO21CQUFBQSxTQUFBQSxxQkFBcUI7Z0JBQ25CLElBQU1DLGtCQUFrQixBQUFDLElBQUksQ0FBQ0YsYUFBYSxLQUFLLElBQUksR0FDekIsSUFBSSxDQUFDQSxhQUFhLEdBQ2hCLElBQUk7Z0JBRWpDLE9BQU9FO1lBQ1Q7OztZQUVBQyxLQUFBQTttQkFBQUEsU0FBQUEsa0JBQWtCO2dCQUNoQixPQUFPLElBQUksQ0FBQ0osWUFBWTtZQUMxQjs7O1lBRUFLLEtBQUFBO21CQUFBQSxTQUFBQSxtQkFBbUI7Z0JBQ2pCLE9BQU8sSUFBSSxDQUFDSixhQUFhO1lBQzNCOzs7WUFFQUssS0FBQUE7bUJBQUFBLFNBQUFBLE1BQU1DLFNBQVMsRUFBRTtnQkFDZixJQUFJQyxVQUFVLEtBQUs7Z0JBRW5CLElBQU1QLGdCQUFnQk0sVUFBVUUsZ0JBQWdCO2dCQUVoRCxJQUFJLEFBQUNSLGtCQUFrQixJQUFJLElBQU0sSUFBSSxDQUFDQSxhQUFhLEtBQUssSUFBSSxFQUFHO29CQUM3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
|