diff --git a/ruby/ql/consistency-queries/CfgConsistency.ql b/ruby/ql/consistency-queries/CfgConsistency.ql index 5af4f22fc26a..d67d67a8d3fd 100644 --- a/ruby/ql/consistency-queries/CfgConsistency.ql +++ b/ruby/ql/consistency-queries/CfgConsistency.ql @@ -1,31 +1,2 @@ -import codeql.ruby.controlflow.internal.ControlFlowGraphImpl::Consistency as Consistency -import Consistency -import codeql.ruby.AST import codeql.ruby.CFG -import codeql.ruby.controlflow.internal.Completion -import codeql.ruby.controlflow.internal.ControlFlowGraphImpl as CfgImpl - -/** - * All `Expr` nodes are `PostOrderTree`s - */ -query predicate nonPostOrderExpr(Expr e, string cls) { - cls = e.getPrimaryQlClasses() and - not exists(e.getDesugared()) and - not e instanceof BodyStmt and - exists(AstNode last, Completion c | - CfgImpl::last(e, last, c) and - last != e and - c instanceof NormalCompletion - ) -} - -query predicate scopeNoFirst(CfgScope scope) { - Consistency::scopeNoFirst(scope) and - not scope = any(StmtSequence seq | not exists(seq.getAStmt())) and - not scope = - any(Callable c | - not exists(c.getAParameter()) and - not c.getBody().hasEnsure() and - not exists(c.getBody().getARescue()) - ) -} +import ControlFlow::Consistency diff --git a/ruby/ql/consistency-queries/DataFlowConsistency.ql b/ruby/ql/consistency-queries/DataFlowConsistency.ql index 4e0588d5d4a1..de63a4309b5b 100644 --- a/ruby/ql/consistency-queries/DataFlowConsistency.ql +++ b/ruby/ql/consistency-queries/DataFlowConsistency.ql @@ -22,17 +22,6 @@ private module Input implements InputSig { not isNonConstantExpr(n.asExpr()) } - predicate multipleArgumentCallExclude(ArgumentNode arg, DataFlowCall call) { - // An argument such as `x` in `if not x then ...` has two successors (and hence - // two calls); one for each Boolean outcome of `x`. - exists(CfgNodes::ExprCfgNode n | - arg.argumentOf(call, _) and - n = call.asCall() and - arg.asExpr().getASuccessor(any(ConditionalSuccessor c)).getASuccessor*() = n and - n.getASplit() instanceof Split::ConditionalCompletionSplit - ) - } - predicate uniqueTypeExclude(Node n) { n = any(DataFlow::CallNode call | diff --git a/ruby/ql/lib/codeql/ruby/CFG.qll b/ruby/ql/lib/codeql/ruby/CFG.qll index d3401821f199..5fe7da86df05 100644 --- a/ruby/ql/lib/codeql/ruby/CFG.qll +++ b/ruby/ql/lib/codeql/ruby/CFG.qll @@ -3,4 +3,3 @@ import codeql.Locations import controlflow.ControlFlowGraph import controlflow.CfgNodes as CfgNodes -import controlflow.BasicBlocks diff --git a/ruby/ql/lib/codeql/ruby/ast/Statement.qll b/ruby/ql/lib/codeql/ruby/ast/Statement.qll index dcd51dbb3272..0081fd5d593e 100644 --- a/ruby/ql/lib/codeql/ruby/ast/Statement.qll +++ b/ruby/ql/lib/codeql/ruby/ast/Statement.qll @@ -6,7 +6,6 @@ private import codeql.ruby.CFG private import internal.AST private import internal.TreeSitter private import internal.Variable -private import codeql.ruby.controlflow.internal.ControlFlowGraphImpl as CfgImpl /** * A statement. @@ -14,14 +13,14 @@ private import codeql.ruby.controlflow.internal.ControlFlowGraphImpl as CfgImpl * This is the root QL class for all statements. */ class Stmt extends AstNode, TStmt { + /** Gets the control-flow node for this statement, if any. */ + ControlFlowNode getControlFlowNode() { result.injects(this) } + /** Gets a control-flow node for this statement, if any. */ CfgNodes::AstCfgNode getAControlFlowNode() { result.getAstNode() = this } - /** Gets a control-flow entry node for this statement, if any */ - AstNode getAControlFlowEntryNode() { result = CfgImpl::getAControlFlowEntryNode(this) } - /** Gets the control-flow scope of this statement, if any. */ - CfgScope getCfgScope() { result = CfgImpl::getCfgScope(this) } + CfgScope getCfgScope() { result = getEnclosingCallable(this) } /** Gets the enclosing callable, if any. */ Callable getEnclosingCallable() { result = this.getCfgScope() } diff --git a/ruby/ql/lib/codeql/ruby/ast/internal/Synthesis.qll b/ruby/ql/lib/codeql/ruby/ast/internal/Synthesis.qll index f05deae59623..0b45d26ef12a 100644 --- a/ruby/ql/lib/codeql/ruby/ast/internal/Synthesis.qll +++ b/ruby/ql/lib/codeql/ruby/ast/internal/Synthesis.qll @@ -833,6 +833,10 @@ private module AssignOperationDesugar { ) ) } + + final override predicate excludeFromControlFlowTree(AstNode n) { + n = any(ScopeResolutionAssignOperation sao).getLeftOperand() + } } /** An assignment operation where the left-hand side is a method call. */ diff --git a/ruby/ql/lib/codeql/ruby/controlflow/BasicBlocks.qll b/ruby/ql/lib/codeql/ruby/controlflow/BasicBlocks.qll deleted file mode 100644 index e085dbd90a38..000000000000 --- a/ruby/ql/lib/codeql/ruby/controlflow/BasicBlocks.qll +++ /dev/null @@ -1,314 +0,0 @@ -/** Provides classes representing basic blocks. */ -overlay[local] -module; - -private import codeql.ruby.AST -private import codeql.ruby.ast.internal.AST -private import codeql.ruby.ast.internal.TreeSitter -private import codeql.ruby.controlflow.ControlFlowGraph -private import internal.ControlFlowGraphImpl as CfgImpl -private import CfgNodes -private import CfgImpl::BasicBlocks as BasicBlocksImpl -private import codeql.controlflow.BasicBlock as BB - -/** - * A basic block, that is, a maximal straight-line sequence of control flow nodes - * without branches or joins. - */ -final class BasicBlock extends BasicBlocksImpl::BasicBlock { - /** Gets an immediate successor of this basic block, if any. */ - BasicBlock getASuccessor() { result = super.getASuccessor() } - - /** Gets an immediate successor of this basic block of a given type, if any. */ - BasicBlock getASuccessor(SuccessorType t) { result = super.getASuccessor(t) } - - /** Gets an immediate predecessor of this basic block, if any. */ - BasicBlock getAPredecessor() { result = super.getAPredecessor() } - - /** Gets an immediate predecessor of this basic block of a given type, if any. */ - BasicBlock getAPredecessor(SuccessorType t) { result = super.getAPredecessor(t) } - - // The overrides below are to use `CfgNode` instead of `CfgImpl::Node` - CfgNode getNode(int pos) { result = super.getNode(pos) } - - CfgNode getANode() { result = super.getANode() } - - /** Gets the first control flow node in this basic block. */ - CfgNode getFirstNode() { result = super.getFirstNode() } - - /** Gets the last control flow node in this basic block. */ - CfgNode getLastNode() { result = super.getLastNode() } - - /** - * Holds if this basic block immediately dominates basic block `bb`. - * - * That is, this basic block is the unique basic block satisfying: - * 1. This basic block strictly dominates `bb` - * 2. There exists no other basic block that is strictly dominated by this - * basic block and which strictly dominates `bb`. - * - * All basic blocks, except entry basic blocks, have a unique immediate - * dominator. - * - * Example: - * - * ```rb - * def m b - * if b - * return 0 - * end - * return 1 - * end - * ``` - * - * The basic block starting on line 2 immediately dominates the - * basic block on line 5 (all paths from the entry point of `m` - * to `return 1` must go through the `if` block). - */ - predicate immediatelyDominates(BasicBlock bb) { super.immediatelyDominates(bb) } - - /** - * Holds if this basic block strictly dominates basic block `bb`. - * - * That is, all paths reaching basic block `bb` from some entry point - * basic block must go through this basic block (which must be different - * from `bb`). - * - * Example: - * - * ```rb - * def m b - * if b - * return 0 - * end - * return 1 - * end - * ``` - * - * The basic block starting on line 2 strictly dominates the - * basic block on line 5 (all paths from the entry point of `m` - * to `return 1` must go through the `if` block). - */ - predicate strictlyDominates(BasicBlock bb) { super.strictlyDominates(bb) } - - /** - * Holds if this basic block dominates basic block `bb`. - * - * That is, all paths reaching basic block `bb` from some entry point - * basic block must go through this basic block. - * - * Example: - * - * ```rb - * def m b - * if b - * return 0 - * end - * return 1 - * end - * ``` - * - * The basic block starting on line 2 dominates the basic - * basic block on line 5 (all paths from the entry point of `m` - * to `return 1` must go through the `if` block). - */ - predicate dominates(BasicBlock bb) { super.dominates(bb) } - - /** - * Holds if `df` is in the dominance frontier of this basic block. - * That is, this basic block dominates a predecessor of `df`, but - * does not dominate `df` itself. - * - * Example: - * - * ```rb - * def m x - * if x < 0 - * x = -x - * if x > 10 - * x = x - 1 - * end - * end - * puts x - * end - * ``` - * - * The basic block on line 8 is in the dominance frontier - * of the basic block starting on line 3 because that block - * dominates the basic block on line 4, which is a predecessor of - * `puts x`. Also, the basic block starting on line 3 does not - * dominate the basic block on line 8. - */ - predicate inDominanceFrontier(BasicBlock df) { super.inDominanceFrontier(df) } - - /** - * Gets the basic block that immediately dominates this basic block, if any. - * - * That is, the result is the unique basic block satisfying: - * 1. The result strictly dominates this basic block. - * 2. There exists no other basic block that is strictly dominated by the - * result and which strictly dominates this basic block. - * - * All basic blocks, except entry basic blocks, have a unique immediate - * dominator. - * - * Example: - * - * ```rb - * def m b - * if b - * return 0 - * end - * return 1 - * end - * ``` - * - * The basic block starting on line 2 is an immediate dominator of - * the basic block on line 5 (all paths from the entry point of `m` - * to `return 1` must go through the `if` block, and the `if` block - * is an immediate predecessor of `return 1`). - */ - BasicBlock getImmediateDominator() { result = super.getImmediateDominator() } - - /** - * Holds if the edge with successor type `s` out of this basic block is a - * dominating edge for `dominated`. - * - * That is, all paths reaching `dominated` from the entry point basic - * block must go through the `s` edge out of this basic block. - * - * Edge dominance is similar to node dominance except it concerns edges - * instead of nodes: A basic block is dominated by a _basic block_ `bb` if it - * can only be reached through `bb` and dominated by an _edge_ `e` if it can - * only be reached through `e`. - * - * Note that where all basic blocks (except the entry basic block) are - * strictly dominated by at least one basic block, a basic block may not be - * dominated by any edge. If an edge dominates a basic block `bb`, then - * both endpoints of the edge dominates `bb`. The converse is not the case, - * as there may be multiple paths between the endpoints with none of them - * dominating. - */ - predicate edgeDominates(BasicBlock dominated, SuccessorType s) { - super.edgeDominates(dominated, s) - } - - /** - * Holds if this basic block strictly post-dominates basic block `bb`. - * - * That is, all paths reaching a normal exit point basic block from basic - * block `bb` must go through this basic block (which must be different - * from `bb`). - * - * Example: - * - * ```rb - * def m b - * if b - * puts "b" - * end - * puts "m" - * end - * ``` - * - * The basic block on line 5 strictly post-dominates the basic block on - * line 3 (all paths to the exit point of `m` from `puts "b"` must go - * through `puts "m"`). - */ - predicate strictlyPostDominates(BasicBlock bb) { super.strictlyPostDominates(bb) } - - /** - * Holds if this basic block post-dominates basic block `bb`. - * - * That is, all paths reaching a normal exit point basic block from basic - * block `bb` must go through this basic block. - * - * Example: - * - * ```rb - * def m b - * if b - * puts "b" - * end - * puts "m" - * end - * ``` - * - * The basic block on line 5 post-dominates the basic block on line 3 - * (all paths to the exit point of `m` from `puts "b"` must go through - * `puts "m"`). - */ - predicate postDominates(BasicBlock bb) { super.postDominates(bb) } -} - -/** - * An entry basic block, that is, a basic block whose first node is - * an entry node. - */ -final class EntryBasicBlock extends BasicBlock, BasicBlocksImpl::EntryBasicBlock { } - -/** - * An annotated exit basic block, that is, a basic block that contains an - * annotated exit node. - */ -final class AnnotatedExitBasicBlock extends BasicBlock, BasicBlocksImpl::AnnotatedExitBasicBlock { } - -/** - * An exit basic block, that is, a basic block whose last node is - * an exit node. - */ -final class ExitBasicBlock extends BasicBlock, BasicBlocksImpl::ExitBasicBlock { } - -/** A basic block with more than one predecessor. */ -final class JoinBlock extends BasicBlock, BasicBlocksImpl::JoinBasicBlock { - JoinBlockPredecessor getJoinBlockPredecessor(int i) { result = super.getJoinBlockPredecessor(i) } -} - -/** A basic block that is an immediate predecessor of a join block. */ -final class JoinBlockPredecessor extends BasicBlock, BasicBlocksImpl::JoinPredecessorBasicBlock { } - -/** - * A basic block that terminates in a condition, splitting the subsequent - * control flow. - */ -final class ConditionBlock extends BasicBlock, BasicBlocksImpl::ConditionBasicBlock { - /** - * DEPRECATED: Use `edgeDominates` instead. - * - * Holds if basic block `succ` is immediately controlled by this basic - * block with conditional value `s`. That is, `succ` is an immediate - * successor of this block, and `succ` can only be reached from - * the callable entry point by going via the `s` edge out of this basic block. - */ - deprecated predicate immediatelyControls(BasicBlock succ, ConditionalSuccessor s) { - this.getASuccessor(s) = succ and - BasicBlocksImpl::dominatingEdge(this, succ) - } - - /** - * DEPRECATED: Use `edgeDominates` instead. - * - * Holds if basic block `controlled` is controlled by this basic block with - * conditional value `s`. That is, `controlled` can only be reached from the - * callable entry point by going via the `s` edge out of this basic block. - */ - deprecated predicate controls(BasicBlock controlled, ConditionalSuccessor s) { - super.edgeDominates(controlled, s) - } -} - -private class BasicBlockAlias = BasicBlock; - -private class EntryBasicBlockAlias = EntryBasicBlock; - -module Cfg implements BB::CfgSig { - class ControlFlowNode = CfgNode; - - class BasicBlock = BasicBlockAlias; - - class EntryBasicBlock = EntryBasicBlockAlias; - - predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) { - BasicBlocksImpl::dominatingEdge(bb1, bb2) - } -} diff --git a/ruby/ql/lib/codeql/ruby/controlflow/CfgNodes.qll b/ruby/ql/lib/codeql/ruby/controlflow/CfgNodes.qll index 0da31370ff01..72806211f3f7 100644 --- a/ruby/ql/lib/codeql/ruby/controlflow/CfgNodes.qll +++ b/ruby/ql/lib/codeql/ruby/controlflow/CfgNodes.qll @@ -3,30 +3,9 @@ overlay[local] module; private import codeql.ruby.AST -private import codeql.ruby.controlflow.BasicBlocks private import codeql.ruby.dataflow.SSA private import codeql.ruby.ast.internal.Constant private import ControlFlowGraph -private import internal.ControlFlowGraphImpl as CfgImpl - -/** An entry node for a given scope. */ -class EntryNode extends CfgNode, CfgImpl::EntryNode { - override string getAPrimaryQlClass() { result = "EntryNode" } - - final override EntryBasicBlock getBasicBlock() { result = super.getBasicBlock() } -} - -/** An exit node for a given scope, annotated with the type of exit. */ -class AnnotatedExitNode extends CfgNode, CfgImpl::AnnotatedExitNode { - override string getAPrimaryQlClass() { result = "AnnotatedExitNode" } - - final override AnnotatedExitBasicBlock getBasicBlock() { result = super.getBasicBlock() } -} - -/** An exit node for a given scope. */ -class ExitNode extends CfgNode, CfgImpl::ExitNode { - override string getAPrimaryQlClass() { result = "ExitNode" } -} /** * A node for an AST node. @@ -35,7 +14,11 @@ class ExitNode extends CfgNode, CfgImpl::ExitNode { * (dead) code or not important for control flow, and multiple when there are different * splits for the AST node. */ -class AstCfgNode extends CfgNode, CfgImpl::AstCfgNode { +class AstCfgNode extends CfgNode { + AstCfgNode() { this.injects(_) } + + AstNode getAstNode() { this.injects(result) } + /** Gets the name of the primary QL class for this node. */ overlay[global] override string getAPrimaryQlClass() { result = "AstCfgNode" } @@ -67,10 +50,7 @@ class ReturningCfgNode extends AstCfgNode { ReturningCfgNode() { s = this.getAstNode() } /** Gets the node of the returned value, if any. */ - ExprCfgNode getReturnedValueNode() { - result = this.getAPredecessor() and - result.getAstNode() = s.getValue() - } + ExprCfgNode getReturnedValueNode() { result.getAstNode() = s.getValue() } } /** A control-flow node that wraps a `StringComponent` AST expression. */ @@ -100,108 +80,31 @@ private AstNode desugar(AstNode n) { result = n } -/** - * A class for mapping parent-child AST nodes to parent-child CFG nodes. - */ -abstract private class ChildMapping extends AstNode { - /** - * Holds if `child` is a (possibly nested) child of this expression - * for which we would like to find a matching CFG child. - */ - abstract predicate relevantChild(AstNode child); - - pragma[nomagic] - abstract predicate reachesBasicBlock(AstNode child, CfgNode cfn, BasicBlock bb); - - /** - * Holds if there is a control-flow path from `cfn` to `cfnChild`, where `cfn` - * is a control-flow node for this expression, and `cfnChild` is a control-flow - * node for `child`. - * - * The path never escapes the syntactic scope of this expression. - */ - cached - predicate hasCfgChild(AstNode child, CfgNode cfn, CfgNode cfnChild) { - this.reachesBasicBlock(child, cfn, cfnChild.getBasicBlock()) and - cfnChild.getAstNode() = desugar(child) - } -} - -/** - * A class for mapping parent-child AST nodes to parent-child CFG nodes. - */ -abstract private class ExprChildMapping extends Expr, ChildMapping { - pragma[nomagic] - override predicate reachesBasicBlock(AstNode child, CfgNode cfn, BasicBlock bb) { - this.relevantChild(child) and - cfn = this.getAControlFlowNode() and - bb.getANode() = cfn - or - exists(BasicBlock mid | - this.reachesBasicBlock(child, cfn, mid) and - bb = mid.getAPredecessor() and - not mid.getANode().getAstNode() = child - ) - } -} - -/** - * A class for mapping parent-child AST nodes to parent-child CFG nodes. - */ -abstract private class NonExprChildMapping extends ChildMapping { - NonExprChildMapping() { not this instanceof Expr } - - pragma[nomagic] - override predicate reachesBasicBlock(AstNode child, CfgNode cfn, BasicBlock bb) { - this.relevantChild(child) and - cfn.getAstNode() = this and - bb.getANode() = cfn - or - exists(BasicBlock mid | - this.reachesBasicBlock(child, cfn, mid) and - bb = mid.getASuccessor() and - not mid.getANode().getAstNode() = child - ) - } -} - /** Provides classes for control-flow nodes that wrap AST expressions. */ module ExprNodes { - private class LiteralChildMapping extends ExprChildMapping, Literal { - override predicate relevantChild(AstNode n) { none() } - } - /** A control-flow node that wraps a `Literal` AST expression. */ class LiteralCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "LiteralCfgNode" } - override LiteralChildMapping e; + override Literal e; override Literal getExpr() { result = super.getExpr() } } - private class ControlExprChildMapping extends ExprChildMapping, ControlExpr { - override predicate relevantChild(AstNode n) { none() } - } - /** A control-flow node that wraps a `ControlExpr` AST expression. */ class ControlExprCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "ControlExprCfgNode" } - override ControlExprChildMapping e; + override ControlExpr e; override ControlExpr getExpr() { result = super.getExpr() } } - private class LhsExprChildMapping extends ExprChildMapping, LhsExpr { - override predicate relevantChild(AstNode n) { none() } - } - /** A control-flow node that wraps a `LhsExpr` AST expression. */ class LhsExprCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "LhsExprCfgNode" } - override LhsExprChildMapping e; + override LhsExpr e; override LhsExpr getExpr() { result = super.getExpr() } @@ -209,34 +112,26 @@ module ExprNodes { Variable getVariable() { result = e.(VariableAccess).getVariable() } } - private class AssignExprChildMapping extends ExprChildMapping, AssignExpr { - override predicate relevantChild(AstNode n) { n = this.getAnOperand() } - } - /** A control-flow node that wraps an `AssignExpr` AST expression. */ class AssignExprCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "AssignExprCfgNode" } - override AssignExprChildMapping e; + override AssignExpr e; final override AssignExpr getExpr() { result = super.getExpr() } /** Gets the LHS of this assignment. */ - final LhsExprCfgNode getLhs() { e.hasCfgChild(e.getLeftOperand(), this, result) } + final LhsExprCfgNode getLhs() { result.injects(desugar(e.getLeftOperand())) } /** Gets the RHS of this assignment. */ - final ExprCfgNode getRhs() { e.hasCfgChild(e.getRightOperand(), this, result) } - } - - private class OperationExprChildMapping extends ExprChildMapping, Operation { - override predicate relevantChild(AstNode n) { n = this.getAnOperand() } + final ExprCfgNode getRhs() { result.injects(desugar(e.getRightOperand())) } } /** A control-flow node that wraps an `Operation` AST expression. */ class OperationCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "OperationCfgNode" } - override OperationExprChildMapping e; + override Operation e; override Operation getExpr() { result = super.getExpr() } @@ -244,7 +139,7 @@ module ExprNodes { string getOperator() { result = this.getExpr().getOperator() } /** Gets an operand of this operation. */ - final ExprCfgNode getAnOperand() { e.hasCfgChild(e.getAnOperand(), this, result) } + final ExprCfgNode getAnOperand() { result.injects(desugar(e.getAnOperand())) } } /** A control-flow node that wraps a `UnaryOperation` AST expression. */ @@ -258,7 +153,7 @@ module ExprNodes { override UnaryOperation getExpr() { result = super.getExpr() } /** Gets the operand of this unary operation. */ - final ExprCfgNode getOperand() { e.hasCfgChild(uo.getOperand(), this, result) } + final ExprCfgNode getOperand() { result.injects(desugar(uo.getOperand())) } } /** A control-flow node that wraps a `BinaryOperation` AST expression. */ @@ -272,32 +167,22 @@ module ExprNodes { override BinaryOperation getExpr() { result = super.getExpr() } /** Gets the left operand of this binary operation. */ - final ExprCfgNode getLeftOperand() { e.hasCfgChild(bo.getLeftOperand(), this, result) } + final ExprCfgNode getLeftOperand() { result.injects(desugar(bo.getLeftOperand())) } /** Gets the right operand of this binary operation. */ - final ExprCfgNode getRightOperand() { e.hasCfgChild(bo.getRightOperand(), this, result) } - } - - private class BlockArgumentChildMapping extends ExprChildMapping, BlockArgument { - override predicate relevantChild(AstNode n) { n = this.getValue() } + final ExprCfgNode getRightOperand() { result.injects(desugar(bo.getRightOperand())) } } /** A control-flow node that wraps a `BlockArgument` AST expression. */ class BlockArgumentCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "BlockArgumentCfgNode" } - override BlockArgumentChildMapping e; + override BlockArgument e; final override BlockArgument getExpr() { result = super.getExpr() } /** Gets the value of this block argument. */ - final ExprCfgNode getValue() { e.hasCfgChild(e.getValue(), this, result) } - } - - private class CallExprChildMapping extends ExprChildMapping, Call { - override predicate relevantChild(AstNode n) { - n = [this.getAnArgument(), this.(MethodCall).getReceiver(), this.(MethodCall).getBlock()] - } + final ExprCfgNode getValue() { result.injects(desugar(e.getValue())) } } /** A control-flow node that wraps a `Call` AST expression. */ @@ -305,12 +190,12 @@ module ExprNodes { overlay[global] override string getAPrimaryQlClass() { result = "CallCfgNode" } - override CallExprChildMapping e; + override Call e; override Call getExpr() { result = super.getExpr() } /** Gets the `n`th argument of this call. */ - final ExprCfgNode getArgument(int n) { e.hasCfgChild(e.getArgument(n), this, result) } + final ExprCfgNode getArgument(int n) { result.injects(desugar(e.getArgument(n))) } /** Gets an argument of this call. */ final ExprCfgNode getAnArgument() { result = this.getArgument(_) } @@ -319,7 +204,7 @@ module ExprNodes { overlay[global] final ExprCfgNode getKeywordArgument(string keyword) { exists(PairCfgNode n | - e.hasCfgChild(e.getAnArgument(), this, n) and + n.injects(desugar(e.getAnArgument())) and n.getKey().getExpr().getConstantValue().isSymbol(keyword) and result = n.getValue() ) @@ -337,10 +222,10 @@ module ExprNodes { final int getNumberOfArguments() { result = e.getNumberOfArguments() } /** Gets the receiver of this call. */ - final ExprCfgNode getReceiver() { e.hasCfgChild(e.(MethodCall).getReceiver(), this, result) } + final ExprCfgNode getReceiver() { result.injects(desugar(e.(MethodCall).getReceiver())) } /** Gets the block of this call. */ - final ExprCfgNode getBlock() { e.hasCfgChild(e.(MethodCall).getBlock(), this, result) } + final ExprCfgNode getBlock() { result.injects(desugar(e.(MethodCall).getBlock())) } } /** A control-flow node that wraps a `MethodCall` AST expression. */ @@ -356,104 +241,54 @@ module ExprNodes { string getMethodName() { result = this.getExpr().getMethodName() } } - private class CaseExprChildMapping extends ExprChildMapping, CaseExpr { - override predicate relevantChild(AstNode e) { e = this.getValue() or e = this.getABranch() } - } - /** A control-flow node that wraps a `CaseExpr` AST expression. */ class CaseExprCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "CaseExprCfgNode" } - override CaseExprChildMapping e; + override CaseExpr e; final override CaseExpr getExpr() { result = super.getExpr() } /** Gets the expression being compared, if any. */ - final ExprCfgNode getValue() { e.hasCfgChild(e.getValue(), this, result) } + final ExprCfgNode getValue() { result.injects(desugar(e.getValue())) } /** * Gets the `n`th branch of this case expression, either a `when` clause, an `in` clause, or an `else` branch. */ - final AstCfgNode getBranch(int n) { e.hasCfgChild(e.getBranch(n), this, result) } - } - - private class InClauseChildMapping extends NonExprChildMapping, InClause { - override predicate relevantChild(AstNode e) { - e = this.getPattern() or - e = this.getCondition() or - e = this.getBody() - } + final AstCfgNode getBranch(int n) { result.injects(desugar(e.getBranch(n))) } } /** A control-flow node that wraps an `InClause` AST expression. */ class InClauseCfgNode extends AstCfgNode { - private InClauseChildMapping e; + private InClause e; InClauseCfgNode() { e = this.getAstNode() } override string getAPrimaryQlClass() { result = "InClauseCfgNode" } /** Gets the pattern in this `in`-clause. */ - final AstCfgNode getPattern() { e.hasCfgChild(e.getPattern(), this, result) } + final AstCfgNode getPattern() { result.injects(desugar(e.getPattern())) } /** Gets the pattern guard condition in this `in` clause, if any. */ - final ExprCfgNode getCondition() { e.hasCfgChild(e.getCondition(), this, result) } + final ExprCfgNode getCondition() { result.injects(desugar(e.getCondition())) } /** Gets the body of this `in`-clause. */ - final ExprCfgNode getBody() { e.hasCfgChild(e.getBody(), this, result) } - } - - // `when` clauses need special treatment, since they are neither pre-order - // nor post-order - private class WhenClauseChildMapping extends WhenClause { - predicate patternReachesBasicBlock(int i, CfgNode cfnPattern, BasicBlock bb) { - exists(Expr pattern | - pattern = this.getPattern(i) and - cfnPattern.getAstNode() = pattern and - bb.getANode() = cfnPattern - ) - or - exists(BasicBlock mid | - this.patternReachesBasicBlock(i, cfnPattern, mid) and - bb = mid.getASuccessor() and - not mid.getANode().getAstNode() = this - ) - } - - predicate bodyReachesBasicBlock(CfgNode cfnBody, BasicBlock bb) { - exists(Stmt body | - body = this.getBody() and - cfnBody.getAstNode() = body and - bb.getANode() = cfnBody - ) - or - exists(BasicBlock mid | - this.bodyReachesBasicBlock(cfnBody, mid) and - bb = mid.getAPredecessor() and - not mid.getANode().getAstNode() = this - ) - } + final ExprCfgNode getBody() { result.injects(desugar(e.getBody())) } } /** A control-flow node that wraps a `WhenClause` AST expression. */ class WhenClauseCfgNode extends AstCfgNode { - private WhenClauseChildMapping e; + private WhenClause e; WhenClauseCfgNode() { e = this.getAstNode() } override string getAPrimaryQlClass() { result = "WhenClauseCfgNode" } /** Gets the body of this `when`-clause. */ - final ExprCfgNode getBody() { - result.getAstNode() = desugar(e.getBody()) and - e.bodyReachesBasicBlock(result, this.getBasicBlock()) - } + final ExprCfgNode getBody() { result.getAstNode() = desugar(e.getBody()) } /** Gets the `i`th pattern this `when`-clause. */ - final ExprCfgNode getPattern(int i) { - result.getAstNode() = desugar(e.getPattern(i)) and - e.patternReachesBasicBlock(i, result, this.getBasicBlock()) - } + final ExprCfgNode getPattern(int i) { result.getAstNode() = desugar(e.getPattern(i)) } } /** A control-flow node that wraps a `CasePattern`. */ @@ -465,41 +300,25 @@ module ExprNodes { override string getAPrimaryQlClass() { result = "CasePatternCfgNode" } } - private class ArrayPatternChildMapping extends NonExprChildMapping, ArrayPattern { - override predicate relevantChild(AstNode e) { - e = this.getPrefixElement(_) or - e = this.getSuffixElement(_) or - e = this.getRestVariableAccess() - } - } - /** A control-flow node that wraps an `ArrayPattern` node. */ class ArrayPatternCfgNode extends CasePatternCfgNode { override string getAPrimaryQlClass() { result = "ArrayPatternCfgNode" } - override ArrayPatternChildMapping e; + override ArrayPattern e; /** Gets the `n`th element of this list pattern's prefix. */ final CasePatternCfgNode getPrefixElement(int n) { - e.hasCfgChild(e.getPrefixElement(n), this, result) + result.injects(desugar(e.getPrefixElement(n))) } /** Gets the `n`th element of this list pattern's suffix. */ final CasePatternCfgNode getSuffixElement(int n) { - e.hasCfgChild(e.getSuffixElement(n), this, result) + result.injects(desugar(e.getSuffixElement(n))) } /** Gets the variable of the rest token, if any. */ final VariableWriteAccessCfgNode getRestVariableAccess() { - e.hasCfgChild(e.getRestVariableAccess(), this, result) - } - } - - private class FindPatternChildMapping extends NonExprChildMapping, FindPattern { - override predicate relevantChild(AstNode e) { - e = this.getElement(_) or - e = this.getPrefixVariableAccess() or - e = this.getSuffixVariableAccess() + result.injects(desugar(e.getRestVariableAccess())) } } @@ -507,26 +326,19 @@ module ExprNodes { class FindPatternCfgNode extends CasePatternCfgNode { override string getAPrimaryQlClass() { result = "FindPatternCfgNode" } - override FindPatternChildMapping e; + override FindPattern e; /** Gets the `n`th element of this find pattern. */ - final CasePatternCfgNode getElement(int n) { e.hasCfgChild(e.getElement(n), this, result) } + final CasePatternCfgNode getElement(int n) { result.injects(desugar(e.getElement(n))) } /** Gets the variable for the prefix of this find pattern, if any. */ final VariableWriteAccessCfgNode getPrefixVariableAccess() { - e.hasCfgChild(e.getPrefixVariableAccess(), this, result) + result.injects(desugar(e.getPrefixVariableAccess())) } /** Gets the variable for the suffix of this find pattern, if any. */ final VariableWriteAccessCfgNode getSuffixVariableAccess() { - e.hasCfgChild(e.getSuffixVariableAccess(), this, result) - } - } - - private class HashPatternChildMapping extends NonExprChildMapping, HashPattern { - override predicate relevantChild(AstNode e) { - e = this.getValue(_) or - e = this.getRestVariableAccess() + result.injects(desugar(e.getSuffixVariableAccess())) } } @@ -534,136 +346,104 @@ module ExprNodes { class HashPatternCfgNode extends CasePatternCfgNode { override string getAPrimaryQlClass() { result = "HashPatternCfgNode" } - override HashPatternChildMapping e; + override HashPattern e; /** Gets the value of the `n`th pair. */ - final CasePatternCfgNode getValue(int n) { e.hasCfgChild(e.getValue(n), this, result) } + final CasePatternCfgNode getValue(int n) { result.injects(desugar(e.getValue(n))) } /** Gets the variable of the keyword rest token, if any. */ final VariableWriteAccessCfgNode getRestVariableAccess() { - e.hasCfgChild(e.getRestVariableAccess(), this, result) + result.injects(desugar(e.getRestVariableAccess())) } } - private class AlternativePatternChildMapping extends NonExprChildMapping, AlternativePattern { - override predicate relevantChild(AstNode e) { e = this.getAnAlternative() } - } - /** A control-flow node that wraps an `AlternativePattern` node. */ class AlternativePatternCfgNode extends CasePatternCfgNode { override string getAPrimaryQlClass() { result = "AlternativePatternCfgNode" } - override AlternativePatternChildMapping e; + override AlternativePattern e; /** Gets the `n`th alternative. */ - final CasePatternCfgNode getAlternative(int n) { - e.hasCfgChild(e.getAlternative(n), this, result) - } - } - - private class AsPatternChildMapping extends NonExprChildMapping, AsPattern { - override predicate relevantChild(AstNode e) { - e = this.getPattern() or e = this.getVariableAccess() - } + final CasePatternCfgNode getAlternative(int n) { result.injects(desugar(e.getAlternative(n))) } } /** A control-flow node that wraps an `AsPattern` node. */ class AsPatternCfgNode extends CasePatternCfgNode { override string getAPrimaryQlClass() { result = "AsPatternCfgNode" } - override AsPatternChildMapping e; + override AsPattern e; /** Gets the underlying pattern. */ - final CasePatternCfgNode getPattern() { e.hasCfgChild(e.getPattern(), this, result) } + final CasePatternCfgNode getPattern() { result.injects(desugar(e.getPattern())) } /** Gets the variable access for this pattern. */ final VariableWriteAccessCfgNode getVariableAccess() { - e.hasCfgChild(e.getVariableAccess(), this, result) + result.injects(desugar(e.getVariableAccess())) } } - private class ParenthesizedPatternChildMapping extends NonExprChildMapping, ParenthesizedPattern { - override predicate relevantChild(AstNode e) { e = this.getPattern() } - } - /** A control-flow node that wraps a `ParenthesizedPattern` node. */ class ParenthesizedPatternCfgNode extends CasePatternCfgNode { override string getAPrimaryQlClass() { result = "ParenthesizedPatternCfgNode" } - override ParenthesizedPatternChildMapping e; + override ParenthesizedPattern e; /** Gets the underlying pattern. */ - final CasePatternCfgNode getPattern() { e.hasCfgChild(e.getPattern(), this, result) } - } - - private class ConditionalExprChildMapping extends ExprChildMapping, ConditionalExpr { - override predicate relevantChild(AstNode n) { n = [this.getCondition(), this.getBranch(_)] } + final CasePatternCfgNode getPattern() { result.injects(desugar(e.getPattern())) } } /** A control-flow node that wraps a `ConditionalExpr` AST expression. */ class ConditionalExprCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "ConditionalExprCfgNode" } - override ConditionalExprChildMapping e; + override ConditionalExpr e; final override ConditionalExpr getExpr() { result = super.getExpr() } /** Gets the condition expression. */ - final ExprCfgNode getCondition() { e.hasCfgChild(e.getCondition(), this, result) } + final ExprCfgNode getCondition() { result.injects(desugar(e.getCondition())) } /** * Gets the branch of this conditional expression that is taken when the condition * evaluates to cond, if any. */ - final ExprCfgNode getBranch(boolean cond) { e.hasCfgChild(e.getBranch(cond), this, result) } - } - - private class ConstantAccessChildMapping extends ExprChildMapping, ConstantAccess { - override predicate relevantChild(AstNode n) { n = this.getScopeExpr() } + final ExprCfgNode getBranch(boolean cond) { result.injects(desugar(e.getBranch(cond))) } } - /** A control-flow node that wraps a `ConditionalExpr` AST expression. */ + /** A control-flow node that wraps a `ConstantAccess` AST expression. */ class ConstantAccessCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "ConstantAccessCfgNode" } - override ConstantAccessChildMapping e; + override ConstantAccess e; final override ConstantAccess getExpr() { result = super.getExpr() } /** Gets the scope expression. */ - final ExprCfgNode getScopeExpr() { e.hasCfgChild(e.getScopeExpr(), this, result) } - } - - private class StmtSequenceChildMapping extends ExprChildMapping, StmtSequence { - override predicate relevantChild(AstNode n) { n = this.getLastStmt() } + final ExprCfgNode getScopeExpr() { result.injects(desugar(e.getScopeExpr())) } } /** A control-flow node that wraps a `StmtSequence` AST expression. */ class StmtSequenceCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "StmtSequenceCfgNode" } - override StmtSequenceChildMapping e; + override StmtSequence e; final override StmtSequence getExpr() { result = super.getExpr() } /** Gets the last statement in this sequence, if any. */ - final ExprCfgNode getLastStmt() { e.hasCfgChild(e.getLastStmt(), this, result) } - } - - private class ForExprChildMapping extends ExprChildMapping, ForExpr { - override predicate relevantChild(AstNode n) { n = this.getValue() } + final ExprCfgNode getLastStmt() { result.injects(desugar(e.getLastStmt())) } } /** A control-flow node that wraps a `ForExpr` AST expression. */ class ForExprCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "ForExprCfgNode" } - override ForExprChildMapping e; + override ForExpr e; final override ForExpr getExpr() { result = super.getExpr() } /** Gets the value being iterated over. */ - final ExprCfgNode getValue() { e.hasCfgChild(e.getValue(), this, result) } + final ExprCfgNode getValue() { result.injects(desugar(e.getValue())) } } /** A control-flow node that wraps a `ParenthesizedExpr` AST expression. */ @@ -673,27 +453,23 @@ module ExprNodes { ParenthesizedExprCfgNode() { this.getExpr() instanceof ParenthesizedExpr } } - private class PairChildMapping extends ExprChildMapping, Pair { - override predicate relevantChild(AstNode n) { n = [this.getKey(), this.getValue()] } - } - /** A control-flow node that wraps a `Pair` AST expression. */ class PairCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "PairCfgNode" } - override PairChildMapping e; + override Pair e; final override Pair getExpr() { result = super.getExpr() } /** * Gets the key expression of this pair. */ - final ExprCfgNode getKey() { e.hasCfgChild(e.getKey(), this, result) } + final ExprCfgNode getKey() { result.injects(desugar(e.getKey())) } /** * Gets the value expression of this pair. */ - final ExprCfgNode getValue() { e.hasCfgChild(e.getValue(), this, result) } + final ExprCfgNode getValue() { result.injects(desugar(e.getValue())) } } /** A control-flow node that wraps a `VariableAccess` AST expression. */ @@ -728,41 +504,29 @@ module ExprNodes { final override LocalVariable getVariable() { result = super.getVariable() } } - private class InstanceVariableAccessMapping extends ExprChildMapping, InstanceVariableAccess { - override predicate relevantChild(AstNode n) { n = this.getReceiver() } - } - /** A control-flow node that wraps an `InstanceVariableAccess` AST expression. */ class InstanceVariableAccessCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "InstanceVariableAccessCfgNode" } - override InstanceVariableAccessMapping e; + override InstanceVariableAccess e; override InstanceVariableAccess getExpr() { result = super.getExpr() } /** * Gets the synthetic receiver (`self`) of this instance variable access. */ - final CfgNode getReceiver() { e.hasCfgChild(e.getReceiver(), this, result) } - } - - private class SelfVariableAccessMapping extends ExprChildMapping, SelfVariableAccess { - override predicate relevantChild(AstNode n) { none() } + final CfgNode getReceiver() { result.injects(desugar(e.getReceiver())) } } /** A control-flow node that wraps a `SelfVariableAccess` AST expression. */ class SelfVariableAccessCfgNode extends VariableAccessCfgNode { final override string getAPrimaryQlClass() { result = "SelfVariableAccessCfgNode" } - override SelfVariableAccessMapping e; + override SelfVariableAccess e; override SelfVariableAccess getExpr() { result = super.getExpr() } } - private class VariableWriteAccessChildMapping extends ExprChildMapping, VariableWriteAccess { - override predicate relevantChild(AstNode n) { this.isExplicitWrite(n) } - } - /** A control-flow node that wraps a `VariableWriteAccess` AST expression. */ class VariableWriteAccessCfgNode extends VariableAccessCfgNode { /** @@ -784,20 +548,16 @@ module ExprNodes { override string getAPrimaryQlClass() { result = "VariableWriteAccessCfgNode" } - override VariableWriteAccessChildMapping e; + override VariableWriteAccess e; override VariableWriteAccess getExpr() { result = super.getExpr() } } - private class LocalVariableWriteAccessChildMapping extends VariableWriteAccessChildMapping, - LocalVariableWriteAccess - { } - /** A control-flow node that wraps a `LocalVariableWriteAccess` AST expression. */ class LocalVariableWriteAccessCfgNode extends VariableWriteAccessCfgNode { override string getAPrimaryQlClass() { result = "LocalVariableWriteAccessCfgNode" } - override LocalVariableWriteAccessChildMapping e; + override LocalVariableWriteAccess e; final override LocalVariableWriteAccess getExpr() { result = super.getExpr() } @@ -870,20 +630,16 @@ module ExprNodes { } } - private class StringlikeLiteralChildMapping extends ExprChildMapping, StringlikeLiteral { - override predicate relevantChild(AstNode n) { n = this.getComponent(_) } - } - /** A control-flow node that wraps a `StringlikeLiteral` AST expression. */ class StringlikeLiteralCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "StringlikeLiteralCfgNode" } - override StringlikeLiteralChildMapping e; + override StringlikeLiteral e; override StringlikeLiteral getExpr() { result = super.getExpr() } /** Gets the `n`th component of this `StringlikeLiteral` */ - StringComponentCfgNode getComponent(int n) { e.hasCfgChild(e.getComponent(n), this, result) } + StringComponentCfgNode getComponent(int n) { result.injects(desugar(e.getComponent(n))) } /** Gets a component of this `StringlikeLiteral` */ StringComponentCfgNode getAComponent() { result = this.getComponent(_) } @@ -929,15 +685,11 @@ module ExprNodes { final override RelationalOperation getExpr() { result = super.getExpr() } } - private class SplatExprChildMapping extends OperationExprChildMapping, SplatExpr { - override predicate relevantChild(AstNode n) { n = this.getOperand() } - } - /** A control-flow node that wraps a `SplatExpr` AST expression. */ class SplatExprCfgNode extends UnaryOperationCfgNode { override string getAPrimaryQlClass() { result = "SplatExprCfgNode" } - override SplatExprChildMapping e; + override SplatExpr e; final override SplatExpr getExpr() { result = super.getExpr() } } diff --git a/ruby/ql/lib/codeql/ruby/controlflow/ControlFlowGraph.qll b/ruby/ql/lib/codeql/ruby/controlflow/ControlFlowGraph.qll index 8a7abea30904..02fd1e91ca17 100644 --- a/ruby/ql/lib/codeql/ruby/controlflow/ControlFlowGraph.qll +++ b/ruby/ql/lib/codeql/ruby/controlflow/ControlFlowGraph.qll @@ -4,10 +4,7 @@ module; import codeql.controlflow.SuccessorType private import codeql.ruby.AST -private import codeql.ruby.controlflow.BasicBlocks -private import internal.ControlFlowGraphImpl as CfgImpl -private import internal.Splitting as Splitting -private import internal.Completion +import ControlFlowGraph2 /** * An AST node with an associated control-flow graph. @@ -17,12 +14,12 @@ private import internal.Completion * Note that module declarations are not themselves CFG scopes, as they are part of * the CFG of the enclosing top-level or callable. */ -class CfgScope extends Scope instanceof CfgImpl::CfgScopeImpl { +class CfgScope extends Scope instanceof CfgScopeImpl { /** Gets the CFG scope that this scope is nested under, if any. */ final CfgScope getOuterCfgScope() { exists(AstNode parent | parent = this.getParent() and - result = CfgImpl::getCfgScope(parent) + result = getEnclosingCallable(parent) ) } } @@ -35,14 +32,11 @@ class CfgScope extends Scope instanceof CfgImpl::CfgScopeImpl { * * Only nodes that can be reached from an entry point are included in the CFG. */ -class CfgNode extends CfgImpl::Node { +class CfgNode extends ControlFlowNode { /** Gets the name of the primary QL class for this node. */ overlay[global] string getAPrimaryQlClass() { none() } - /** Gets the file of this control flow node. */ - final File getFile() { result = this.getLocation().getFile() } - /** Gets a successor node of a given type, if any. */ final CfgNode getASuccessor(SuccessorType t) { result = super.getASuccessor(t) } @@ -54,14 +48,4 @@ class CfgNode extends CfgImpl::Node { /** Gets an immediate predecessor, if any. */ final CfgNode getAPredecessor() { result = this.getAPredecessor(_) } - - /** Gets the basic block that this control flow node belongs to. */ - BasicBlock getBasicBlock() { result.getANode() = this } -} - -class Split = Splitting::Split; - -/** Provides different kinds of control flow graph splittings. */ -module Split { - class ConditionalCompletionSplit = Splitting::ConditionalCompletionSplit; } diff --git a/ruby/ql/lib/codeql/ruby/controlflow/ControlFlowGraph2.qll b/ruby/ql/lib/codeql/ruby/controlflow/ControlFlowGraph2.qll new file mode 100644 index 000000000000..b8a458c33f20 --- /dev/null +++ b/ruby/ql/lib/codeql/ruby/controlflow/ControlFlowGraph2.qll @@ -0,0 +1,522 @@ +/** + * Provides classes representing the control flow graph within callables. + */ +overlay[local] +module; + +private import ruby as R +private import codeql.Locations +private import codeql.controlflow.ControlFlowGraph +private import codeql.controlflow.SuccessorType +private import codeql.ruby.ast.internal.Synthesis +private import codeql.ruby.ast.internal.Scope + +private module Cfg0 = Make0; + +private module Cfg1 = Make1; + +private module Cfg2 = Make2; + +private import Cfg0 +private import Cfg1 +private import Cfg2 +import Public + +private Ast::AstNode desugar(R::Ast::AstNode n) { result = n or result = n.getDesugared() } + +class CfgScopeImpl = Ast::Callable; + +predicate getEnclosingCallable = Ast::getEnclosingCallable/1; + +/** Provides an implementation of the AST signature for Ruby. */ +private module Ast implements AstSig { + private import codeql.ruby.ast.internal.AST + + private predicate additionalExclude(R::Ast::AstNode n) { + n instanceof R::Ast::DestructuredLhsExpr or + exists(n.getDesugared()) + } + + class AstNode extends R::Ast::AstNode { + AstNode() { + not any(Synthesis s).excludeFromControlFlowTree(this) and not additionalExclude(this) + } + } + + private R::Ast::AstNode adjustedGetChild(R::Ast::AstNode parent, int index) { + exists(R::Ast::WhenClause when | parent = when | + when.getPattern(index) = result + or + when.getBody() = result and index = toGenerated(result).getParentIndex() + ) + or + exists(R::Ast::MethodCall call | parent = call and not call instanceof R::Ast::BinaryOperation | + index = -1 and call.getReceiver() = result + or + call.getArgument(index) = result + or + index = call.getNumberOfArguments() and + call.getBlock() = result + ) + or + exists(R::Ast::ClassDeclaration cls | parent = cls | + index = 0 and cls.getScopeExpr() = result + or + index = 1 and cls.getSuperclassExpr() = result + or + cls.getStmt(index - 2) = result + ) + or + exists(R::Ast::ModuleDeclaration mod | parent = mod | + index = 0 and mod.getScopeExpr() = result + or + mod.getStmt(index - 1) = result + ) + or + exists(R::Ast::SingletonClass cls | parent = cls | + index = 0 and cls.getValue() = result + or + cls.getStmt(index - 1) = result + ) + or + exists(R::Ast::SingletonMethod method | parent = method | + index = 0 and method.getObject() = result + ) + or + exists(R::Ast::Pair pair | parent = pair | + index = 0 and pair.getKey() = result + or + index = 1 and pair.getValue() = result + ) + or + exists(R::Ast::ArrayPattern arraypattern | parent = arraypattern | + index = -1 and arraypattern.getClass() = result + or + arraypattern.getPrefixElement(index) = result + or + exists(int restix | restix = count(arraypattern.getPrefixElement(_)) | + restix = index and arraypattern.getRestVariableAccess() = result + or + arraypattern.getSuffixElement(index - restix - 1) = result + ) + ) + or + exists(R::Ast::FindPattern findpattern | parent = findpattern | + index = -2 and findpattern.getClass() = result + or + index = -1 and findpattern.getPrefixVariableAccess() = result + or + findpattern.getElement(index) = result + or + index = 1 + max(int i | exists(findpattern.getElement(i))) and + findpattern.getSuffixVariableAccess() = result + ) + or + exists(R::Ast::HashPattern hashpattern | parent = hashpattern | + index = -1 and hashpattern.getClass() = result + or + exists(int i | + hashpattern.getKey(i) = result and + index = 2 * i + or + hashpattern.getValue(i) = result and + index = 2 * i + 1 + ) + or + index = 2 * count(hashpattern.getValue(_)) and hashpattern.getRestVariableAccess() = result + ) + } + + private R::Ast::AstNode baseGetChild(R::Ast::AstNode parent, int index) { + result = adjustedGetChild(parent, index) + or + not exists(adjustedGetChild(parent, _)) and + not parent instanceof R::Ast::Callable and + ( + synthChild(parent, index, result) + or + result = parent.getAChild() and + not synthChild(parent, _, result) and + toGenerated(result).getParentIndex() = index + ) + } + + AstNode getChild(AstNode parent, int index) { result = desugar(baseGetChild(parent, index)) } + + private R::Ast::Scope parentScope(R::Ast::Scope n) { + result = n.getOuterScope() and + not n instanceof Callable + } + + cached + Callable getEnclosingCallable(AstNode node) { result = parentScope*(scopeOfInclSynth(node)) } + + // TODO: Include EndBlock + class Callable extends AstNode { + Callable() { this instanceof R::Ast::Toplevel or this instanceof R::Ast::Callable } + } + + AstNode callableGetBody(Callable c) { + result = c.(R::Ast::Toplevel).getABeginBlock() or + result = c.(R::Ast::Toplevel).getAStmt() or + result = c.(R::Ast::Callable).getBody() + } + + class Parameter extends AstNode instanceof R::Ast::Parameter { + AstNode getPattern() { + this.(R::Ast::NamedParameter).getDefiningAccess() = result + or + not exists(this.(R::Ast::NamedParameter).getDefiningAccess()) and + this = result + } + + Expr getDefaultValue() { + result = desugar(this.(R::Ast::KeywordParameter).getDefaultValue()) or + result = desugar(this.(R::Ast::OptionalParameter).getDefaultValue()) + } + } + + Parameter callableGetParameter(Callable c, int index) { + c.(R::Ast::Callable).getParameter(index) = result + } + + class Stmt extends AstNode instanceof R::Ast::Stmt { } + + // Most ast nodes in Ruby are both statements and expressions with only a few + // that are only statements. Similarly, most nodes accept statement children, + // but a few only accept expression children. But since this really only + // matters for parsing, we can just treat expressions and statements as the + // same thing to avoid hard-to-find mistakes. + class Expr = Stmt; + + class BlockStmt extends Stmt instanceof R::Ast::StmtSequence { + BlockStmt() { not this instanceof TryStmt } + + Stmt getStmt(int n) { result = desugar(super.getStmt(n)) } + + Stmt getLastStmt() { result = desugar(super.getLastStmt()) } + } + + class ExprStmt extends Stmt { + ExprStmt() { none() } + + Expr getExpr() { none() } + } + + class IfStmt extends Stmt instanceof R::Ast::ConditionalExpr { + IfStmt() { + exists(Stmt branch | + branch = desugar(super.getBranch(_)) and not branch instanceof R::Ast::Expr + ) + } + + Expr getCondition() { result = desugar(super.getCondition()) } + + Stmt getThen() { result = desugar(super.getBranch(true)) } + + Stmt getElse() { result = desugar(super.getBranch(false)) } + } + + class LoopStmt extends Stmt instanceof R::Ast::Loop { + Stmt getBody() { result = desugar(super.getBody()) } + } + + class WhileStmt extends LoopStmt instanceof R::Ast::ConditionalLoop { + WhileStmt() { this instanceof R::Ast::WhileExpr or this instanceof R::Ast::WhileModifierExpr } + + Expr getCondition() { result = desugar(super.getCondition()) } + } + + class UntilStmt extends LoopStmt instanceof R::Ast::ConditionalLoop { + UntilStmt() { this instanceof R::Ast::UntilExpr or this instanceof R::Ast::UntilModifierExpr } + + Expr getCondition() { result = desugar(super.getCondition()) } + } + + class DoStmt extends LoopStmt { + DoStmt() { none() } + + Expr getCondition() { none() } + } + + class ForStmt extends LoopStmt { + ForStmt() { none() } + + AstNode getInit(int index) { none() } + + Expr getCondition() { none() } + + AstNode getUpdate(int index) { none() } + } + + // `ForExpr` would be a match for `ForeachStmt`, but it is desugared. + class ForeachStmt extends LoopStmt { + ForeachStmt() { none() } + + Expr getVariable() { none() } + + Expr getCollection() { none() } + } + + class BreakStmt extends Stmt instanceof R::Ast::BreakStmt { } + + class ContinueStmt extends Stmt instanceof R::Ast::NextStmt { } + + class GotoStmt extends Stmt { + GotoStmt() { none() } + } + + class ReturnStmt extends Stmt instanceof R::Ast::ReturnStmt { + Expr getExpr() { result = desugar(super.getValue()) } + } + + // raise is just a method call + class Throw extends AstNode { + Throw() { none() } + + Expr getExpr() { none() } + } + + class TryStmt extends Stmt instanceof R::Ast::BodyStmt { + TryStmt() { exists(this.getRescue(_)) or exists(this.getElse()) or this.hasEnsure() } + + AstNode getBody(int index) { result = desugar(super.getStmt(index)) } + + CatchClause getCatch(int index) { result = super.getRescue(index) } + + Stmt getFinally() { result = super.getEnsure() } + } + + AstNode getTryElse(TryStmt try) { result = try.(R::Ast::BodyStmt).getElse() } + + class CatchClause extends AstNode instanceof R::Ast::RescueClause { + AstNode getPattern() { result = desugar(super.getPattern()) } + + AstNode getVariable() { result = super.getVariableExpr() } + + Expr getCondition() { none() } + + Stmt getBody() { result = super.getBody() } + } + + class Switch extends AstNode instanceof R::Ast::CaseExpr { + Expr getExpr() { result = desugar(super.getValue()) } + + Case getCase(int index) { result = super.getBranch(index) } + + Stmt getStmt(int index) { none() } + } + + class Case extends AstNode { + Case() { this = any(R::Ast::CaseExpr switch).getABranch() } + + AstNode getPattern(int index) { + desugar(this.(R::Ast::WhenClause).getPattern(index)) = result + or + desugar(this.(R::Ast::InClause).getPattern()) = result and index = 0 + } + + Expr getGuard() { desugar(this.(R::Ast::InClause).getCondition()) = result } + + AstNode getBody() { + desugar(this.(R::Ast::WhenClause).getBody()) = result or + desugar(this.(R::Ast::InClause).getBody()) = result or + desugar(this.(R::Ast::CaseElseBranch).getBody()) = result + } + } + + class DefaultCase extends Case instanceof R::Ast::CaseElseBranch { } + + class ConditionalExpr extends Expr instanceof R::Ast::ConditionalExpr { + ConditionalExpr() { not this instanceof IfStmt } + + Expr getCondition() { result = desugar(super.getCondition()) } + + Expr getThen() { result = desugar(super.getBranch(true)) } + + Expr getElse() { result = desugar(super.getBranch(false)) } + } + + class BinaryExpr extends Expr { + BinaryExpr() { this instanceof R::Ast::BinaryOperation or this instanceof R::Ast::Assignment } + + Expr getLeftOperand() { + result = desugar(this.(R::Ast::BinaryOperation).getLeftOperand()) or + result = desugar(this.(R::Ast::Assignment).getLeftOperand()) + } + + Expr getRightOperand() { + result = desugar(this.(R::Ast::BinaryOperation).getRightOperand()) or + result = desugar(this.(R::Ast::Assignment).getRightOperand()) + } + } + + class LogicalAndExpr extends BinaryExpr instanceof R::Ast::LogicalAndExpr { } + + class LogicalOrExpr extends BinaryExpr instanceof R::Ast::LogicalOrExpr { } + + class NullCoalescingExpr extends BinaryExpr { + NullCoalescingExpr() { none() } + } + + class UnaryExpr extends Expr instanceof R::Ast::UnaryOperation { + Expr getOperand() { result = desugar(super.getOperand()) } + } + + class LogicalNotExpr extends UnaryExpr instanceof R::Ast::NotExpr { } + + class Assignment extends BinaryExpr instanceof R::Ast::Assignment { } + + class AssignExpr extends Assignment instanceof R::Ast::AssignExpr { } + + // Compound assignments are desugared. + class CompoundAssignment extends Assignment { + CompoundAssignment() { none() } + } + + class AssignLogicalAndExpr extends CompoundAssignment { } + + class AssignLogicalOrExpr extends CompoundAssignment { } + + class AssignNullCoalescingExpr extends CompoundAssignment { } + + class BooleanLiteral extends Expr instanceof R::Ast::BooleanLiteral { + boolean getValue() { result = super.getValue() } + } + + class PatternMatchExpr extends Expr { + PatternMatchExpr() { none() } + + Expr getExpr() { none() } + + AstNode getPattern() { none() } + } +} + +private predicate rescuable(R::Ast::AstNode n) { + exists(R::Ast::RescueModifierExpr rescueModifier | n = desugar(rescueModifier.getBody())) + or + exists(Ast::TryStmt try | n = try.getBody(_)) + or + exists(R::Ast::AstNode parent | n = desugar(parent.getAChild()) and rescuable(parent)) +} + +/** + * Holds if `c` happens in an exception-aware context, that is, it may be + * `rescue`d or `ensure`d. In such cases, we assume that the target of `c` + * may raise an exception (in addition to evaluating normally). + */ +private predicate mayRaise(R::Ast::Call c) { rescuable(c) } + +private module Input implements InputSig1, InputSig2 { + private import codeql.util.Void + private import codeql.util.Unit + private import internal.NonReturning + + predicate cfgCachedStageRef() { CfgCachedStage::ref() } + + class Label = Void; + + predicate preOrderExpr(Ast::Expr e) { + e instanceof R::Ast::StmtSequence or + e instanceof R::Ast::RescueClause or + e instanceof R::Ast::ConditionalExpr or + e instanceof R::Ast::Loop or + e instanceof R::Ast::RescueModifierExpr + } + + predicate postOrInOrder(Ast::AstNode n) { + n instanceof R::Ast::Call and + not n instanceof R::Ast::BinaryOperation and + not n instanceof R::Ast::UnaryOperation + or + n instanceof R::Ast::RedoStmt + or + n instanceof R::Ast::RetryStmt + } + + class CallableContext = Unit; + + Ast::AstNode callableGetBodyPart(Ast::Callable c, CallableContext ctx, int index) { + exists(R::Ast::Toplevel t | + c = t and + exists(ctx) + | + result = t.getBeginBlock(index) or + result = desugar(t.getStmt(index - count(t.getABeginBlock()))) + ) + } + + predicate catchAll(Ast::CatchClause catch) { + not exists(catch.(R::Ast::RescueClause).getAnException()) + } + + predicate beginAbruptCompletion( + Ast::AstNode ast, PreControlFlowNode n, AbruptCompletion c, boolean always + ) { + ast.(NonReturningCall).getASuccessorType() = c.asSimpleAbruptCompletion() and + n.isIn(ast) and + always = true + or + mayRaise(ast) and + n.isIn(ast) and + c.asSimpleAbruptCompletion() instanceof ExceptionSuccessor and + always = false + or + ast instanceof R::Ast::RedoStmt and + n.isIn(ast) and + c.asSimpleAbruptCompletion() instanceof RedoSuccessor and + always = true + or + ast instanceof R::Ast::RetryStmt and + n.isIn(ast) and + c.asSimpleAbruptCompletion() instanceof RetrySuccessor and + always = true + } + + predicate endAbruptCompletion(Ast::AstNode ast, PreControlFlowNode n, AbruptCompletion c) { + exists(R::Ast::Callable callable | + callable.getBody() = ast and + n.(NormalExitNodeImpl).getEnclosingCallable() = callable + | + c.asSimpleAbruptCompletion() instanceof BreakSuccessor or + c.asSimpleAbruptCompletion() instanceof ContinueSuccessor or + c.asSimpleAbruptCompletion() instanceof RedoSuccessor + ) + or + exists(R::Ast::RescueModifierExpr rescueModifier | + ast = desugar(rescueModifier.getBody()) and + c.getSuccessorType() instanceof ExceptionSuccessor and + n.isBefore(desugar(rescueModifier.getHandler())) + ) + or + ast = any(Ast::LoopStmt loop).getBody() and + c.asSimpleAbruptCompletion() instanceof RedoSuccessor and + n.isBefore(ast) + or + exists(Ast::TryStmt try | + ast = try.getCatch(_).getBody() and + c.asSimpleAbruptCompletion() instanceof RetrySuccessor and + n.isBefore(try.getBody(0)) + ) + } + + predicate step(PreControlFlowNode n1, PreControlFlowNode n2) { + exists(Ast::ConditionalExpr ce | + n1.isAfterTrue(ce.getCondition()) and not exists(ce.getThen()) and n2.isAfter(ce) + or + n1.isAfterFalse(ce.getCondition()) and not exists(ce.getElse()) and n2.isAfter(ce) + ) + or + exists(R::Ast::RescueModifierExpr rescueModifier | + n1.isBefore(rescueModifier) and + n2.isBefore(desugar(rescueModifier.getBody())) + or + n1.isAfter(desugar(rescueModifier.getBody())) and + n2.isAfter(rescueModifier) + or + n1.isAfter(desugar(rescueModifier.getHandler())) and + n2.isAfter(rescueModifier) + ) + } +} diff --git a/ruby/ql/lib/codeql/ruby/controlflow/internal/Completion.qll b/ruby/ql/lib/codeql/ruby/controlflow/internal/Completion.qll deleted file mode 100644 index bcfe8f98d437..000000000000 --- a/ruby/ql/lib/codeql/ruby/controlflow/internal/Completion.qll +++ /dev/null @@ -1,565 +0,0 @@ -/** - * Provides classes representing control flow completions. - * - * A completion represents how a statement or expression terminates. - */ -overlay[local] -module; - -private import codeql.ruby.AST -private import codeql.ruby.ast.internal.AST -private import codeql.ruby.ast.internal.Control -private import codeql.ruby.controlflow.ControlFlowGraph -private import ControlFlowGraphImpl as CfgImpl -private import NonReturning - -private newtype TCompletion = - TSimpleCompletion() or - TBooleanCompletion(boolean b) { b in [false, true] } or - TMatchingCompletion(boolean isMatch) { isMatch in [false, true] } or - TReturnCompletion() or - TBreakCompletion() or - TNextCompletion() or - TRedoCompletion() or - TRetryCompletion() or - TRaiseCompletion() or // TODO: Add exception type? - TExitCompletion() or - TNestedCompletion(TCompletion inner, TCompletion outer, int nestLevel) { - inner = TBreakCompletion() and - outer instanceof NonNestedNormalCompletion and - nestLevel = 0 - or - inner instanceof TBooleanCompletion and - outer instanceof TMatchingCompletion and - nestLevel = 0 - or - inner instanceof NormalCompletion and - nestedEnsureCompletion(outer, nestLevel) - } - -pragma[noinline] -private predicate nestedEnsureCompletion(TCompletion outer, int nestLevel) { - ( - outer = TReturnCompletion() - or - outer = TBreakCompletion() - or - outer = TNextCompletion() - or - outer = TRedoCompletion() - or - outer = TRetryCompletion() - or - outer = TRaiseCompletion() - or - outer = TExitCompletion() - ) and - nestLevel = any(CfgImpl::Trees::BodyStmtTree t).getNestLevel() -} - -pragma[noinline] -private predicate completionIsValidForStmt(AstNode n, Completion c) { - n instanceof BreakStmt and - c = TBreakCompletion() - or - n instanceof NextStmt and - c = TNextCompletion() - or - n instanceof RedoStmt and - c = TRedoCompletion() - or - n instanceof ReturnStmt and - c = TReturnCompletion() -} - -private AstNode getARescuableBodyChild() { - exists(CfgImpl::Trees::BodyStmtTree bst | result = bst.getBodyChild(_, true) | - exists(bst.getARescue()) - or - exists(bst.getEnsure()) - ) - or - result = getARescuableBodyChild().getAChild() -} - -/** - * Holds if `c` happens in an exception-aware context, that is, it may be - * `rescue`d or `ensure`d. In such cases, we assume that the target of `c` - * may raise an exception (in addition to evaluating normally). - */ -private predicate mayRaise(Call c) { c = getARescuableBodyChild() } - -/** A completion of a statement or an expression. */ -abstract class Completion extends TCompletion { - private predicate isValidForSpecific0(AstNode n) { - this = n.(NonReturningCall).getACompletion() - or - completionIsValidForStmt(n, this) - or - mustHaveBooleanCompletion(n) and - ( - exists(boolean value | isBooleanConstant(n, value) | this = TBooleanCompletion(value)) - or - not isBooleanConstant(n, _) and - this = TBooleanCompletion(_) - ) - or - mustHaveMatchingCompletion(n) and - this = TMatchingCompletion(_) - or - n = any(RescueModifierExpr parent).getBody() and - this = [TSimpleCompletion().(TCompletion), TRaiseCompletion()] - } - - private predicate isValidForSpecific(AstNode n) { - this.isValidForSpecific0(n) - or - exists(AstNode other | n = other.getDesugared() and this.isValidForSpecific(other)) - or - mayRaise(n) and - ( - this = TRaiseCompletion() - or - not any(Completion c).isValidForSpecific0(n) and - this = TSimpleCompletion() - ) - } - - /** Holds if this completion is valid for node `n`. */ - predicate isValidFor(AstNode n) { - this.isValidForSpecific(n) - or - not any(Completion c).isValidForSpecific(n) and - this = TSimpleCompletion() - } - - /** - * Holds if this completion will continue a loop when it is the completion - * of a loop body. - */ - predicate continuesLoop() { - this instanceof NormalCompletion or - this instanceof NextCompletion - } - - /** - * Gets the inner completion. This is either the inner completion, - * when the completion is nested, or the completion itself. - */ - Completion getInnerCompletion() { result = this } - - /** - * Gets the outer completion. This is either the outer completion, - * when the completion is nested, or the completion itself. - */ - Completion getOuterCompletion() { result = this } - - /** Gets a successor type that matches this completion. */ - abstract SuccessorType getAMatchingSuccessorType(); - - /** Gets a textual representation of this completion. */ - abstract string toString(); -} - -/** Holds if node `n` has the Boolean constant value `value`. */ -private predicate isBooleanConstant(AstNode n, boolean value) { - mustHaveBooleanCompletion(n) and - ( - n.(BooleanLiteral).isTrue() and - value = true - or - n.(BooleanLiteral).isFalse() and - value = false - ) -} - -/** - * Holds if a normal completion of `n` must be a Boolean completion. - */ -private predicate mustHaveBooleanCompletion(AstNode n) { - inBooleanContext(n) and - not n instanceof NonReturningCall -} - -/** - * Holds if `n` is used in a Boolean context. That is, the value - * that `n` evaluates to determines a true/false branch successor. - */ -private predicate inBooleanContext(AstNode n) { - exists(ConditionalExpr i | - n = i.getCondition() - or - inBooleanContext(i) and - n = i.getBranch(_) - ) - or - n = any(ConditionalLoop parent).getCondition() - or - n = any(InClause parent).getCondition() - or - exists(LogicalAndExpr parent | - n = parent.getLeftOperand() - or - inBooleanContext(parent) and - n = parent.getRightOperand() - ) - or - exists(LogicalOrExpr parent | - n = parent.getLeftOperand() - or - inBooleanContext(parent) and - n = parent.getRightOperand() - ) - or - n = any(NotExpr parent | inBooleanContext(parent)).getOperand() - or - n = any(StmtSequence parent | inBooleanContext(parent)).getLastStmt() - or - exists(CaseExpr c, WhenClause w | - not exists(c.getValue()) and - c.getABranch() = w - | - w.getPattern(_) = n - or - w = n - ) -} - -/** - * Holds if a normal completion of `n` must be a matching completion. - */ -private predicate mustHaveMatchingCompletion(AstNode n) { - inMatchingContext(n) and - not n instanceof NonReturningCall -} - -/** - * Holds if `n` is used in a matching context. That is, whether or - * not the value of `n` matches, determines the successor. - */ -private predicate inMatchingContext(AstNode n) { - n = any(RescueClause r).getException(_) - or - exists(CaseExpr c, WhenClause w | - exists(c.getValue()) and - c.getABranch() = w - | - w.getPattern(_) = n - or - w = n - ) - or - n instanceof CasePattern - or - n = any(ReferencePattern p).getExpr() - or - n.(CfgImpl::Trees::DefaultValueParameterTree).hasDefaultValue() -} - -/** - * A completion that represents normal evaluation of a statement or an - * expression. - */ -abstract class NormalCompletion extends Completion { } - -abstract private class NonNestedNormalCompletion extends NormalCompletion { } - -/** A simple (normal) completion. */ -class SimpleCompletion extends NonNestedNormalCompletion, TSimpleCompletion { - override DirectSuccessor getAMatchingSuccessorType() { any() } - - override string toString() { result = "simple" } -} - -/** - * A completion that represents evaluation of an expression, whose value determines - * the successor. Either a Boolean completion (`BooleanCompletion`), or a matching - * completion (`MatchingCompletion`). - */ -abstract class ConditionalCompletion extends NormalCompletion { - boolean value; - - bindingset[value] - ConditionalCompletion() { any() } - - /** Gets the Boolean value of this conditional completion. */ - final boolean getValue() { result = value } -} - -/** - * A completion that represents evaluation of an expression - * with a Boolean value. - */ -class BooleanCompletion extends ConditionalCompletion, NonNestedNormalCompletion, TBooleanCompletion -{ - BooleanCompletion() { this = TBooleanCompletion(value) } - - /** Gets the dual Boolean completion. */ - BooleanCompletion getDual() { result = TBooleanCompletion(value.booleanNot()) } - - override BooleanSuccessor getAMatchingSuccessorType() { result.getValue() = value } - - override string toString() { result = value.toString() } -} - -/** A Boolean `true` completion. */ -class TrueCompletion extends BooleanCompletion { - TrueCompletion() { this.getValue() = true } -} - -/** A Boolean `false` completion. */ -class FalseCompletion extends BooleanCompletion { - FalseCompletion() { this.getValue() = false } -} - -/** - * A completion that represents evaluation of a matching test, for example - * a test in a `rescue` statement. - */ -class MatchingCompletion extends ConditionalCompletion { - MatchingCompletion() { - this = TMatchingCompletion(value) - or - this = TNestedCompletion(_, TMatchingCompletion(value), _) - } - - override ConditionalSuccessor getAMatchingSuccessorType() { - this = TMatchingCompletion(result.(MatchingSuccessor).getValue()) - } - - override string toString() { if value = true then result = "match" else result = "no-match" } -} - -/** - * A completion that represents evaluation of a statement or an - * expression resulting in a return. - */ -class ReturnCompletion extends Completion { - ReturnCompletion() { - this = TReturnCompletion() or - this = TNestedCompletion(_, TReturnCompletion(), _) - } - - override ReturnSuccessor getAMatchingSuccessorType() { any() } - - override string toString() { - // `NestedCompletion` defines `toString()` for the other case - this = TReturnCompletion() and result = "return" - } -} - -/** - * A completion that represents evaluation of a statement or an - * expression resulting in a break from a loop. - */ -class BreakCompletion extends Completion { - BreakCompletion() { - this = TBreakCompletion() or - this = TNestedCompletion(_, TBreakCompletion(), _) - } - - override BreakSuccessor getAMatchingSuccessorType() { any() } - - override string toString() { - // `NestedCompletion` defines `toString()` for the other case - this = TBreakCompletion() and result = "break" - } -} - -/** - * A completion that represents evaluation of a statement or an - * expression resulting in a continuation of a loop. - */ -class NextCompletion extends Completion { - NextCompletion() { - this = TNextCompletion() or - this = TNestedCompletion(_, TNextCompletion(), _) - } - - override ContinueSuccessor getAMatchingSuccessorType() { any() } - - override string toString() { - // `NestedCompletion` defines `toString()` for the other case - this = TNextCompletion() and result = "next" - } -} - -/** - * A completion that represents evaluation of a statement or an - * expression resulting in a redo of a loop iteration. - */ -class RedoCompletion extends Completion { - RedoCompletion() { - this = TRedoCompletion() or - this = TNestedCompletion(_, TRedoCompletion(), _) - } - - override RedoSuccessor getAMatchingSuccessorType() { any() } - - override string toString() { - // `NestedCompletion` defines `toString()` for the other case - this = TRedoCompletion() and result = "redo" - } -} - -/** - * A completion that represents evaluation of a statement or an - * expression resulting in a retry. - */ -class RetryCompletion extends Completion { - RetryCompletion() { - this = TRetryCompletion() or - this = TNestedCompletion(_, TRetryCompletion(), _) - } - - override RetrySuccessor getAMatchingSuccessorType() { any() } - - override string toString() { - // `NestedCompletion` defines `toString()` for the other case - this = TRetryCompletion() and result = "retry" - } -} - -/** - * A completion that represents evaluation of a statement or an - * expression resulting in a thrown exception. - */ -class RaiseCompletion extends Completion { - RaiseCompletion() { - this = TRaiseCompletion() or - this = TNestedCompletion(_, TRaiseCompletion(), _) - } - - override ExceptionSuccessor getAMatchingSuccessorType() { any() } - - override string toString() { - // `NestedCompletion` defines `toString()` for the other case - this = TRaiseCompletion() and result = "raise" - } -} - -/** - * A completion that represents evaluation of a statement or an - * expression resulting in an abort/exit. - */ -class ExitCompletion extends Completion { - ExitCompletion() { - this = TExitCompletion() or - this = TNestedCompletion(_, TExitCompletion(), _) - } - - override ExitSuccessor getAMatchingSuccessorType() { any() } - - override string toString() { - // `NestedCompletion` defines `toString()` for the other case - this = TExitCompletion() and result = "exit" - } -} - -/** - * A nested completion. For example, in - * - * ```rb - * def m - * while x >= 0 - * x -= 1 - * if num > 100 - * break - * end - * end - * puts "done" - * end - * ``` - * - * the `while` loop can have a nested completion where the inner completion - * is a `break` and the outer completion is a simple successor. - */ -abstract class NestedCompletion extends Completion, TNestedCompletion { - Completion inner; - Completion outer; - int nestLevel; - - NestedCompletion() { this = TNestedCompletion(inner, outer, nestLevel) } - - /** Gets a completion that is compatible with the inner completion. */ - Completion getAnInnerCompatibleCompletion() { - result.getOuterCompletion() = this.getInnerCompletion() - } - - /** Gets the level of this nested completion. */ - final int getNestLevel() { result = nestLevel } - - override string toString() { result = outer + " [" + inner + "] (" + nestLevel + ")" } -} - -class NestedBreakCompletion extends NormalCompletion, NestedCompletion { - NestedBreakCompletion() { - inner = TBreakCompletion() and - outer instanceof NonNestedNormalCompletion - } - - override BreakCompletion getInnerCompletion() { result = inner } - - override NonNestedNormalCompletion getOuterCompletion() { result = outer } - - override Completion getAnInnerCompatibleCompletion() { - result = inner and - outer = TSimpleCompletion() - or - result = TNestedCompletion(outer, inner, _) - } - - override SuccessorType getAMatchingSuccessorType() { - outer instanceof SimpleCompletion and - result instanceof BreakSuccessor - or - result = outer.(ConditionalCompletion).getAMatchingSuccessorType() - } -} - -class NestedEnsureCompletion extends NestedCompletion { - NestedEnsureCompletion() { - inner instanceof NormalCompletion and - nestedEnsureCompletion(outer, nestLevel) - } - - override NormalCompletion getInnerCompletion() { result = inner } - - override Completion getOuterCompletion() { result = outer } - - override SuccessorType getAMatchingSuccessorType() { none() } -} - -/** - * A completion used for conditions in pattern matching: - * - * ```rb - * in x if x == 5 then puts "five" - * in x unless x == 4 then puts "not four" - * ``` - * - * The outer (Matching) completion indicates whether there is a match, and - * the inner (Boolean) completion indicates what the condition evaluated - * to. - * - * For the condition `x == 5` above, `TNestedCompletion(true, true, 0)` and - * `TNestedCompletion(false, false, 0)` are both valid completions, while - * `TNestedCompletion(true, false, 0)` and `TNestedCompletion(false, true, 0)` - * are valid completions for `x == 4`. - */ -class NestedMatchingCompletion extends NestedCompletion, MatchingCompletion { - NestedMatchingCompletion() { - inner instanceof TBooleanCompletion and - outer instanceof TMatchingCompletion - } - - override BooleanCompletion getInnerCompletion() { result = inner } - - override MatchingCompletion getOuterCompletion() { result = outer } - - override BooleanSuccessor getAMatchingSuccessorType() { - result.getValue() = this.getInnerCompletion().getValue() - } - - override string toString() { result = NestedCompletion.super.toString() } -} diff --git a/ruby/ql/lib/codeql/ruby/controlflow/internal/ControlFlowGraphImpl.qll b/ruby/ql/lib/codeql/ruby/controlflow/internal/ControlFlowGraphImpl.qll deleted file mode 100644 index e66e8bad0037..000000000000 --- a/ruby/ql/lib/codeql/ruby/controlflow/internal/ControlFlowGraphImpl.qll +++ /dev/null @@ -1,1510 +0,0 @@ -/** - * Provides an implementation for constructing control-flow graphs (CFGs) from - * abstract syntax trees (ASTs), using the shared library from `codeql.controlflow.Cfg`. - */ -overlay[local] -module; - -private import codeql.controlflow.Cfg as CfgShared -private import codeql.ruby.AST -private import codeql.ruby.AST as Ast -private import codeql.ruby.ast.internal.AST as AstInternal -private import codeql.ruby.ast.internal.Scope -private import codeql.ruby.ast.internal.Synthesis -private import codeql.ruby.ast.Scope -private import codeql.ruby.ast.internal.TreeSitter -private import codeql.ruby.ast.internal.Variable -private import codeql.ruby.controlflow.ControlFlowGraph -private import Completion - -class AstNode extends Ast::AstNode { - AstNode() { not any(Synthesis s).excludeFromControlFlowTree(this) } -} - -private module CfgInput implements CfgShared::InputSig { - private import ControlFlowGraphImpl as Impl - private import Completion as Comp - private import codeql.ruby.CFG as Cfg - - class AstNode = Impl::AstNode; - - class Completion = Comp::Completion; - - predicate completionIsNormal(Completion c) { c instanceof Comp::NormalCompletion } - - predicate completionIsSimple(Completion c) { c instanceof Comp::SimpleCompletion } - - predicate completionIsValidFor(Completion c, AstNode e) { c.isValidFor(e) } - - class CfgScope = Cfg::CfgScope; - - CfgScope getCfgScope(AstNode n) { result = Impl::getCfgScope(n) } - - predicate scopeFirst(CfgScope scope, AstNode first) { scope.(Impl::CfgScopeImpl).entry(first) } - - predicate scopeLast(CfgScope scope, AstNode last, Completion c) { - scope.(Impl::CfgScopeImpl).exit(last, c) - } - - private class SuccessorType = Cfg::SuccessorType; - - SuccessorType getAMatchingSuccessorType(Completion c) { result = c.getAMatchingSuccessorType() } - - private predicate id(Ruby::AstNode node1, Ruby::AstNode node2) { node1 = node2 } - - private predicate idOf(Ruby::AstNode node, int id) = equivalenceRelation(id/2)(node, id) - - int idOfAstNode(AstNode node) { idOf(AstInternal::toGeneratedInclSynth(node), result) } - - int idOfCfgScope(CfgScope node) { result = idOfAstNode(node) } -} - -private module CfgSplittingInput implements CfgShared::SplittingInputSig { - private import Splitting as S - - class SplitKindBase = S::TSplitKind; - - class Split = S::Split; -} - -private module ConditionalCompletionSplittingInput implements - CfgShared::ConditionalCompletionSplittingInputSig -{ - import Splitting::ConditionalCompletionSplitting::ConditionalCompletionSplittingInput -} - -import CfgShared::MakeWithSplitting - -abstract class CfgScopeImpl extends AstNode { - abstract predicate entry(AstNode first); - - abstract predicate exit(AstNode last, Completion c); -} - -private class ToplevelScope extends CfgScopeImpl, Toplevel { - final override predicate entry(AstNode first) { first(this, first) } - - final override predicate exit(AstNode last, Completion c) { last(this, last, c) } -} - -private class EndBlockScope extends CfgScopeImpl, EndBlock { - final override predicate entry(AstNode first) { - first(this.(Trees::EndBlockTree).getBodyChild(0, _), first) - } - - final override predicate exit(AstNode last, Completion c) { - last(this.(Trees::EndBlockTree).getLastBodyChild(), last, c) - or - last(this.(Trees::EndBlockTree).getBodyChild(_, _), last, c) and - not c instanceof NormalCompletion - } -} - -private class CallableScope extends CfgScopeImpl, Callable { - final override predicate entry(AstNode first) { - first(this.(Trees::CallableTree).getBodyChild(0), first) - } - - final override predicate exit(AstNode last, Completion c) { - this.getBody().(Trees::BodyStmtTree).last(last, c) - or - exists(int i | - not exists(this.getBody()) and - last(this.(Trees::CallableTree).getBodyChild(i), last, c) and - not exists(this.(Trees::CallableTree).getBodyChild(i + 1)) - ) - or - exists(AstNode child | - child = this.(Trees::CallableTree).getBodyChild(_) and - not child = this.getBody() and - last(child, last, c) and - not c instanceof NormalCompletion - ) - } -} - -/** Holds if `first` is first executed when entering `scope`. */ -pragma[nomagic] -predicate succEntry(CfgScopeImpl scope, AstNode first) { scope.entry(first) } - -/** Holds if `last` with completion `c` can exit `scope`. */ -pragma[nomagic] -predicate succExit(CfgScopeImpl scope, AstNode last, Completion c) { scope.exit(last, c) } - -/** Defines the CFG by dispatch on the various AST types. */ -module Trees { - private class AliasStmtTree extends StandardPreOrderTree instanceof AliasStmt { - final override ControlFlowTree getChildNode(int i) { - result = super.getNewName() and i = 0 - or - result = super.getOldName() and i = 1 - } - } - - private class ArgumentListTree extends StandardPostOrderTree instanceof ArgumentList { - final override ControlFlowTree getChildNode(int i) { result = super.getElement(i) } - } - - private class AssignExprTree extends StandardPostOrderTree instanceof AssignExpr { - AssignExprTree() { - exists(Expr left | left = super.getLeftOperand() | - left instanceof VariableAccess or - left instanceof ConstantAccess - ) - } - - final override ControlFlowTree getChildNode(int i) { - result = super.getLeftOperand() and i = 0 - or - result = super.getRightOperand() and i = 1 - } - } - - private class BeginTree extends BodyStmtTree instanceof BeginExpr { - final override predicate propagatesAbnormal(AstNode child) { none() } - } - - private class BlockArgumentTree extends StandardPostOrderTree instanceof BlockArgument { - final override ControlFlowTree getChildNode(int i) { result = super.getValue() and i = 0 } - } - - abstract private class NonDefaultValueParameterTree extends ControlFlowTree instanceof NamedParameter - { - final override predicate first(AstNode first) { - super.getDefiningAccess().(ControlFlowTree).first(first) - or - not exists(super.getDefiningAccess()) and first = this - } - - final override predicate last(AstNode last, Completion c) { - super.getDefiningAccess().(ControlFlowTree).last(last, c) - or - not exists(super.getDefiningAccess()) and - last = this and - c.isValidFor(this) - } - - override predicate propagatesAbnormal(AstNode child) { - super.getDefiningAccess().(ControlFlowTree).propagatesAbnormal(child) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { none() } - } - - private class BlockParameterTree extends NonDefaultValueParameterTree instanceof BlockParameter { - } - - class BodyStmtTree extends StmtSequenceTree instanceof BodyStmt { - /** Gets a rescue clause in this block. */ - final RescueClause getARescue() { result = super.getRescue(_) } - - /** Gets the `ensure` clause in this block, if any. */ - final StmtSequence getEnsure() { result = super.getEnsure() } - - override predicate first(AstNode first) { - first(this.getBodyChild(0, _), first) - or - not exists(this.getBodyChild(_, _)) and - first(super.getEnsure(), first) - } - - override predicate last(AstNode last, Completion c) { - exists(boolean ensurable | last = this.getAnEnsurePredecessor(c, ensurable) | - not super.hasEnsure() - or - ensurable = false - ) - or - // If the body completes normally, take the completion from the `ensure` block - this.lastEnsure(last, c, any(NormalCompletion nc), _) - or - // If the `ensure` block completes normally, it inherits any non-normal - // completion from the body - c = - any(NestedEnsureCompletion nec | - this.lastEnsure(last, nec.getAnInnerCompatibleCompletion(), nec.getOuterCompletion(), - nec.getNestLevel()) - ) - or - not exists(this.getBodyChild(_, _)) and - not exists(super.getRescue(_)) and - this.lastEnsure0(last, c) - or - last([super.getEnsure().(AstNode), this.getBodyChild(_, false)], last, c) and - not c instanceof NormalCompletion - } - - override predicate succ(AstNode pred, AstNode succ, Completion c) { - // Normal left-to-right evaluation in the body - exists(int i | - last(this.getBodyChild(i, _), pred, c) and - first(this.getBodyChild(i + 1, _), succ) and - c instanceof NormalCompletion - ) - or - // Exceptional flow from body to first `rescue` - this.lastBody(pred, c, true) and - first(super.getRescue(0), succ) and - c instanceof RaiseCompletion - or - // Flow from one `rescue` clause to the next when there is no match - exists(RescueTree rescue, int i | rescue = super.getRescue(i) | - rescue.lastNoMatch(pred, c) and - first(super.getRescue(i + 1), succ) - ) - or - // Flow from body to `else` block when no exception - this.lastBody(pred, c, _) and - first(super.getElse(), succ) and - c instanceof NormalCompletion - or - // Flow into `ensure` block - pred = this.getAnEnsurePredecessor(c, true) and - first(super.getEnsure(), succ) - } - - /** - * Gets a last element from this block that may finish with completion `c`, such - * that control may be transferred to the `ensure` block (if it exists), but only - * if `ensurable = true`. - */ - pragma[nomagic] - private AstNode getAnEnsurePredecessor(Completion c, boolean ensurable) { - this.lastBody(result, c, ensurable) and - ( - // Any non-throw completion will always continue directly to the `ensure` block, - // unless there is an `else` block - not c instanceof RaiseCompletion and - not exists(super.getElse()) - or - // Any completion will continue to the `ensure` block when there are no `rescue` - // blocks - not exists(super.getRescue(_)) - ) - or - // Last element from any matching `rescue` block continues to the `ensure` block - last(super.getRescue(_), result, c) and - ensurable = true - or - // If the last `rescue` block does not match, continue to the `ensure` block - exists(int lst, MatchingCompletion mc | - super.getRescue(lst).(RescueTree).lastNoMatch(result, mc) and - mc.getValue() = false and - not exists(super.getRescue(lst + 1)) and - c = - any(NestedEnsureCompletion nec | - nec.getOuterCompletion() instanceof RaiseCompletion and - nec.getInnerCompletion() = mc and - nec.getNestLevel() = 0 - ) and - ensurable = true - ) - or - // Last element of `else` block continues to the `ensure` block - last(super.getElse(), result, c) and - ensurable = true - } - - pragma[nomagic] - private predicate lastEnsure0(AstNode last, Completion c) { last(super.getEnsure(), last, c) } - - /** - * Gets a descendant that belongs to the `ensure` block of this block, if any. - * Nested `ensure` blocks are not included. - */ - pragma[nomagic] - AstNode getAnEnsureDescendant() { - result = super.getEnsure() - or - exists(AstNode mid | - mid = this.getAnEnsureDescendant() and - result = mid.getAChild() and - getCfgScope(result) = getCfgScope(mid) and - not exists(BodyStmt nestedBlock | - result = nestedBlock.getEnsure() and - nestedBlock != this - ) - ) - } - - /** - * Holds if `innerBlock` has an `ensure` block and is immediately nested inside the - * `ensure` block of this block. - */ - private predicate nestedEnsure(BodyStmtTree innerBlock) { - exists(StmtSequence innerEnsure | - innerEnsure = this.getAnEnsureDescendant().getAChild() and - getCfgScope(innerEnsure) = getCfgScope(this) and - innerEnsure = innerBlock.getEnsure() - ) - } - - /** - * Gets the `ensure`-nesting level of this block. That is, the number of `ensure` - * blocks that this block is nested under. - */ - int getNestLevel() { result = count(BodyStmtTree outer | outer.nestedEnsure+(this)) } - - pragma[nomagic] - private predicate lastEnsure( - AstNode last, NormalCompletion ensure, Completion outer, int nestLevel - ) { - this.lastEnsure0(last, ensure) and - exists( - this.getAnEnsurePredecessor(any(Completion c0 | outer = c0.getOuterCompletion()), true) - ) and - nestLevel = this.getNestLevel() - } - - /** - * Holds if `last` is a last element in the body of this block. `ensurable` - * indicates whether `last` may be a predecessor of an `ensure` block. - */ - pragma[nomagic] - private predicate lastBody(AstNode last, Completion c, boolean ensurable) { - exists(boolean rescuable | - if c instanceof RaiseCompletion then ensurable = rescuable else ensurable = true - | - last(this.getBodyChild(_, rescuable), last, c) and - not c instanceof NormalCompletion - or - exists(int lst | - last(this.getBodyChild(lst, rescuable), last, c) and - not exists(this.getBodyChild(lst + 1, _)) - ) - ) - } - } - - private class BooleanLiteralTree extends LeafTree instanceof BooleanLiteral { } - - class BraceBlockTree extends CallableTree instanceof BraceBlock { - final override AstNode getBodyChild(int i) { - result = super.getParameter(i) - or - result = super.getLocalVariable(i - super.getNumberOfParameters()) - or - result = super.getBody() and - i = super.getNumberOfParameters() + count(super.getALocalVariable()) - } - } - - class CallableTree extends PostOrderTree instanceof Callable { - final override predicate propagatesAbnormal(AstNode child) { none() } - - override predicate first(AstNode first) { first = this } - - abstract AstNode getBodyChild(int i); - - override predicate succ(AstNode pred, AstNode succ, Completion c) { - exists(int i | - last(this.getBodyChild(i), pred, c) and - first(this.getBodyChild(i + 1), succ) and - c instanceof NormalCompletion - ) - } - } - - private class CallTree extends StandardPostOrderTree instanceof Call { - CallTree() { - // Logical operations are handled separately - not this instanceof UnaryLogicalOperation and - not this instanceof BinaryLogicalOperation and - // Calls with the `&.` operator are desugared - not this.(MethodCall).isSafeNavigation() - } - - override ControlFlowTree getChildNode(int i) { result = super.getArgument(i) } - } - - private class CaseTree extends PostOrderTree instanceof CaseExpr, AstInternal::TCaseExpr { - final override predicate propagatesAbnormal(AstNode child) { - child = super.getValue() or child = super.getABranch() - } - - final override predicate first(AstNode first) { - first(super.getValue(), first) - or - not exists(super.getValue()) and first(super.getBranch(0), first) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getValue(), pred, c) and - first(super.getBranch(0), succ) and - c instanceof SimpleCompletion - or - exists(int i, WhenTree branch | branch = super.getBranch(i) | - pred = branch and - first(super.getBranch(i + 1), succ) and - c.isValidFor(branch) and - c.(ConditionalCompletion).getValue() = false - ) - or - succ = this and - c instanceof NormalCompletion and - ( - last(super.getValue(), pred, c) and not exists(super.getABranch()) - or - last(super.getABranch().(WhenClause).getBody(), pred, c) - or - exists(int i, ControlFlowTree lastBranch | - lastBranch = super.getBranch(i) and - not exists(super.getBranch(i + 1)) and - last(lastBranch, pred, c) - ) - ) - } - } - - private class CaseMatchTree extends PostOrderTree instanceof CaseExpr, AstInternal::TCaseMatch { - final override predicate propagatesAbnormal(AstNode child) { - child = super.getValue() or child = super.getABranch() - } - - final override predicate first(AstNode first) { first(super.getValue(), first) } - - final override predicate last(AstNode last, Completion c) { - super.last(last, c) - or - not exists(super.getElseBranch()) and - exists(MatchingCompletion lc, AstNode lastBranch | - lastBranch = max(int i | | super.getBranch(i) order by i) and - lc.getValue() = false and - last(lastBranch, last, lc) and - c instanceof RaiseCompletion and - not c instanceof NestedCompletion - ) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getValue(), pred, c) and - first(super.getBranch(0), succ) and - c instanceof SimpleCompletion - or - exists(int i, AstNode branch | branch = super.getBranch(i) | - last(branch, pred, c) and - first(super.getBranch(i + 1), succ) and - c.(MatchingCompletion).getValue() = false - ) - or - succ = this and - c instanceof NormalCompletion and - ( - last(super.getABranch(), pred, c) and - not c.(MatchingCompletion).getValue() = false - or - last(super.getElseBranch(), pred, c) - ) - } - } - - private class CaseElseBranchTree extends ControlFlowTree instanceof CaseElseBranch { - final override predicate propagatesAbnormal(AstNode child) { child = super.getBody() } - - final override predicate first(AstNode first) { first(super.getBody(), first) } - - final override predicate last(AstNode last, Completion c) { last(super.getBody(), last, c) } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { none() } - } - - private class PatternVariableAccessTree extends LocalVariableAccessTree instanceof LocalVariableWriteAccess, - CasePattern - { - final override predicate last(AstNode last, Completion c) { - super.last(last, c) and - c.(MatchingCompletion).getValue() = true - } - } - - private class ArrayPatternTree extends ControlFlowTree instanceof ArrayPattern { - final override predicate propagatesAbnormal(AstNode child) { - child = super.getClass() or - child = super.getPrefixElement(_) or - child = super.getRestVariableAccess() or - child = super.getSuffixElement(_) - } - - final override predicate first(AstNode first) { - first(super.getClass(), first) - or - not exists(super.getClass()) and first = this - } - - final override predicate last(AstNode last, Completion c) { - c.(MatchingCompletion).getValue() = false and - ( - last = this and - c.isValidFor(this) - or - exists(AstNode node | - node = super.getClass() or - node = super.getPrefixElement(_) or - node = super.getSuffixElement(_) - | - last(node, last, c) - ) - ) - or - c.(MatchingCompletion).getValue() = true and - last = this and - c.isValidFor(this) and - not exists(super.getPrefixElement(_)) and - not exists(super.getRestVariableAccess()) - or - c.(MatchingCompletion).getValue() = true and - last(max(int i | | super.getPrefixElement(i) order by i), last, c) and - not exists(super.getRestVariableAccess()) - or - last(super.getRestVariableAccess(), last, c) and - not exists(super.getSuffixElement(_)) - or - c.(MatchingCompletion).getValue() = true and - last(max(int i | | super.getSuffixElement(i) order by i), last, c) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getClass(), pred, c) and - succ = this and - c.(MatchingCompletion).getValue() = true - or - exists(AstNode next | - pred = this and - c.(MatchingCompletion).getValue() = true and - first(next, succ) - | - next = super.getPrefixElement(0) - or - not exists(super.getPrefixElement(_)) and - next = super.getRestVariableAccess() - ) - or - last(max(int i | | super.getPrefixElement(i) order by i), pred, c) and - first(super.getRestVariableAccess(), succ) and - c.(MatchingCompletion).getValue() = true - or - exists(int i | - last(super.getPrefixElement(i), pred, c) and - first(super.getPrefixElement(i + 1), succ) and - c.(MatchingCompletion).getValue() = true - ) - or - last(super.getRestVariableAccess(), pred, c) and - first(super.getSuffixElement(0), succ) and - c instanceof SimpleCompletion - or - exists(int i | - last(super.getSuffixElement(i), pred, c) and - first(super.getSuffixElement(i + 1), succ) and - c.(MatchingCompletion).getValue() = true - ) - } - } - - private class FindPatternTree extends ControlFlowTree instanceof FindPattern { - final override predicate propagatesAbnormal(AstNode child) { - child = super.getClass() or - child = super.getPrefixVariableAccess() or - child = super.getElement(_) or - child = super.getSuffixVariableAccess() - } - - final override predicate first(AstNode first) { - first(super.getClass(), first) - or - not exists(super.getClass()) and first = this - } - - final override predicate last(AstNode last, Completion c) { - last(super.getSuffixVariableAccess(), last, c) - or - last(max(int i | | super.getElement(i) order by i), last, c) and - not exists(super.getSuffixVariableAccess()) - or - c.(MatchingCompletion).getValue() = false and - ( - last = this and - c.isValidFor(this) - or - exists(AstNode node | node = super.getClass() or node = super.getElement(_) | - last(node, last, c) - ) - ) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getClass(), pred, c) and - succ = this and - c.(MatchingCompletion).getValue() = true - or - exists(AstNode next | - pred = this and - c.(MatchingCompletion).getValue() = true and - first(next, succ) - | - next = super.getPrefixVariableAccess() - or - not exists(super.getPrefixVariableAccess()) and - next = super.getElement(0) - ) - or - last(super.getPrefixVariableAccess(), pred, c) and - first(super.getElement(0), succ) and - c instanceof SimpleCompletion - or - c.(MatchingCompletion).getValue() = true and - exists(int i | - last(super.getElement(i), pred, c) and - first(super.getElement(i + 1), succ) - ) - or - c.(MatchingCompletion).getValue() = true and - last(max(int i | | super.getElement(i) order by i), pred, c) and - first(super.getSuffixVariableAccess(), succ) - } - } - - private class HashPatternTree extends ControlFlowTree instanceof HashPattern { - final override predicate propagatesAbnormal(AstNode child) { - child = super.getClass() or - child = super.getValue(_) or - child = super.getRestVariableAccess() - } - - final override predicate first(AstNode first) { - first(super.getClass(), first) - or - not exists(super.getClass()) and first = this - } - - final override predicate last(AstNode last, Completion c) { - c.(MatchingCompletion).getValue() = false and - ( - last = this and - c.isValidFor(this) - or - exists(AstNode node | - node = super.getClass() or - node = super.getValue(_) - | - last(node, last, c) - ) - ) - or - c.(MatchingCompletion).getValue() = true and - last = this and - not exists(super.getValue(_)) and - not exists(super.getRestVariableAccess()) - or - c.(MatchingCompletion).getValue() = true and - last(max(int i | | super.getValue(i) order by i), last, c) and - not exists(super.getRestVariableAccess()) - or - last(super.getRestVariableAccess(), last, c) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getClass(), pred, c) and - succ = this and - c.(MatchingCompletion).getValue() = true - or - exists(AstNode next | - pred = this and - c.(MatchingCompletion).getValue() = true and - first(next, succ) - | - next = super.getValue(0) - or - not exists(super.getValue(_)) and - next = super.getRestVariableAccess() - ) - or - last(max(int i | | super.getValue(i) order by i), pred, c) and - first(super.getRestVariableAccess(), succ) and - c.(MatchingCompletion).getValue() = true - or - exists(int i | - last(super.getValue(i), pred, c) and - first(super.getValue(i + 1), succ) and - c.(MatchingCompletion).getValue() = true - ) - } - } - - private class LineLiteralTree extends LeafTree instanceof LineLiteral { } - - private class FileLiteralTree extends LeafTree instanceof FileLiteral { } - - private class EncodingLiteralTree extends LeafTree instanceof EncodingLiteral { } - - private class AlternativePatternTree extends PreOrderTree instanceof AlternativePattern { - final override predicate propagatesAbnormal(AstNode child) { child = super.getAnAlternative() } - - final override predicate last(AstNode last, Completion c) { - last(super.getAnAlternative(), last, c) and - c.(MatchingCompletion).getValue() = true - or - last(max(int i | | super.getAlternative(i) order by i), last, c) and - c.(MatchingCompletion).getValue() = false - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - pred = this and - first(super.getAlternative(0), succ) and - c instanceof SimpleCompletion - or - exists(int i | - last(super.getAlternative(i), pred, c) and - first(super.getAlternative(i + 1), succ) and - c.(MatchingCompletion).getValue() = false - ) - } - } - - private class AsPatternTree extends PreOrderTree instanceof AsPattern { - final override predicate propagatesAbnormal(AstNode child) { child = super.getPattern() } - - final override predicate last(AstNode last, Completion c) { - last(super.getPattern(), last, c) and - c.(MatchingCompletion).getValue() = false - or - last(super.getVariableAccess(), last, any(SimpleCompletion x)) and - c.(MatchingCompletion).getValue() = true and - not c instanceof NestedCompletion - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - pred = this and - first(super.getPattern(), succ) and - c instanceof SimpleCompletion - or - last(super.getPattern(), pred, c) and - first(super.getVariableAccess(), succ) and - c.(MatchingCompletion).getValue() = true - } - } - - private class ParenthesizedPatternTree extends StandardPreOrderTree instanceof ParenthesizedPattern - { - override ControlFlowTree getChildNode(int i) { result = super.getPattern() and i = 0 } - } - - private class ReferencePatternTree extends StandardPreOrderTree instanceof ReferencePattern { - override ControlFlowTree getChildNode(int i) { result = super.getExpr() and i = 0 } - } - - private class InClauseTree extends PreOrderTree instanceof InClause { - final override predicate propagatesAbnormal(AstNode child) { - child = super.getPattern() or - child = super.getCondition() - } - - private predicate lastCondition(AstNode last, BooleanCompletion c, boolean flag) { - last(super.getCondition(), last, c) and - ( - flag = true and super.hasIfCondition() - or - flag = false and super.hasUnlessCondition() - ) - } - - final override predicate last(AstNode last, Completion c) { - last(super.getPattern(), last, c) and - c.(MatchingCompletion).getValue() = false - or - exists(BooleanCompletion bc, boolean flag, MatchingCompletion mc | - this.lastCondition(last, bc, flag) and - c = - any(NestedMatchingCompletion nmc | - nmc.getInnerCompletion() = bc and nmc.getOuterCompletion() = mc - ) - | - mc.getValue() = false and - bc.getValue() = flag.booleanNot() - or - not exists(super.getBody()) and - mc.getValue() = true and - bc.getValue() = flag - ) - or - last(super.getBody(), last, c) - or - not exists(super.getBody()) and - not exists(super.getCondition()) and - last(super.getPattern(), last, c) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - pred = this and - first(super.getPattern(), succ) and - c instanceof SimpleCompletion - or - exists(Expr next | - last(super.getPattern(), pred, c) and - c.(MatchingCompletion).getValue() = true and - first(next, succ) - | - next = super.getCondition() - or - not exists(super.getCondition()) and next = super.getBody() - ) - or - exists(boolean flag | - this.lastCondition(pred, c, flag) and - c.(BooleanCompletion).getValue() = flag and - first(super.getBody(), succ) - ) - } - } - - private class CharacterTree extends LeafTree instanceof CharacterLiteral { } - - private class ClassDeclarationTree extends NamespaceTree instanceof ClassDeclaration { - /** Gets the `i`th child in the body of this block. */ - final override AstNode getBodyChild(int i, boolean rescuable) { - result = super.getScopeExpr() and i = 0 and rescuable = false - or - result = super.getSuperclassExpr() and - i = count(super.getScopeExpr()) and - rescuable = true - or - result = - super - .getBodyChild(i - count(super.getScopeExpr()) - count(super.getSuperclassExpr()), - rescuable) - } - } - - private class ClassVariableTree extends LeafTree instanceof ClassVariableAccess { } - - private class ConditionalExprTree extends PostOrderTree instanceof ConditionalExpr { - final override predicate propagatesAbnormal(AstNode child) { - child = super.getCondition() or child = super.getBranch(_) - } - - final override predicate first(AstNode first) { first(super.getCondition(), first) } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - exists(boolean b | - last(super.getCondition(), pred, c) and - b = c.(BooleanCompletion).getValue() - | - first(super.getBranch(b), succ) - or - not exists(super.getBranch(b)) and - succ = this - ) - or - last(super.getBranch(_), pred, c) and - succ = this and - c instanceof NormalCompletion - } - } - - private class ConditionalLoopTree extends PostOrderTree instanceof ConditionalLoop { - final override predicate propagatesAbnormal(AstNode child) { child = super.getCondition() } - - final override predicate first(AstNode first) { first(super.getCondition(), first) } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getCondition(), pred, c) and - super.entersLoopWhenConditionIs(c.(BooleanCompletion).getValue()) and - first(super.getBody(), succ) - or - last(super.getBody(), pred, c) and - first(super.getCondition(), succ) and - c.continuesLoop() - or - last(super.getBody(), pred, c) and - first(super.getBody(), succ) and - c instanceof RedoCompletion - or - succ = this and - ( - last(super.getCondition(), pred, c) and - super.entersLoopWhenConditionIs(c.(BooleanCompletion).getValue().booleanNot()) - or - last(super.getBody(), pred, c) and - not c.continuesLoop() and - not c instanceof BreakCompletion and - not c instanceof RedoCompletion - or - last(super.getBody(), pred, c.(NestedBreakCompletion).getAnInnerCompatibleCompletion()) - ) - } - } - - private class ConstantAccessTree extends PostOrderTree instanceof ConstantAccess { - ConstantAccessTree() { - not this instanceof ClassDeclaration and - not this instanceof ModuleDeclaration and - // constant accesses with scope expression in compound assignments are desugared - not ( - this = any(AssignOperation op).getLeftOperand() and - exists(super.getScopeExpr()) - ) - } - - final override predicate propagatesAbnormal(AstNode child) { child = super.getScopeExpr() } - - final override predicate first(AstNode first) { - first(super.getScopeExpr(), first) - or - not exists(super.getScopeExpr()) and - first = this - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getScopeExpr(), pred, c) and - succ = this and - c instanceof NormalCompletion - } - } - - /** A parameter that may have a default value. */ - abstract class DefaultValueParameterTree extends ControlFlowTree { - abstract Expr getDefaultValueExpr(); - - abstract AstNode getAccessNode(); - - predicate hasDefaultValue() { exists(this.getDefaultValueExpr()) } - - final override predicate propagatesAbnormal(AstNode child) { - child = this.getDefaultValueExpr() or child = this.getAccessNode() - } - - final override predicate first(AstNode first) { first = this.getAccessNode() } - - final override predicate last(AstNode last, Completion c) { - last(this.getDefaultValueExpr(), last, c) and - c instanceof NormalCompletion - or - last = this.getAccessNode() and - ( - not this.hasDefaultValue() and - c instanceof SimpleCompletion - or - this.hasDefaultValue() and - c.(MatchingCompletion).getValue() = true and - c.isValidFor(this) - ) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - pred = this.getAccessNode() and - first(this.getDefaultValueExpr(), succ) and - c.(MatchingCompletion).getValue() = false - } - } - - private class DestructuredParameterTree extends StandardPostOrderTree instanceof DestructuredParameter - { - final override ControlFlowTree getChildNode(int i) { result = super.getElement(i) } - } - - private class DesugaredTree extends ControlFlowTree { - ControlFlowTree desugared; - - DesugaredTree() { desugared = this.getDesugared() } - - final override predicate propagatesAbnormal(AstNode child) { - desugared.propagatesAbnormal(child) - } - - final override predicate first(AstNode first) { desugared.first(first) } - - final override predicate last(AstNode last, Completion c) { desugared.last(last, c) } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { none() } - } - - private class DoBlockTree extends CallableTree instanceof DoBlock { - /** Gets the `i`th child in the body of this block. */ - final override AstNode getBodyChild(int i) { - result = super.getParameter(i) - or - result = super.getLocalVariable(i - super.getNumberOfParameters()) - or - result = super.getBody() and - i = super.getNumberOfParameters() + count(super.getALocalVariable()) - } - } - - private class EmptyStatementTree extends LeafTree instanceof EmptyStmt { } - - class EndBlockTree extends StmtSequenceTree instanceof EndBlock { - override predicate first(AstNode first) { first = this } - - override predicate succ(AstNode pred, AstNode succ, Completion c) { - // Normal left-to-right evaluation in the body - exists(int i | - last(super.getBodyChild(i, _), pred, c) and - first(super.getBodyChild(i + 1, _), succ) and - c instanceof NormalCompletion - ) - } - } - - private class ForwardedArgumentsTree extends LeafTree instanceof ForwardedArguments { } - - private class ForwardParameterTree extends LeafTree instanceof ForwardParameter { } - - private class GlobalVariableTree extends LeafTree instanceof GlobalVariableAccess { } - - private class HashSplatNilParameterTree extends LeafTree instanceof HashSplatNilParameter { } - - private class HashSplatParameterTree extends NonDefaultValueParameterTree instanceof HashSplatParameter - { } - - private class HereDocTree extends StandardPostOrderTree instanceof HereDoc { - final override ControlFlowTree getChildNode(int i) { result = super.getComponent(i) } - } - - private class InstanceVariableTree extends StandardPostOrderTree instanceof InstanceVariableAccess - { - final override ControlFlowTree getChildNode(int i) { result = super.getReceiver() and i = 0 } - } - - private class KeywordParameterTree extends DefaultValueParameterTree instanceof KeywordParameter { - final override Expr getDefaultValueExpr() { result = super.getDefaultValue() } - - final override AstNode getAccessNode() { result = super.getDefiningAccess() } - } - - private class LambdaTree extends CallableTree instanceof Lambda { - /** Gets the `i`th child in the body of this block. */ - final override AstNode getBodyChild(int i) { - result = super.getParameter(i) - or - result = super.getBody() and i = super.getNumberOfParameters() - } - } - - private class LocalVariableAccessTree extends LeafTree instanceof LocalVariableAccess { } - - private class LogicalAndTree extends PostOrderTree instanceof LogicalAndExpr { - final override predicate propagatesAbnormal(AstNode child) { child = super.getAnOperand() } - - final override predicate first(AstNode first) { first(super.getLeftOperand(), first) } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getLeftOperand(), pred, c) and - c instanceof TrueCompletion and - first(super.getRightOperand(), succ) - or - last(super.getLeftOperand(), pred, c) and - c instanceof FalseCompletion and - succ = this - or - last(super.getRightOperand(), pred, c) and - c instanceof NormalCompletion and - succ = this - } - } - - private class LogicalNotTree extends PostOrderTree instanceof NotExpr { - final override predicate propagatesAbnormal(AstNode child) { child = super.getOperand() } - - final override predicate first(AstNode first) { first(super.getOperand(), first) } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - succ = this and - last(super.getOperand(), pred, c) and - c instanceof NormalCompletion - } - } - - private class LogicalOrTree extends PostOrderTree instanceof LogicalOrExpr { - final override predicate propagatesAbnormal(AstNode child) { child = super.getAnOperand() } - - final override predicate first(AstNode first) { first(super.getLeftOperand(), first) } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getLeftOperand(), pred, c) and - c instanceof FalseCompletion and - first(super.getRightOperand(), succ) - or - last(super.getLeftOperand(), pred, c) and - c instanceof TrueCompletion and - succ = this - or - last(super.getRightOperand(), pred, c) and - c instanceof NormalCompletion and - succ = this - } - } - - private class MethodCallTree extends CallTree instanceof MethodCall { - final override ControlFlowTree getChildNode(int i) { - result = super.getReceiver() and i = 0 - or - result = super.getArgument(i - 1) - or - result = super.getBlock() and i = 1 + super.getNumberOfArguments() - } - } - - private class MethodNameTree extends LeafTree instanceof MethodName, AstInternal::TTokenMethodName - { } - - private class MethodTree extends CallableTree instanceof Method { - /** Gets the `i`th child in the body of this block. */ - final override AstNode getBodyChild(int i) { - result = super.getParameter(i) - or - result = super.getBody() and i = super.getNumberOfParameters() - } - } - - private class ModuleDeclarationTree extends NamespaceTree instanceof ModuleDeclaration { - /** Gets the `i`th child in the body of this block. */ - final override AstNode getBodyChild(int i, boolean rescuable) { - result = super.getScopeExpr() and i = 0 and rescuable = false - or - result = NamespaceTree.super.getBodyChild(i - count(super.getScopeExpr()), rescuable) - } - } - - /** - * Namespaces (i.e. modules or classes) behave like other `BodyStmt`s except they are - * executed in pre-order rather than post-order. We do this in order to insert a write for - * `self` before any subsequent reads in the namespace body. - */ - private class NamespaceTree extends BodyStmtTree instanceof Namespace { - final override predicate first(AstNode first) { first = this } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - BodyStmtTree.super.succ(pred, succ, c) - or - pred = this and - super.first(succ) and - c instanceof SimpleCompletion - } - - final override predicate last(AstNode last, Completion c) { - super.last(last, c) - or - not exists(this.getAChild(_)) and - last = this and - c.isValidFor(this) - } - } - - private class NilTree extends LeafTree instanceof NilLiteral { } - - private class NumericLiteralTree extends LeafTree instanceof NumericLiteral { } - - private class OptionalParameterTree extends DefaultValueParameterTree instanceof OptionalParameter - { - final override Expr getDefaultValueExpr() { result = super.getDefaultValue() } - - final override AstNode getAccessNode() { result = super.getDefiningAccess() } - } - - private class PairTree extends StandardPostOrderTree instanceof Pair { - final override ControlFlowTree getChildNode(int i) { - result = super.getKey() and i = 0 - or - result = super.getValue() and i = 1 - } - } - - private class RangeLiteralTree extends StandardPostOrderTree instanceof RangeLiteral { - final override ControlFlowTree getChildNode(int i) { - result = super.getBegin() and i = 0 - or - result = super.getEnd() and i = 1 - } - } - - private class RedoStmtTree extends LeafTree instanceof RedoStmt { } - - private class RescueModifierTree extends PostOrderTree instanceof RescueModifierExpr { - final override predicate propagatesAbnormal(AstNode child) { child = super.getHandler() } - - final override predicate first(AstNode first) { first(super.getBody(), first) } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getBody(), pred, c) and - ( - c instanceof RaiseCompletion and - first(super.getHandler(), succ) - or - not c instanceof RaiseCompletion and - succ = this - ) - or - last(super.getHandler(), pred, c) and - c instanceof NormalCompletion and - succ = this - } - } - - private class RescueTree extends PostOrderTree instanceof RescueClause { - final override predicate propagatesAbnormal(AstNode child) { - child = super.getAnException() or - child = super.getBody() - } - - final override predicate first(AstNode first) { - first(super.getException(0), first) - or - not exists(super.getException(0)) and - ( - first(super.getVariableExpr(), first) - or - not exists(super.getVariableExpr()) and - ( - first(super.getBody(), first) - or - not exists(super.getBody()) and first = this - ) - ) - } - - private Expr getLastException() { - exists(int i | result = super.getException(i) and not exists(super.getException(i + 1))) - } - - predicate lastNoMatch(AstNode last, Completion c) { - last(this.getLastException(), last, c) and - c.(MatchingCompletion).getValue() = false - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getAnException(), pred, c) and - c.(MatchingCompletion).getValue() = true and - ( - first(super.getVariableExpr(), succ) - or - not exists(super.getVariableExpr()) and - ( - first(super.getBody(), succ) - or - not exists(super.getBody()) and succ = this - ) - ) - or - exists(int i | - last(super.getException(i), pred, c) and - c.(MatchingCompletion).getValue() = false and - first(super.getException(i + 1), succ) - ) - or - last(super.getVariableExpr(), pred, c) and - c instanceof NormalCompletion and - ( - first(super.getBody(), succ) - or - not exists(super.getBody()) and succ = this - ) - or - last(super.getBody(), pred, c) and - c instanceof NormalCompletion and - succ = this - } - } - - private class RetryStmtTree extends LeafTree instanceof RetryStmt { } - - private class ReturningStmtTree extends StandardPostOrderTree instanceof ReturningStmt { - final override ControlFlowTree getChildNode(int i) { result = super.getValue() and i = 0 } - } - - private class SimpleParameterTree extends NonDefaultValueParameterTree instanceof SimpleParameter { - } - - // Corner case: For duplicated '_' parameters, only the first occurrence has a defining - // access. For subsequent parameters we simply include the parameter itself in the CFG - private class SimpleParameterTreeDupUnderscore extends LeafTree instanceof SimpleParameter { - SimpleParameterTreeDupUnderscore() { not exists(this.getDefiningAccess()) } - } - - private class SingletonClassTree extends BodyStmtTree instanceof SingletonClass { - final override predicate first(AstNode first) { - super.first(first) - or - not exists(this.getAChild(_)) and - first = this - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - BodyStmtTree.super.succ(pred, succ, c) - or - succ = this and - super.last(pred, c) - } - - final override predicate last(AstNode last, Completion c) { - last = this and - c.isValidFor(this) - } - - /** Gets the `i`th child in the body of this block. */ - final override AstNode getBodyChild(int i, boolean rescuable) { - ( - result = super.getValue() and i = 0 and rescuable = false - or - result = BodyStmtTree.super.getBodyChild(i - 1, rescuable) - ) - } - } - - private class SingletonMethodTree extends CallableTree instanceof SingletonMethod { - /** Gets the `i`th child in the body of this block. */ - final override AstNode getBodyChild(int i) { - result = super.getParameter(i) - or - result = super.getBody() and i = super.getNumberOfParameters() - } - - override predicate first(AstNode first) { first(super.getObject(), first) } - - override predicate succ(AstNode pred, AstNode succ, Completion c) { - CallableTree.super.succ(pred, succ, c) - or - last(super.getObject(), pred, c) and - succ = this and - c instanceof NormalCompletion - } - } - - private class SplatParameterTree extends NonDefaultValueParameterTree instanceof SplatParameter { - } - - class StmtSequenceTree extends PostOrderTree instanceof StmtSequence { - override predicate propagatesAbnormal(AstNode child) { child = super.getAStmt() } - - override predicate first(AstNode first) { - // If this sequence contains any statements, go to the first one. - first(super.getStmt(0), first) - or - // Otherwise, treat this node as a leaf node. - not exists(super.getStmt(0)) and first = this - } - - /** Gets the `i`th child in the body of this body statement. */ - AstNode getBodyChild(int i, boolean rescuable) { - result = super.getStmt(i) and - rescuable = true - } - - final AstNode getLastBodyChild() { - exists(int i | - result = this.getBodyChild(i, _) and - not exists(this.getBodyChild(i + 1, _)) - ) - } - - override predicate succ(AstNode pred, AstNode succ, Completion c) { - // Normal left-to-right evaluation in the body - exists(int i | - last(this.getBodyChild(i, _), pred, c) and - first(this.getBodyChild(i + 1, _), succ) and - c instanceof NormalCompletion - ) - or - succ = this and - last(this.getLastBodyChild(), pred, c) and - c instanceof NormalCompletion - } - } - - private class StringConcatenationTree extends StandardPostOrderTree instanceof StringConcatenation - { - final override ControlFlowTree getChildNode(int i) { result = super.getString(i) } - } - - private class StringlikeLiteralTree extends StandardPostOrderTree instanceof StringlikeLiteral { - StringlikeLiteralTree() { - not this instanceof HereDoc and - not this instanceof AstInternal::TSimpleSymbolLiteralSynth - } - - final override ControlFlowTree getChildNode(int i) { result = super.getComponent(i) } - } - - private class StringComponentTree extends LeafTree instanceof StringComponent { - StringComponentTree() { - // Interpolations contain `StmtSequence`s, so they shouldn't be treated as leaf nodes. - not this instanceof StringInterpolationComponent and - // In the interests of brevity we treat regexes as string literals when constructing the CFG. - // Thus we must exclude regex interpolations here too. - not this instanceof RegExpInterpolationComponent - } - } - - private class ToplevelTree extends BodyStmtTree instanceof Toplevel { - final override AstNode getBodyChild(int i, boolean rescuable) { - result = super.getBeginBlock(i) and rescuable = true - or - result = BodyStmtTree.super.getBodyChild(i - count(super.getABeginBlock()), rescuable) - } - } - - private class UndefStmtTree extends StandardPreOrderTree instanceof UndefStmt { - final override ControlFlowTree getChildNode(int i) { result = super.getMethodName(i) } - } - - private class WhenTree extends ControlFlowTree instanceof WhenClause { - final override predicate propagatesAbnormal(AstNode child) { - child = [super.getAPattern(), super.getBody()] - } - - final Expr getLastPattern() { - exists(int i | - result = super.getPattern(i) and - not exists(super.getPattern(i + 1)) - ) - } - - final override predicate first(AstNode first) { first(super.getPattern(0), first) } - - final override predicate last(AstNode last, Completion c) { - last = this and - c.isValidFor(this) and - c.(ConditionalCompletion).getValue() = false - or - last(super.getBody(), last, c) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - pred = this and - c.isValidFor(this) and - c.(ConditionalCompletion).getValue() = true and - first(super.getBody(), succ) - or - exists(int i, Expr p, boolean b | - p = super.getPattern(i) and - last(p, pred, c) and - b = c.(ConditionalCompletion).getValue() - | - b = true and - succ = this - or - b = false and - first(super.getPattern(i + 1), succ) - or - not exists(super.getPattern(i + 1)) and - succ = this - ) - } - } -} - -private Scope parent(Scope n) { - result = n.getOuterScope() and - not n instanceof CfgScopeImpl -} - -cached -private CfgScope getCfgScopeImpl(AstNode n) { result = parent*(scopeOfInclSynth(n)) } - -/** Gets the CFG scope of node `n`. */ -pragma[inline] -CfgScope getCfgScope(AstNode n) { - exists(AstNode n0 | - pragma[only_bind_into](n0) = n and - pragma[only_bind_into](result) = getCfgScopeImpl(n0) - ) -} diff --git a/ruby/ql/lib/codeql/ruby/controlflow/internal/Guards.qll b/ruby/ql/lib/codeql/ruby/controlflow/internal/Guards.qll index 387fb03dc9a8..4c7167f5c07f 100644 --- a/ruby/ql/lib/codeql/ruby/controlflow/internal/Guards.qll +++ b/ruby/ql/lib/codeql/ruby/controlflow/internal/Guards.qll @@ -6,9 +6,18 @@ private import codeql.ruby.CFG /** Holds if the guard `guard` controls block `bb` upon evaluating to `branch`. */ pragma[nomagic] predicate guardControlsBlock(CfgNodes::AstCfgNode guard, BasicBlock bb, boolean branch) { - exists(ConditionBlock conditionBlock, ConditionalSuccessor s | + exists(BasicBlock conditionBlock, ConditionalSuccessor s | guard = conditionBlock.getLastNode() and s.getValue() = branch and conditionBlock.edgeDominates(bb, s) ) + or + exists(ConditionalSuccessor s, ControlFlowNode guardNode | + guardNode.isAfter(guard.getAstNode()) and + forall(ControlFlowNode pred | pred = guardNode.getAPredecessor() | + pred.getASuccessor(s) = guardNode + ) and + s.getValue() = branch and + guardNode.getBasicBlock().dominates(bb) + ) } diff --git a/ruby/ql/lib/codeql/ruby/controlflow/internal/NonReturning.qll b/ruby/ql/lib/codeql/ruby/controlflow/internal/NonReturning.qll index 45b299a5d2b7..36061ea5f635 100644 --- a/ruby/ql/lib/codeql/ruby/controlflow/internal/NonReturning.qll +++ b/ruby/ql/lib/codeql/ruby/controlflow/internal/NonReturning.qll @@ -3,22 +3,22 @@ overlay[local] module; private import codeql.ruby.AST -private import Completion +private import codeql.controlflow.SuccessorType /** A call that definitely does not return (conservative analysis). */ abstract class NonReturningCall extends MethodCall { - /** Gets a valid completion for this non-returning call. */ - abstract Completion getACompletion(); + /** Gets a valid successor type for this non-returning call. */ + abstract AbruptSuccessor getASuccessorType(); } private class RaiseCall extends NonReturningCall { RaiseCall() { this.getMethodName() = "raise" } - override RaiseCompletion getACompletion() { not result instanceof NestedCompletion } + override ExceptionSuccessor getASuccessorType() { any() } } private class ExitCall extends NonReturningCall { ExitCall() { this.getMethodName() in ["abort", "exit"] } - override ExitCompletion getACompletion() { not result instanceof NestedCompletion } + override ExitSuccessor getASuccessorType() { any() } } diff --git a/ruby/ql/lib/codeql/ruby/controlflow/internal/Splitting.qll b/ruby/ql/lib/codeql/ruby/controlflow/internal/Splitting.qll deleted file mode 100644 index 737f450b4f23..000000000000 --- a/ruby/ql/lib/codeql/ruby/controlflow/internal/Splitting.qll +++ /dev/null @@ -1,348 +0,0 @@ -/** - * Provides classes and predicates relevant for splitting the control flow graph. - */ -overlay[local] -module; - -private import codeql.ruby.AST as Ast -private import Completion as Comp -private import Comp -private import ControlFlowGraphImpl -private import codeql.ruby.controlflow.ControlFlowGraph - -cached -private module Cached { - cached - newtype TSplitKind = - TConditionalCompletionSplitKind() { forceCachingInSameStage() } or - TEnsureSplitKind(int nestLevel) { nestLevel = any(Trees::BodyStmtTree t).getNestLevel() } - - cached - newtype TSplit = - TConditionalCompletionSplit(ConditionalCompletion c) or - TEnsureSplit(EnsureSplitting::EnsureSplitType type, int nestLevel) { - nestLevel = any(Trees::BodyStmtTree t).getNestLevel() - } -} - -import Cached - -/** A split for a control flow node. */ -class Split extends TSplit { - /** Gets a textual representation of this split. */ - string toString() { none() } -} - -module ConditionalCompletionSplitting { - /** - * A split for conditional completions. For example, in - * - * ```rb - * def method x - * if x < 2 and x > 0 - * puts "x is 1" - * end - * end - * ``` - * - * we record whether `x < 2` and `x > 0` evaluate to `true` or `false`, and - * restrict the edges out of `x < 2 and x > 0` accordingly. - */ - class ConditionalCompletionSplit extends Split, TConditionalCompletionSplit { - ConditionalCompletion completion; - - ConditionalCompletionSplit() { this = TConditionalCompletionSplit(completion) } - - ConditionalCompletion getCompletion() { result = completion } - - override string toString() { result = completion.toString() } - } - - private class ConditionalCompletionSplitKind_ extends SplitKind, TConditionalCompletionSplitKind { - override int getListOrder() { result = 0 } - - override predicate isEnabled(AstNode n) { this.appliesTo(n) } - - override string toString() { result = "ConditionalCompletion" } - } - - module ConditionalCompletionSplittingInput { - private import Completion as Comp - - class ConditionalCompletion = Comp::ConditionalCompletion; - - class ConditionalCompletionSplitKind extends ConditionalCompletionSplitKind_, TSplitKind { } - - class ConditionalCompletionSplit = ConditionalCompletionSplitting::ConditionalCompletionSplit; - - bindingset[parent, parentCompletion] - predicate condPropagateExpr( - AstNode parent, ConditionalCompletion parentCompletion, AstNode child, - ConditionalCompletion childCompletion - ) { - child = parent.(Ast::NotExpr).getOperand() and - childCompletion.(BooleanCompletion).getDual() = parentCompletion - or - childCompletion = parentCompletion and - ( - child = parent.(Ast::LogicalAndExpr).getAnOperand() - or - child = parent.(Ast::LogicalOrExpr).getAnOperand() - or - child = parent.(Ast::StmtSequence).getLastStmt() - or - child = parent.(Ast::ConditionalExpr).getBranch(_) - ) - } - } - - int getNextListOrder() { result = 1 } - - private class ConditionalCompletionSplitImpl extends SplitImplementations::ConditionalCompletionSplitting::ConditionalCompletionSplitImpl - { - override predicate hasEntry(AstNode pred, AstNode succ, Completion c) { - super.hasEntry(pred, succ, c) - or - // a non-standard case is needed for `when` clauses - succ(pred, succ, c) and - succ instanceof Ast::WhenClause and - c = this.getCompletion() - } - } -} - -class ConditionalCompletionSplit = ConditionalCompletionSplitting::ConditionalCompletionSplit; - -module EnsureSplitting { - /** - * The type of a split `ensure` node. - * - * The type represents one of the possible ways of entering an `ensure` - * block. For example, if a block ends with a `return` statement, then - * the `ensure` block must end with a `return` as well (provided that - * the `ensure` block executes normally). - */ - class EnsureSplitType extends SuccessorType { - EnsureSplitType() { not this instanceof ConditionalSuccessor } - - /** Holds if this split type matches entry into an `ensure` block with completion `c`. */ - predicate isSplitForEntryCompletion(Completion c) { - if c instanceof NormalCompletion - then - // If the entry into the `ensure` block completes with any normal completion, - // it simply means normal execution after the `ensure` block - this instanceof DirectSuccessor - else this = c.getAMatchingSuccessorType() - } - } - - /** A node that belongs to an `ensure` block. */ - private class EnsureNode extends AstNode { - private Trees::BodyStmtTree block; - - EnsureNode() { this = block.getAnEnsureDescendant() } - - int getNestLevel() { result = block.getNestLevel() } - - /** Holds if this node is the entry node in the `ensure` block it belongs to. */ - predicate isEntryNode() { first(block.getEnsure(), this) } - - Ast::BodyStmt getBlock() { result = block } - - pragma[noinline] - predicate isEntered(AstNode pred, int nestLevel, Completion c) { - this.isEntryNode() and - nestLevel = this.getNestLevel() and - succ(pred, this, c) and - // the entry node may be reachable via a backwards loop edge; in this case - // the split has already been entered - not pred = block.getAnEnsureDescendant() - } - } - - /** - * A split for nodes belonging to an `ensure` block, which determines how to - * continue execution after leaving the `ensure` block. For example, in - * - * ```rb - * begin - * if x - * raise "Exception" - * end - * ensure - * puts "Ensure" - * end - * ``` - * - * all control flow nodes in the `ensure` block have two splits: one representing - * normal execution of the body (when `x` evaluates to `true`), and one representing - * exceptional execution of the body (when `x` evaluates to `false`). - */ - class EnsureSplit extends Split, TEnsureSplit { - private EnsureSplitType type; - private int nestLevel; - - EnsureSplit() { this = TEnsureSplit(type, nestLevel) } - - /** - * Gets the type of this `ensure` split, that is, how to continue execution after the - * `ensure` block. - */ - EnsureSplitType getType() { result = type } - - /** Gets the nesting level. */ - int getNestLevel() { result = nestLevel } - - override string toString() { - if type instanceof DirectSuccessor - then result = "" - else - if nestLevel > 0 - then result = "ensure(" + nestLevel + "): " + type.toString() - else result = "ensure: " + type.toString() - } - } - - private int getListOrder(EnsureSplitKind kind) { - result = ConditionalCompletionSplitting::getNextListOrder() + kind.getNestLevel() - } - - int getNextListOrder() { - result = max([getListOrder(_) + 1, ConditionalCompletionSplitting::getNextListOrder()]) - } - - private class EnsureSplitKind extends SplitKind, TEnsureSplitKind { - private int nestLevel; - - EnsureSplitKind() { this = TEnsureSplitKind(nestLevel) } - - /** Gets the nesting level. */ - int getNestLevel() { result = nestLevel } - - override int getListOrder() { result = getListOrder(this) } - - override string toString() { result = "ensure (" + nestLevel + ")" } - } - - private class EnsureSplitImpl extends SplitImpl instanceof EnsureSplit { - override EnsureSplitKind getKind() { result.getNestLevel() = super.getNestLevel() } - - override predicate hasEntry(AstNode pred, AstNode succ, Completion c) { - succ.(EnsureNode).isEntered(pred, super.getNestLevel(), c) and - super.getType().isSplitForEntryCompletion(c) - } - - override predicate hasEntryScope(CfgScope scope, AstNode first) { none() } - - /** - * Holds if this split applies to `pred`, where `pred` is a valid predecessor. - */ - private predicate appliesToPredecessor(AstNode pred) { - this.appliesTo(pred) and - (succ(pred, _, _) or succExit(_, pred, _)) - } - - pragma[noinline] - private predicate exit0(AstNode pred, Trees::BodyStmtTree block, int nestLevel, Completion c) { - this.appliesToPredecessor(pred) and - nestLevel = block.getNestLevel() and - block.last(pred, c) - } - - /** - * Holds if `pred` may exit this split with completion `c`. The Boolean - * `inherited` indicates whether `c` is an inherited completion from the - * body. - */ - private predicate exit(AstNode pred, Completion c, boolean inherited) { - exists(Trees::BodyStmtTree block, EnsureSplitType type | - this.exit0(pred, block, super.getNestLevel(), c) and - type = super.getType() - | - if last(block.getEnsure(), pred, c) - then - // `ensure` block can itself exit with completion `c`: either `c` must - // match this split, `c` must be an abnormal completion, or this split - // does not require another completion to be recovered - inherited = false and - ( - type = c.getAMatchingSuccessorType() - or - not c instanceof NormalCompletion - or - type instanceof DirectSuccessor - ) - else ( - // `ensure` block can exit with inherited completion `c`, which must - // match this split - inherited = true and - type = c.getAMatchingSuccessorType() and - not type instanceof DirectSuccessor - ) - ) - or - // If this split is normal, and an outer split can exit based on an inherited - // completion, we need to exit this split as well. For example, in - // - // ```rb - // def m(b1, b2) - // if b1 - // return - // end - // ensure - // begin - // if b2 - // raise "Exception" - // end - // ensure - // puts "inner ensure" - // end - // end - // ``` - // - // if the outer split for `puts "inner ensure"` is `return` and the inner split - // is "normal" (corresponding to `b1 = true` and `b2 = false`), then the inner - // split must be able to exit with a `return` completion. - this.appliesToPredecessor(pred) and - exists(EnsureSplitImpl outer | - outer.(EnsureSplit).getNestLevel() = super.getNestLevel() - 1 and - outer.exit(pred, c, inherited) and - super.getType() instanceof DirectSuccessor and - inherited = true - ) - } - - override predicate hasExit(AstNode pred, AstNode succ, Completion c) { - succ(pred, succ, c) and - ( - this.exit(pred, c, _) - or - this.exit(pred, c.(NestedBreakCompletion).getAnInnerCompatibleCompletion(), _) - ) - } - - override predicate hasExitScope(CfgScope scope, AstNode last, Completion c) { - succExit(scope, last, c) and - ( - this.exit(last, c, _) - or - this.exit(last, c.(NestedBreakCompletion).getAnInnerCompatibleCompletion(), _) - ) - } - - override predicate hasSuccessor(AstNode pred, AstNode succ, Completion c) { - this.appliesToPredecessor(pred) and - succ(pred, succ, c) and - succ = - any(EnsureNode en | - if en.isEntryNode() and en.getBlock() != pred.(EnsureNode).getBlock() - then - // entering a nested `ensure` block - en.getNestLevel() > super.getNestLevel() - else - // staying in the same (possibly nested) `ensure` block as `pred` - en.getNestLevel() >= super.getNestLevel() - ) - } - } -} diff --git a/ruby/ql/lib/codeql/ruby/dataflow/SSA.qll b/ruby/ql/lib/codeql/ruby/dataflow/SSA.qll index 08ca08732b6b..d95740a8c867 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/SSA.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/SSA.qll @@ -384,20 +384,7 @@ module Ssa { inp = SsaImpl::phiHasInputFromBlock(this, bb) } - private string getSplitString() { - result = this.getBasicBlock().getFirstNode().(CfgNodes::AstCfgNode).getSplitsString() - } - - override string toString() { - exists(string prefix | - prefix = "[" + this.getSplitString() + "] " - or - not exists(this.getSplitString()) and - prefix = "" - | - result = prefix + "phi" - ) - } + override string toString() { result = "phi" } /* * The location of a phi node is the same as the location of the first node diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowDispatch.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowDispatch.qll index 3c647f41bbbe..3d3e8a4d0d04 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowDispatch.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowDispatch.qll @@ -183,7 +183,7 @@ class NormalCall extends DataFlowCall, TNormalCall { override CfgNodes::ExprNodes::CallCfgNode asCall() { result = c } - override DataFlowCallable getEnclosingCallable() { result = TCfgScope(c.getScope()) } + override DataFlowCallable getEnclosingCallable() { result = TCfgScope(c.getEnclosingCallable()) } override string toString() { result = c.toString() } @@ -700,7 +700,7 @@ private CfgScope privateFilter(DataFlowCall call) { // This may remove some plausible targets, but also removes a lot of // implausible targets ( - isToplevelMethodInFile(result, call.asCall().getFile()) or + isToplevelMethodInFile(result, call.asCall().getLocation().getFile()) or not isToplevelMethodInFile(result, _) ) } diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll index 9f3042ebb5b7..0d3829a1fad2 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll @@ -95,7 +95,7 @@ CfgNodes::ExprCfgNode getPostUpdateReverseStep(CfgNodes::ExprCfgNode e) { pragma[nomagic] Ssa::Definition getParameterDef(NamedParameter p) { exists(BasicBlock bb, int i | - bb.getNode(i).getAstNode() = p.getDefiningAccess() and + bb.getNode(i).injects(p.getDefiningAccess()) and result.definesAt(_, bb, i) ) } @@ -285,7 +285,6 @@ predicate isNonConstantExpr(CfgNodes::ExprCfgNode n) { /** Provides logic related to captured variables. */ module VariableCapture { private import codeql.dataflow.VariableCapture as Shared - private import codeql.ruby.controlflow.BasicBlocks as BasicBlocks private predicate closureFlowStep(CfgNodes::ExprCfgNode e1, CfgNodes::ExprCfgNode e2) { e1 = getALastEvalNode(e2) @@ -296,13 +295,11 @@ module VariableCapture { ) } - private module CaptureInput implements Shared::InputSig { + private module CaptureInput implements Shared::InputSig { private import codeql.ruby.controlflow.ControlFlowGraph as Cfg private import TaintTrackingPrivate as TaintTrackingPrivate - Callable basicBlockGetEnclosingCallable(BasicBlocks::Cfg::BasicBlock bb) { - result = bb.getScope() - } + Callable basicBlockGetEnclosingCallable(BasicBlock bb) { result = bb.getScope() } class CapturedVariable extends LocalVariable { CapturedVariable() { @@ -374,7 +371,7 @@ module VariableCapture { class ClosureExpr = CaptureInput::ClosureExpr; - module Flow = Shared::Flow; + module Flow = Shared::Flow; private Flow::ClosureNode asClosureNode(Node n) { result = n.(CaptureNode).getSynthesizedCaptureNode() @@ -854,7 +851,7 @@ class ReturningStatementNode extends NodeImpl, TReturningNode { /** Gets the expression corresponding to this node. */ CfgNodes::ReturningCfgNode getReturningNode() { result = n } - override CfgScope getCfgScopeImpl() { result = n.getScope() } + override CfgScope getCfgScopeImpl() { result = n.getEnclosingCallable() } override Location getLocationImpl() { result = n.getLocation() } @@ -1354,7 +1351,7 @@ module ArgumentNodes { this.sourceArgumentOf(call.asCall(), pos) } - override CfgScope getCfgScopeImpl() { result = yield.getScope() } + override CfgScope getCfgScopeImpl() { result = yield.getEnclosingCallable() } override Location getLocationImpl() { result = yield.getLocation() } } @@ -1384,7 +1381,7 @@ module ArgumentNodes { this.sourceArgumentOf(call.asCall(), pos) } - override CfgScope getCfgScopeImpl() { result = sup.getScope() } + override CfgScope getCfgScopeImpl() { result = sup.getEnclosingCallable() } override Location getLocationImpl() { result = sup.getLocation() } } @@ -1607,7 +1604,7 @@ private module ReturnNodes { private predicate isValid(CfgNodes::ReturningCfgNode node) { exists(ReturningStmt stmt, Callable scope | stmt = node.getAstNode() and - scope = node.getScope() + scope = node.getEnclosingCallable() | stmt instanceof ReturnStmt and (scope instanceof Method or scope instanceof SingletonMethod or scope instanceof Lambda) @@ -1627,8 +1624,8 @@ private module ReturnNodes { class ExplicitReturnNode extends SourceReturnNode, ReturningStatementNode { ExplicitReturnNode() { isValid(n) and - n.getASuccessor().(CfgNodes::AnnotatedExitNode).isNormal() and - n.getScope() instanceof Callable + n.getASuccessor() instanceof ControlFlow::NormalExitNode and + n.getEnclosingCallable() instanceof Callable } override ReturnKind getKindSource() { @@ -1643,16 +1640,24 @@ private module ReturnNodes { } } - pragma[noinline] - private AstNode implicitReturn(Callable c, ExprNode n) { - exists(CfgNodes::ExprCfgNode en | - en = n.getExprNode() and - en.getASuccessor().(CfgNodes::AnnotatedExitNode).isNormal() and - n.(NodeImpl).getCfgScope() = c and - result = en.getExpr() - ) + private AstNode desugar(AstNode n) { + result = n.getDesugared() or - result = implicitReturn(c, n).getParent() + not exists(n.getDesugared()) and + result = n + } + + private Expr getLast(StmtSequence s) { + result = getLast(s.(BodyStmt).getElse()) + or + result = getLast(s.(BodyStmt).getARescue().getBody()) + or + not exists(s.(BodyStmt).getElse()) and + exists(Stmt last | last = s.getLastStmt() | + result = getLast(last) + or + result = last and not last instanceof StmtSequence + ) } /** @@ -1661,7 +1666,7 @@ private module ReturnNodes { * last thing that is evaluated in the body of the callable. */ class ExprReturnNode extends SourceReturnNode, ExprNode { - ExprReturnNode() { exists(Callable c | implicitReturn(c, this) = c.getBody().getAStmt()) } + ExprReturnNode() { this.getExprNode().getExpr() = desugar(getLast(any(Callable c).getBody())) } override ReturnKind getKindSource() { exists(CfgScope scope | scope = this.(NodeImpl).getCfgScope() | @@ -2391,9 +2396,7 @@ module TypeInference { private predicate hasTypeCheckedRead( Ssa::Definition def, CfgNodes::ExprCfgNode caseRead, CfgNodes::ExprCfgNode read, Module m ) { - exists( - CfgNodes::ExprCfgNode pattern, ConditionBlock cb, CfgNodes::ExprNodes::CaseExprCfgNode case - | + exists(CfgNodes::ExprCfgNode pattern, BasicBlock cb, CfgNodes::ExprNodes::CaseExprCfgNode case | m = resolveConstantReadAccess(pattern.getExpr()) and cb.getLastNode() = pattern and cb.edgeDominates(read.getBasicBlock(), any(MatchingSuccessor match | match.getValue() = true)) and diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/SsaImpl.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/SsaImpl.qll index 74394150ca32..9f5dfd9dcc25 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/SsaImpl.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/SsaImpl.qll @@ -4,13 +4,11 @@ module; private import codeql.ssa.Ssa as SsaImplCommon private import codeql.ruby.AST private import codeql.ruby.CFG as Cfg -private import codeql.ruby.controlflow.BasicBlocks as BasicBlocks -private import codeql.ruby.controlflow.internal.ControlFlowGraphImpl as ControlFlowGraphImpl private import codeql.ruby.dataflow.SSA private import codeql.ruby.ast.Variable private import Cfg::CfgNodes::ExprNodes -private class BasicBlock = BasicBlocks::Cfg::BasicBlock; +private class BasicBlock = Cfg::BasicBlock; module SsaInput implements SsaImplCommon::InputSig { private import codeql.ruby.controlflow.ControlFlowGraph as Cfg @@ -25,11 +23,11 @@ module SsaInput implements SsaImplCommon::InputSig { ( exists(Scope scope | scope = v.(SelfVariable).getDeclaringScope() | // We consider the `self` variable to have a single write at the entry to a method block... - scope = bb.(BasicBlocks::EntryBasicBlock).getScope() and + scope = bb.(Cfg::EntryBasicBlock).getScope() and i = 0 or // ...or a class or module block. - bb.getNode(i).getAstNode() = scope.(ModuleBase).getAControlFlowEntryNode() and + bb.getNode(i).isBefore(scope.(ModuleBase)) and not scope instanceof Toplevel // handled by case above ) or @@ -60,7 +58,7 @@ module SsaInput implements SsaImplCommon::InputSig { } } -import SsaImplCommon::Make as Impl +import SsaImplCommon::Make as Impl class Definition = Impl::Definition; @@ -98,12 +96,17 @@ private predicate writesCapturedVariable(Cfg::BasicBlock bb, LocalVariable v) { ) } +private predicate isAnnotatedExitBlock(BasicBlock bb) { + bb.getANode() instanceof Cfg::ControlFlow::AnnotatedExitNode +} + /** * Holds if a pseudo read of captured variable `v` should be inserted * at index `i` in exit block `bb`. */ -private predicate capturedExitRead(Cfg::AnnotatedExitBasicBlock bb, int i, LocalVariable v) { +private predicate capturedExitRead(BasicBlock bb, int i, LocalVariable v) { writesCapturedVariable(bb.getAPredecessor*(), v) and + isAnnotatedExitBlock(bb) and i = bb.length() } @@ -112,13 +115,11 @@ private predicate capturedExitRead(Cfg::AnnotatedExitBasicBlock bb, int i, Local * at index `i` in basic block `bb`. We do this to ensure that namespace * self-variables always get an SSA definition. */ -private predicate namespaceSelfExitRead(Cfg::AnnotatedExitBasicBlock bb, int i, SelfVariable v) { - exists(Namespace ns, AstNode last | +private predicate namespaceSelfExitRead(BasicBlock bb, int i, SelfVariable v) { + exists(Namespace ns, Cfg::ControlFlowNode n | v.getDeclaringScope() = ns and - last = ControlFlowGraphImpl::getAControlFlowExitNode(ns) and - if last = ns - then bb.getNode(i).getAPredecessor().getAstNode() = last - else bb.getNode(i).getAstNode() = last + n.isAfter(ns) and + if n.isBefore(ns) then bb.getNode(i - 1) = n else bb.getNode(i) = n ) } @@ -129,7 +130,8 @@ private predicate namespaceSelfExitRead(Cfg::AnnotatedExitBasicBlock bb, int i, pragma[noinline] private predicate hasCapturedRead(Variable v, Cfg::CfgScope scope) { any(LocalVariableReadAccessCfgNode read | - read.getVariable() = v and scope = read.getScope().getOuterCfgScope*() + read.getVariable() = v and + scope = read.getEnclosingCallable().(Cfg::CfgScope).getOuterCfgScope*() ).getExpr().isCapturedAccess() } @@ -177,7 +179,7 @@ private predicate capturedCallRead(CallCfgNode call, Cfg::BasicBlock bb, int i, private predicate variableReadActual(Cfg::BasicBlock bb, int i, LocalVariable v) { exists(VariableReadAccess read | read.getVariable() = v and - read = bb.getNode(i).getAstNode() + bb.getNode(i).injects(read) ) } @@ -188,7 +190,8 @@ private predicate variableReadActual(Cfg::BasicBlock bb, int i, LocalVariable v) pragma[noinline] private predicate hasCapturedWrite(Variable v, Cfg::CfgScope scope) { any(LocalVariableWriteAccessCfgNode write | - write.getVariable() = v and scope = write.getScope().getOuterCfgScope*() + write.getVariable() = v and + scope = write.getEnclosingCallable().(Cfg::CfgScope).getOuterCfgScope*() ).getExpr().isCapturedAccess() } @@ -393,7 +396,7 @@ class NormalParameter extends Parameter { pragma[nomagic] Definition getParameterDef(NamedParameter p) { exists(Cfg::BasicBlock bb, int i | - bb.getNode(i).getAstNode() = p.getDefiningAccess() and + bb.getNode(i).injects(p.getDefiningAccess()) and result.definesAt(_, bb, i) ) } diff --git a/ruby/ql/lib/codeql/ruby/frameworks/Sinatra.qll b/ruby/ql/lib/codeql/ruby/frameworks/Sinatra.qll index eabee2ea5133..3ffdb915c6f3 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/Sinatra.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/Sinatra.qll @@ -289,7 +289,7 @@ module Sinatra { private predicate blockPostSelf(DataFlow::PostUpdateNode n, DataFlow::BlockNode b) { exists(SelfVariableAccessCfgNode self | n.getPreUpdateNode().asExpr() = self and - self.getScope() = b.asExpr().getAstNode() + self.getEnclosingCallable() = b.asExpr().getAstNode() ) } diff --git a/ruby/ql/lib/codeql/ruby/security/ConditionalBypassCustomizations.qll b/ruby/ql/lib/codeql/ruby/security/ConditionalBypassCustomizations.qll index a64cd1039c17..cf752c3aaeb1 100644 --- a/ruby/ql/lib/codeql/ruby/security/ConditionalBypassCustomizations.qll +++ b/ruby/ql/lib/codeql/ruby/security/ConditionalBypassCustomizations.qll @@ -46,8 +46,8 @@ module ConditionalBypass { SensitiveAction action; SensitiveActionGuardConditional() { - exists(ConditionBlock cb, BasicBlock controlled | - cb.edgeDominates(controlled, _) and + exists(BasicBlock cb, BasicBlock controlled | + cb.edgeDominates(controlled, any(ConditionalSuccessor s)) and controlled.getANode() = action.asExpr() and cb.getLastNode() = this.asExpr() ) diff --git a/ruby/ql/lib/ide-contextual-queries/printCfg.ql b/ruby/ql/lib/ide-contextual-queries/printCfg.ql index 1c4cec61a3ef..c749f035f748 100644 --- a/ruby/ql/lib/ide-contextual-queries/printCfg.ql +++ b/ruby/ql/lib/ide-contextual-queries/printCfg.ql @@ -8,7 +8,6 @@ */ private import codeql.Locations -private import codeql.ruby.controlflow.internal.ControlFlowGraphImpl private import codeql.ruby.controlflow.ControlFlowGraph external string selectedSourceFile(); @@ -23,7 +22,7 @@ external int selectedSourceColumn(); private predicate selectedSourceColumnAlias = selectedSourceColumn/0; -module ViewCfgQueryInput implements ViewCfgQueryInputSig { +module ViewCfgQueryInput implements ControlFlow::ViewCfgQueryInputSig { predicate selectedSourceFile = selectedSourceFileAlias/0; predicate selectedSourceLine = selectedSourceLineAlias/0; @@ -31,11 +30,11 @@ module ViewCfgQueryInput implements ViewCfgQueryInputSig { predicate selectedSourceColumn = selectedSourceColumnAlias/0; predicate cfgScopeSpan( - CfgScope scope, File file, int startLine, int startColumn, int endLine, int endColumn + CfgScopeImpl scope, File file, int startLine, int startColumn, int endLine, int endColumn ) { file = scope.getFile() and scope.getLocation().hasLocationInfo(_, startLine, startColumn, endLine, endColumn) } } -import ViewCfgQuery +import ControlFlow::ViewCfgQuery diff --git a/ruby/ql/src/experimental/performance/UseDetect.ql b/ruby/ql/src/experimental/performance/UseDetect.ql index 56ab99ae4056..61cf8ccd3f33 100644 --- a/ruby/ql/src/experimental/performance/UseDetect.ql +++ b/ruby/ql/src/experimental/performance/UseDetect.ql @@ -42,13 +42,11 @@ class EndCall extends MethodCall { } Expr getUniqueRead(Expr e) { - forex(CfgNode eNode | eNode.getAstNode() = e | - exists(Ssa::WriteDefinition def | - def.assigns(eNode) and - strictcount(def.getARead()) = 1 and - not def = any(Ssa::PhiNode phi).getAnInput() and - def.getARead().getAstNode() = result - ) + exists(Ssa::WriteDefinition def | + def.assigns(e.getControlFlowNode()) and + strictcount(def.getARead()) = 1 and + not def = any(Ssa::PhiNode phi).getAnInput() and + def.getARead().getAstNode() = result ) } diff --git a/ruby/ql/src/queries/performance/DatabaseQueryInLoop.ql b/ruby/ql/src/queries/performance/DatabaseQueryInLoop.ql index c81cdd6b2f63..67e9ba4f9c77 100644 --- a/ruby/ql/src/queries/performance/DatabaseQueryInLoop.ql +++ b/ruby/ql/src/queries/performance/DatabaseQueryInLoop.ql @@ -36,7 +36,7 @@ class LoopingCall extends DataFlow::CallNode { } /** Holds if `c` is executed as part of the body of this loop. */ - predicate executesCall(DataFlow::CallNode c) { c.asExpr().getScope() = loopScope } + predicate executesCall(DataFlow::CallNode c) { c.asExpr().getEnclosingCallable() = loopScope } } /** Holds if `ar` influences a guard that may control the execution of a loop. */ diff --git a/ruby/ql/src/queries/variables/DeadStoreOfLocal.ql b/ruby/ql/src/queries/variables/DeadStoreOfLocal.ql index 849fb8ecd5a7..70d3191b8a72 100644 --- a/ruby/ql/src/queries/variables/DeadStoreOfLocal.ql +++ b/ruby/ql/src/queries/variables/DeadStoreOfLocal.ql @@ -19,7 +19,12 @@ import codeql.ruby.ApiGraphs pragma[nomagic] private predicate hasErbResultCall(CfgScope scope) { - scope = API::getTopLevelMember("ERB").getInstance().getAMethodCall("result").asExpr().getScope() + scope = + API::getTopLevelMember("ERB") + .getInstance() + .getAMethodCall("result") + .asExpr() + .getEnclosingCallable() } class RelevantLocalVariableWriteAccess extends LocalVariableWriteAccess { diff --git a/ruby/ql/test/library-tests/controlflow/graph/BasicBlocks.ql b/ruby/ql/test/library-tests/controlflow/graph/BasicBlocks.ql index c99de9bc0a86..de648d227e72 100644 --- a/ruby/ql/test/library-tests/controlflow/graph/BasicBlocks.ql +++ b/ruby/ql/test/library-tests/controlflow/graph/BasicBlocks.ql @@ -1,5 +1,4 @@ import codeql.ruby.controlflow.ControlFlowGraph -import codeql.ruby.controlflow.BasicBlocks query predicate dominates(BasicBlock bb1, BasicBlock bb2) { bb1.dominates(bb2) } @@ -9,14 +8,10 @@ query predicate immediateDominator(BasicBlock bb1, BasicBlock bb2) { bb1.getImmediateDominator() = bb2 } -query predicate controls(ConditionBlock bb1, BasicBlock bb2, ConditionalSuccessor t) { +query predicate controls(BasicBlock bb1, BasicBlock bb2, ConditionalSuccessor t) { bb1.edgeDominates(bb2, t) } -query predicate successor(ConditionBlock bb1, BasicBlock bb2, SuccessorType t) { +query predicate successor(BasicBlock bb1, BasicBlock bb2, ConditionalSuccessor t) { bb1.getASuccessor(t) = bb2 } - -query predicate joinBlockPredecessor(JoinBlock bb1, BasicBlock bb2, int i) { - bb1.getJoinBlockPredecessor(i) = bb2 -} diff --git a/ruby/ql/test/library-tests/controlflow/graph/Cfg.ql b/ruby/ql/test/library-tests/controlflow/graph/Cfg.ql index 39d0627613e9..54fc30b8eec3 100644 --- a/ruby/ql/test/library-tests/controlflow/graph/Cfg.ql +++ b/ruby/ql/test/library-tests/controlflow/graph/Cfg.ql @@ -1,2 +1,2 @@ import codeql.ruby.CFG -import codeql.ruby.controlflow.internal.ControlFlowGraphImpl::TestOutput +import ControlFlow::TestOutput diff --git a/ruby/ql/test/library-tests/controlflow/graph/Nodes.expected b/ruby/ql/test/library-tests/controlflow/graph/Nodes.expected index 54cf1d085433..1bb35e0987c9 100644 --- a/ruby/ql/test/library-tests/controlflow/graph/Nodes.expected +++ b/ruby/ql/test/library-tests/controlflow/graph/Nodes.expected @@ -1,10 +1,6 @@ callsWithNoArguments -| break_ensure.rb:8:6:8:13 | [ensure: exception] call to elements | | break_ensure.rb:8:6:8:13 | call to elements | -| break_ensure.rb:8:6:8:18 | [ensure: exception] call to nil? | | break_ensure.rb:8:6:8:18 | call to nil? | -| break_ensure.rb:20:10:20:15 | [ensure: break] call to nil? | -| break_ensure.rb:20:10:20:15 | [ensure: exception] call to nil? | | break_ensure.rb:20:10:20:15 | call to nil? | | break_ensure.rb:29:8:29:13 | call to nil? | | case.rb:2:8:2:9 | call to x1 | @@ -26,8 +22,7 @@ callsWithNoArguments | cfg.rb:62:7:62:12 | * ... | | cfg.rb:62:17:62:27 | * ... | | cfg.rb:90:1:93:3 | call to each | -| cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:90:5:90:5 | [true] ! ... | +| cfg.rb:90:5:90:5 | ! ... | | cfg.rb:90:5:90:5 | defined? ... | | cfg.rb:98:10:98:15 | ** ... | | cfg.rb:98:30:98:35 | ** ... | @@ -61,10 +56,9 @@ callsWithNoArguments | desugar.rb:22:18:22:29 | * ... | | desugar.rb:26:6:26:11 | * ... | | desugar.rb:26:15:26:25 | * ... | -| ifs.rb:4:30:4:38 | [false] ! ... | -| ifs.rb:4:30:4:38 | [true] ! ... | +| ifs.rb:4:30:4:38 | ! ... | | ifs.rb:20:9:20:10 | - ... | -| ifs.rb:41:6:41:10 | [false] ! ... | +| ifs.rb:41:6:41:10 | ! ... | | loops.rb:25:3:27:5 | call to each | | raise.rb:155:3:155:50 | call to each | | raise.rb:155:37:155:48 | call to nil? | @@ -72,25 +66,17 @@ callsWithNoArguments positionalArguments | break_ensure.rb:2:9:2:13 | ... < ... | break_ensure.rb:2:13:2:13 | 0 | | break_ensure.rb:3:8:3:12 | ... > ... | break_ensure.rb:3:12:3:12 | 0 | -| break_ensure.rb:9:5:9:23 | [ensure: exception] call to puts | break_ensure.rb:9:10:9:23 | [ensure: exception] "elements nil" | | break_ensure.rb:9:5:9:23 | call to puts | break_ensure.rb:9:10:9:23 | "elements nil" | | break_ensure.rb:14:9:14:13 | ... < ... | break_ensure.rb:14:13:14:13 | 0 | | break_ensure.rb:16:10:16:14 | ... > ... | break_ensure.rb:16:14:16:14 | 0 | -| break_ensure.rb:21:9:21:20 | [ensure: break] call to puts | break_ensure.rb:21:14:21:20 | [ensure: break] "y nil" | -| break_ensure.rb:21:9:21:20 | [ensure: exception] call to puts | break_ensure.rb:21:14:21:20 | [ensure: exception] "y nil" | | break_ensure.rb:21:9:21:20 | call to puts | break_ensure.rb:21:14:21:20 | "y nil" | | break_ensure.rb:33:11:33:15 | ... < ... | break_ensure.rb:33:15:33:15 | 0 | -| break_ensure.rb:33:11:33:15 | [ensure: exception] ... < ... | break_ensure.rb:33:15:33:15 | [ensure: exception] 0 | -| break_ensure.rb:33:11:33:15 | [ensure: return] ... < ... | break_ensure.rb:33:15:33:15 | [ensure: return] 0 | | break_ensure.rb:35:12:35:16 | ... > ... | break_ensure.rb:35:16:35:16 | 0 | -| break_ensure.rb:35:12:35:16 | [ensure: exception] ... > ... | break_ensure.rb:35:16:35:16 | [ensure: exception] 0 | -| break_ensure.rb:35:12:35:16 | [ensure: return] ... > ... | break_ensure.rb:35:16:35:16 | [ensure: return] 0 | | break_ensure.rb:41:3:41:13 | call to puts | break_ensure.rb:41:8:41:13 | "Done" | | break_ensure.rb:45:9:45:13 | ... < ... | break_ensure.rb:45:13:45:13 | 0 | | break_ensure.rb:47:10:47:14 | ... > ... | break_ensure.rb:47:14:47:14 | 1 | | break_ensure.rb:48:9:48:16 | call to raise | break_ensure.rb:48:15:48:16 | "" | | break_ensure.rb:51:10:51:14 | ... > ... | break_ensure.rb:51:14:51:14 | 0 | -| break_ensure.rb:51:10:51:14 | [ensure: exception] ... > ... | break_ensure.rb:51:14:51:14 | [ensure: exception] 0 | | case.rb:3:29:3:37 | call to puts | case.rb:3:34:3:37 | "x2" | | case.rb:4:17:4:24 | call to puts | case.rb:4:22:4:24 | "2" | | case.rb:14:13:14:18 | ... == ... | case.rb:14:18:14:18 | 5 | @@ -263,10 +249,8 @@ positionalArguments | ifs.rb:2:6:2:10 | ... > ... | ifs.rb:2:10:2:10 | 2 | | ifs.rb:3:5:3:30 | call to puts | ifs.rb:3:10:3:30 | "x is greater than 2" | | ifs.rb:4:9:4:14 | ... <= ... | ifs.rb:4:14:4:14 | 2 | -| ifs.rb:4:9:4:24 | [false] ... and ... | ifs.rb:4:20:4:24 | ... > ... | -| ifs.rb:4:9:4:24 | [true] ... and ... | ifs.rb:4:20:4:24 | ... > ... | -| ifs.rb:4:9:4:38 | [false] ... and ... | ifs.rb:4:30:4:38 | [false] ! ... | -| ifs.rb:4:9:4:38 | [true] ... and ... | ifs.rb:4:30:4:38 | [true] ! ... | +| ifs.rb:4:9:4:24 | ... and ... | ifs.rb:4:20:4:24 | ... > ... | +| ifs.rb:4:9:4:38 | ... and ... | ifs.rb:4:30:4:38 | ! ... | | ifs.rb:4:20:4:24 | ... > ... | ifs.rb:4:24:4:24 | 0 | | ifs.rb:4:32:4:37 | ... == ... | ifs.rb:4:37:4:37 | 5 | | ifs.rb:5:5:5:17 | call to puts | ifs.rb:5:10:5:17 | "x is 1" | @@ -279,8 +263,7 @@ positionalArguments | ifs.rb:38:12:38:17 | ... == ... | ifs.rb:38:17:38:17 | 2 | | ifs.rb:48:5:48:15 | call to puts | ifs.rb:48:10:48:15 | "true" | | ifs.rb:51:3:51:13 | call to puts | ifs.rb:51:8:51:13 | "done" | -| ifs.rb:55:7:55:14 | [false] ... \|\| ... | ifs.rb:55:13:55:14 | b2 | -| ifs.rb:55:7:55:14 | [true] ... \|\| ... | ifs.rb:55:13:55:14 | b2 | +| ifs.rb:55:7:55:14 | ... \|\| ... | ifs.rb:55:13:55:14 | b2 | | ifs.rb:56:5:56:19 | call to puts | ifs.rb:56:10:56:19 | "b1 or b2" | | loops.rb:2:9:2:14 | ... >= ... | loops.rb:2:14:2:14 | 0 | | loops.rb:3:5:3:10 | call to puts | loops.rb:3:10:3:10 | x | @@ -319,16 +302,12 @@ positionalArguments | raise.rb:70:5:70:17 | call to raise | raise.rb:70:11:70:17 | "x > 2" | | raise.rb:71:9:71:13 | ... < ... | raise.rb:71:13:71:13 | 0 | | raise.rb:74:3:74:20 | call to puts | raise.rb:74:8:74:20 | "0 <= x <= 2" | -| raise.rb:76:3:76:15 | [ensure: exception] call to puts | raise.rb:76:8:76:15 | [ensure: exception] "ensure" | -| raise.rb:76:3:76:15 | [ensure: return] call to puts | raise.rb:76:8:76:15 | [ensure: return] "ensure" | | raise.rb:76:3:76:15 | call to puts | raise.rb:76:8:76:15 | "ensure" | | raise.rb:80:3:80:17 | call to puts | raise.rb:80:8:80:17 | "Begin m8" | | raise.rb:82:8:82:12 | ... > ... | raise.rb:82:12:82:12 | 2 | | raise.rb:83:7:83:19 | call to raise | raise.rb:83:13:83:19 | "x > 2" | | raise.rb:84:11:84:15 | ... < ... | raise.rb:84:15:84:15 | 0 | | raise.rb:87:5:87:22 | call to puts | raise.rb:87:10:87:22 | "0 <= x <= 2" | -| raise.rb:89:5:89:17 | [ensure: exception] call to puts | raise.rb:89:10:89:17 | [ensure: exception] "ensure" | -| raise.rb:89:5:89:17 | [ensure: return] call to puts | raise.rb:89:10:89:17 | [ensure: return] "ensure" | | raise.rb:89:5:89:17 | call to puts | raise.rb:89:10:89:17 | "ensure" | | raise.rb:91:3:91:15 | call to puts | raise.rb:91:8:91:15 | "End m8" | | raise.rb:95:3:95:17 | call to puts | raise.rb:95:8:95:17 | "Begin m9" | @@ -336,30 +315,16 @@ positionalArguments | raise.rb:98:7:98:19 | call to raise | raise.rb:98:13:98:19 | "x > 2" | | raise.rb:99:11:99:15 | ... < ... | raise.rb:99:15:99:15 | 0 | | raise.rb:102:5:102:22 | call to puts | raise.rb:102:10:102:22 | "0 <= x <= 2" | -| raise.rb:104:5:104:23 | [ensure: exception] call to puts | raise.rb:104:10:104:23 | [ensure: exception] "outer ensure" | -| raise.rb:104:5:104:23 | [ensure: return] call to puts | raise.rb:104:10:104:23 | [ensure: return] "outer ensure" | | raise.rb:104:5:104:23 | call to puts | raise.rb:104:10:104:23 | "outer ensure" | -| raise.rb:107:9:107:26 | [ensure: exception] call to raise | raise.rb:107:15:107:26 | [ensure: exception] "b1 is true" | -| raise.rb:107:9:107:26 | [ensure: return] call to raise | raise.rb:107:15:107:26 | [ensure: return] "b1 is true" | | raise.rb:107:9:107:26 | call to raise | raise.rb:107:15:107:26 | "b1 is true" | -| raise.rb:110:7:110:25 | [ensure(1): exception] call to puts | raise.rb:110:12:110:25 | [ensure(1): exception] "inner ensure" | -| raise.rb:110:7:110:25 | [ensure: exception, ensure(1): exception] call to puts | raise.rb:110:12:110:25 | [ensure: exception, ensure(1): exception] "inner ensure" | -| raise.rb:110:7:110:25 | [ensure: exception] call to puts | raise.rb:110:12:110:25 | [ensure: exception] "inner ensure" | -| raise.rb:110:7:110:25 | [ensure: return, ensure(1): exception] call to puts | raise.rb:110:12:110:25 | [ensure: return, ensure(1): exception] "inner ensure" | -| raise.rb:110:7:110:25 | [ensure: return] call to puts | raise.rb:110:12:110:25 | [ensure: return] "inner ensure" | | raise.rb:110:7:110:25 | call to puts | raise.rb:110:12:110:25 | "inner ensure" | | raise.rb:113:3:113:15 | call to puts | raise.rb:113:8:113:15 | "End m9" | -| raise.rb:115:3:115:22 | [ensure: exception] call to puts | raise.rb:115:8:115:22 | [ensure: exception] "method ensure" | -| raise.rb:115:3:115:22 | [ensure: return] call to puts | raise.rb:115:8:115:22 | [ensure: return] "method ensure" | | raise.rb:115:3:115:22 | call to puts | raise.rb:115:8:115:22 | "method ensure" | -| raise.rb:117:5:117:22 | [ensure: exception] call to raise | raise.rb:117:11:117:22 | [ensure: exception] "b2 is true" | -| raise.rb:117:5:117:22 | [ensure: return] call to raise | raise.rb:117:11:117:22 | [ensure: return] "b2 is true" | | raise.rb:117:5:117:22 | call to raise | raise.rb:117:11:117:22 | "b2 is true" | | raise.rb:121:14:121:30 | call to raise | raise.rb:121:20:121:30 | "Exception" | | raise.rb:125:3:125:51 | call to puts | raise.rb:125:8:125:51 | "Will not get executed if p is..." | | raise.rb:131:7:131:22 | call to raise | raise.rb:131:13:131:22 | ExceptionA | | raise.rb:135:5:135:21 | call to puts | raise.rb:135:10:135:21 | "ExceptionB" | -| raise.rb:137:5:137:17 | [ensure: exception] call to puts | raise.rb:137:10:137:17 | [ensure: exception] "Ensure" | | raise.rb:137:5:137:17 | call to puts | raise.rb:137:10:137:17 | "Ensure" | | raise.rb:139:3:139:16 | call to puts | raise.rb:139:8:139:16 | "End m11" | | raise.rb:144:5:144:12 | call to raise | raise.rb:144:11:144:12 | "" | @@ -367,8 +332,7 @@ positionalArguments | raise.rb:160:5:162:7 | call to bar | raise.rb:160:9:162:7 | -> { ... } | | raise.rb:161:7:161:14 | call to raise | raise.rb:161:13:161:14 | "" | | raise.rb:168:5:168:12 | call to raise | raise.rb:168:11:168:12 | "" | -| raise.rb:174:8:174:23 | [false] ... \|\| ... | raise.rb:174:14:174:23 | ... == ... | -| raise.rb:174:8:174:23 | [true] ... \|\| ... | raise.rb:174:14:174:23 | ... == ... | +| raise.rb:174:8:174:23 | ... \|\| ... | raise.rb:174:14:174:23 | ... == ... | | raise.rb:174:14:174:23 | ... == ... | raise.rb:174:20:174:23 | true | keywordArguments | cfg.html.erb:6:9:6:58 | call to stylesheet_link_tag | media | cfg.html.erb:6:54:6:58 | "all" | diff --git a/ruby/ql/test/library-tests/dataflow/barrier-guards/barrier-guards.ql b/ruby/ql/test/library-tests/dataflow/barrier-guards/barrier-guards.ql index 86609a73909c..e4f35886dd70 100644 --- a/ruby/ql/test/library-tests/dataflow/barrier-guards/barrier-guards.ql +++ b/ruby/ql/test/library-tests/dataflow/barrier-guards/barrier-guards.ql @@ -3,7 +3,6 @@ import codeql.ruby.dataflow.internal.DataFlowPublic import codeql.ruby.dataflow.BarrierGuards import codeql.ruby.controlflow.CfgNodes import codeql.ruby.controlflow.ControlFlowGraph -import codeql.ruby.controlflow.BasicBlocks import codeql.ruby.DataFlow import utils.test.InlineExpectationsTest @@ -13,7 +12,7 @@ query predicate newStyleBarrierGuards(DataFlow::Node n) { } query predicate controls(CfgNode condition, BasicBlock bb, ConditionalSuccessor s) { - exists(ConditionBlock cb | + exists(BasicBlock cb | cb.edgeDominates(bb, s) and condition = cb.getLastNode() ) diff --git a/ruby/ql/test/library-tests/dataflow/implicit-return/implicit-return.expected b/ruby/ql/test/library-tests/dataflow/implicit-return/implicit-return.expected index 979cc77777b7..631423bedd17 100644 --- a/ruby/ql/test/library-tests/dataflow/implicit-return/implicit-return.expected +++ b/ruby/ql/test/library-tests/dataflow/implicit-return/implicit-return.expected @@ -1,10 +1,30 @@ models edges | implicit_return.rb:12:3:12:11 | call to source | implicit_return.rb:15:6:15:11 | call to m_body | provenance | | +| implicit_return.rb:19:3:19:11 | call to source | implicit_return.rb:24:6:24:18 | call to m_body_ensure | provenance | | +| implicit_return.rb:30:3:30:11 | call to source | implicit_return.rb:33:6:33:13 | call to m_rescue | provenance | | +| implicit_return.rb:39:3:39:11 | call to source | implicit_return.rb:44:6:44:20 | call to m_rescue_ensure | provenance | | +| implicit_return.rb:52:3:52:11 | call to source | implicit_return.rb:55:6:55:11 | call to m_else | provenance | | +| implicit_return.rb:63:3:63:11 | call to source | implicit_return.rb:68:6:68:18 | call to m_else_ensure | provenance | | nodes | implicit_return.rb:12:3:12:11 | call to source | semmle.label | call to source | | implicit_return.rb:15:6:15:11 | call to m_body | semmle.label | call to m_body | +| implicit_return.rb:19:3:19:11 | call to source | semmle.label | call to source | +| implicit_return.rb:24:6:24:18 | call to m_body_ensure | semmle.label | call to m_body_ensure | +| implicit_return.rb:30:3:30:11 | call to source | semmle.label | call to source | +| implicit_return.rb:33:6:33:13 | call to m_rescue | semmle.label | call to m_rescue | +| implicit_return.rb:39:3:39:11 | call to source | semmle.label | call to source | +| implicit_return.rb:44:6:44:20 | call to m_rescue_ensure | semmle.label | call to m_rescue_ensure | +| implicit_return.rb:52:3:52:11 | call to source | semmle.label | call to source | +| implicit_return.rb:55:6:55:11 | call to m_else | semmle.label | call to m_else | +| implicit_return.rb:63:3:63:11 | call to source | semmle.label | call to source | +| implicit_return.rb:68:6:68:18 | call to m_else_ensure | semmle.label | call to m_else_ensure | subpaths testFailures #select | implicit_return.rb:15:6:15:11 | call to m_body | implicit_return.rb:12:3:12:11 | call to source | implicit_return.rb:15:6:15:11 | call to m_body | $@ | implicit_return.rb:12:3:12:11 | call to source | call to source | +| implicit_return.rb:24:6:24:18 | call to m_body_ensure | implicit_return.rb:19:3:19:11 | call to source | implicit_return.rb:24:6:24:18 | call to m_body_ensure | $@ | implicit_return.rb:19:3:19:11 | call to source | call to source | +| implicit_return.rb:33:6:33:13 | call to m_rescue | implicit_return.rb:30:3:30:11 | call to source | implicit_return.rb:33:6:33:13 | call to m_rescue | $@ | implicit_return.rb:30:3:30:11 | call to source | call to source | +| implicit_return.rb:44:6:44:20 | call to m_rescue_ensure | implicit_return.rb:39:3:39:11 | call to source | implicit_return.rb:44:6:44:20 | call to m_rescue_ensure | $@ | implicit_return.rb:39:3:39:11 | call to source | call to source | +| implicit_return.rb:55:6:55:11 | call to m_else | implicit_return.rb:52:3:52:11 | call to source | implicit_return.rb:55:6:55:11 | call to m_else | $@ | implicit_return.rb:52:3:52:11 | call to source | call to source | +| implicit_return.rb:68:6:68:18 | call to m_else_ensure | implicit_return.rb:63:3:63:11 | call to source | implicit_return.rb:68:6:68:18 | call to m_else_ensure | $@ | implicit_return.rb:63:3:63:11 | call to source | call to source | diff --git a/ruby/ql/test/library-tests/dataflow/implicit-return/implicit_return.rb b/ruby/ql/test/library-tests/dataflow/implicit-return/implicit_return.rb index 2ea215902f02..3ff507723ff1 100644 --- a/ruby/ql/test/library-tests/dataflow/implicit-return/implicit_return.rb +++ b/ruby/ql/test/library-tests/dataflow/implicit-return/implicit_return.rb @@ -21,7 +21,7 @@ def m_body_ensure source(20) end -sink(m_body_ensure) # $ MISSING: hasValueFlow=2 +sink(m_body_ensure) # $ hasValueFlow=2 # Implicit return from a `rescue` clause. def m_rescue @@ -30,7 +30,7 @@ def m_rescue source(3) end -sink(m_rescue) # $ MISSING: hasValueFlow=3 +sink(m_rescue) # $ hasValueFlow=3 # Implicit return from a `rescue` clause when an `ensure` clause is present. def m_rescue_ensure @@ -41,7 +41,7 @@ def m_rescue_ensure source(40) end -sink(m_rescue_ensure) # $ MISSING: hasValueFlow=4 +sink(m_rescue_ensure) # $ hasValueFlow=4 # Implicit return from an `else` clause. def m_else @@ -52,7 +52,7 @@ def m_else source(5) end -sink(m_else) # $ MISSING: hasValueFlow=5 +sink(m_else) # $ hasValueFlow=5 # Implicit return from an `else` clause when an `ensure` clause is present. def m_else_ensure @@ -65,4 +65,4 @@ def m_else_ensure nil end -sink(m_else_ensure) # $ MISSING: hasValueFlow=6 +sink(m_else_ensure) # $ hasValueFlow=6 diff --git a/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected b/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected index 7122b4c0ae2f..934ae56b91d5 100644 --- a/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected +++ b/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected @@ -207,800 +207,700 @@ | UseUseExplosion.rb:20:13:20:17 | [post] self | UseUseExplosion.rb:20:3691:20:3696 | self | | UseUseExplosion.rb:20:13:20:17 | self | UseUseExplosion.rb:20:35:20:39 | self | | UseUseExplosion.rb:20:13:20:17 | self | UseUseExplosion.rb:20:3691:20:3696 | self | -| UseUseExplosion.rb:20:13:20:23 | ... > ... | UseUseExplosion.rb:20:12:20:24 | [false] ( ... ) | -| UseUseExplosion.rb:20:13:20:23 | ... > ... | UseUseExplosion.rb:20:12:20:24 | [true] ( ... ) | +| UseUseExplosion.rb:20:13:20:23 | ... > ... | UseUseExplosion.rb:20:12:20:24 | ( ... ) | | UseUseExplosion.rb:20:26:20:3684 | then ... | UseUseExplosion.rb:20:9:20:3700 | if ... | | UseUseExplosion.rb:20:31:20:3684 | if ... | UseUseExplosion.rb:20:26:20:3684 | then ... | | UseUseExplosion.rb:20:35:20:39 | [post] self | UseUseExplosion.rb:20:56:20:60 | self | | UseUseExplosion.rb:20:35:20:39 | [post] self | UseUseExplosion.rb:20:3675:20:3680 | self | | UseUseExplosion.rb:20:35:20:39 | self | UseUseExplosion.rb:20:56:20:60 | self | | UseUseExplosion.rb:20:35:20:39 | self | UseUseExplosion.rb:20:3675:20:3680 | self | -| UseUseExplosion.rb:20:35:20:44 | ... > ... | UseUseExplosion.rb:20:34:20:45 | [false] ( ... ) | -| UseUseExplosion.rb:20:35:20:44 | ... > ... | UseUseExplosion.rb:20:34:20:45 | [true] ( ... ) | +| UseUseExplosion.rb:20:35:20:44 | ... > ... | UseUseExplosion.rb:20:34:20:45 | ( ... ) | | UseUseExplosion.rb:20:47:20:3668 | then ... | UseUseExplosion.rb:20:31:20:3684 | if ... | | UseUseExplosion.rb:20:52:20:3668 | if ... | UseUseExplosion.rb:20:47:20:3668 | then ... | | UseUseExplosion.rb:20:56:20:60 | [post] self | UseUseExplosion.rb:20:77:20:81 | self | | UseUseExplosion.rb:20:56:20:60 | [post] self | UseUseExplosion.rb:20:3659:20:3664 | self | | UseUseExplosion.rb:20:56:20:60 | self | UseUseExplosion.rb:20:77:20:81 | self | | UseUseExplosion.rb:20:56:20:60 | self | UseUseExplosion.rb:20:3659:20:3664 | self | -| UseUseExplosion.rb:20:56:20:65 | ... > ... | UseUseExplosion.rb:20:55:20:66 | [false] ( ... ) | -| UseUseExplosion.rb:20:56:20:65 | ... > ... | UseUseExplosion.rb:20:55:20:66 | [true] ( ... ) | +| UseUseExplosion.rb:20:56:20:65 | ... > ... | UseUseExplosion.rb:20:55:20:66 | ( ... ) | | UseUseExplosion.rb:20:68:20:3652 | then ... | UseUseExplosion.rb:20:52:20:3668 | if ... | | UseUseExplosion.rb:20:73:20:3652 | if ... | UseUseExplosion.rb:20:68:20:3652 | then ... | | UseUseExplosion.rb:20:77:20:81 | [post] self | UseUseExplosion.rb:20:98:20:102 | self | | UseUseExplosion.rb:20:77:20:81 | [post] self | UseUseExplosion.rb:20:3643:20:3648 | self | | UseUseExplosion.rb:20:77:20:81 | self | UseUseExplosion.rb:20:98:20:102 | self | | UseUseExplosion.rb:20:77:20:81 | self | UseUseExplosion.rb:20:3643:20:3648 | self | -| UseUseExplosion.rb:20:77:20:86 | ... > ... | UseUseExplosion.rb:20:76:20:87 | [false] ( ... ) | -| UseUseExplosion.rb:20:77:20:86 | ... > ... | UseUseExplosion.rb:20:76:20:87 | [true] ( ... ) | +| UseUseExplosion.rb:20:77:20:86 | ... > ... | UseUseExplosion.rb:20:76:20:87 | ( ... ) | | UseUseExplosion.rb:20:89:20:3636 | then ... | UseUseExplosion.rb:20:73:20:3652 | if ... | | UseUseExplosion.rb:20:94:20:3636 | if ... | UseUseExplosion.rb:20:89:20:3636 | then ... | | UseUseExplosion.rb:20:98:20:102 | [post] self | UseUseExplosion.rb:20:119:20:123 | self | | UseUseExplosion.rb:20:98:20:102 | [post] self | UseUseExplosion.rb:20:3627:20:3632 | self | | UseUseExplosion.rb:20:98:20:102 | self | UseUseExplosion.rb:20:119:20:123 | self | | UseUseExplosion.rb:20:98:20:102 | self | UseUseExplosion.rb:20:3627:20:3632 | self | -| UseUseExplosion.rb:20:98:20:107 | ... > ... | UseUseExplosion.rb:20:97:20:108 | [false] ( ... ) | -| UseUseExplosion.rb:20:98:20:107 | ... > ... | UseUseExplosion.rb:20:97:20:108 | [true] ( ... ) | +| UseUseExplosion.rb:20:98:20:107 | ... > ... | UseUseExplosion.rb:20:97:20:108 | ( ... ) | | UseUseExplosion.rb:20:110:20:3620 | then ... | UseUseExplosion.rb:20:94:20:3636 | if ... | | UseUseExplosion.rb:20:115:20:3620 | if ... | UseUseExplosion.rb:20:110:20:3620 | then ... | | UseUseExplosion.rb:20:119:20:123 | [post] self | UseUseExplosion.rb:20:140:20:144 | self | | UseUseExplosion.rb:20:119:20:123 | [post] self | UseUseExplosion.rb:20:3611:20:3616 | self | | UseUseExplosion.rb:20:119:20:123 | self | UseUseExplosion.rb:20:140:20:144 | self | | UseUseExplosion.rb:20:119:20:123 | self | UseUseExplosion.rb:20:3611:20:3616 | self | -| UseUseExplosion.rb:20:119:20:128 | ... > ... | UseUseExplosion.rb:20:118:20:129 | [false] ( ... ) | -| UseUseExplosion.rb:20:119:20:128 | ... > ... | UseUseExplosion.rb:20:118:20:129 | [true] ( ... ) | +| UseUseExplosion.rb:20:119:20:128 | ... > ... | UseUseExplosion.rb:20:118:20:129 | ( ... ) | | UseUseExplosion.rb:20:131:20:3604 | then ... | UseUseExplosion.rb:20:115:20:3620 | if ... | | UseUseExplosion.rb:20:136:20:3604 | if ... | UseUseExplosion.rb:20:131:20:3604 | then ... | | UseUseExplosion.rb:20:140:20:144 | [post] self | UseUseExplosion.rb:20:161:20:165 | self | | UseUseExplosion.rb:20:140:20:144 | [post] self | UseUseExplosion.rb:20:3595:20:3600 | self | | UseUseExplosion.rb:20:140:20:144 | self | UseUseExplosion.rb:20:161:20:165 | self | | UseUseExplosion.rb:20:140:20:144 | self | UseUseExplosion.rb:20:3595:20:3600 | self | -| UseUseExplosion.rb:20:140:20:149 | ... > ... | UseUseExplosion.rb:20:139:20:150 | [false] ( ... ) | -| UseUseExplosion.rb:20:140:20:149 | ... > ... | UseUseExplosion.rb:20:139:20:150 | [true] ( ... ) | +| UseUseExplosion.rb:20:140:20:149 | ... > ... | UseUseExplosion.rb:20:139:20:150 | ( ... ) | | UseUseExplosion.rb:20:152:20:3588 | then ... | UseUseExplosion.rb:20:136:20:3604 | if ... | | UseUseExplosion.rb:20:157:20:3588 | if ... | UseUseExplosion.rb:20:152:20:3588 | then ... | | UseUseExplosion.rb:20:161:20:165 | [post] self | UseUseExplosion.rb:20:182:20:186 | self | | UseUseExplosion.rb:20:161:20:165 | [post] self | UseUseExplosion.rb:20:3579:20:3584 | self | | UseUseExplosion.rb:20:161:20:165 | self | UseUseExplosion.rb:20:182:20:186 | self | | UseUseExplosion.rb:20:161:20:165 | self | UseUseExplosion.rb:20:3579:20:3584 | self | -| UseUseExplosion.rb:20:161:20:170 | ... > ... | UseUseExplosion.rb:20:160:20:171 | [false] ( ... ) | -| UseUseExplosion.rb:20:161:20:170 | ... > ... | UseUseExplosion.rb:20:160:20:171 | [true] ( ... ) | +| UseUseExplosion.rb:20:161:20:170 | ... > ... | UseUseExplosion.rb:20:160:20:171 | ( ... ) | | UseUseExplosion.rb:20:173:20:3572 | then ... | UseUseExplosion.rb:20:157:20:3588 | if ... | | UseUseExplosion.rb:20:178:20:3572 | if ... | UseUseExplosion.rb:20:173:20:3572 | then ... | | UseUseExplosion.rb:20:182:20:186 | [post] self | UseUseExplosion.rb:20:203:20:207 | self | | UseUseExplosion.rb:20:182:20:186 | [post] self | UseUseExplosion.rb:20:3563:20:3568 | self | | UseUseExplosion.rb:20:182:20:186 | self | UseUseExplosion.rb:20:203:20:207 | self | | UseUseExplosion.rb:20:182:20:186 | self | UseUseExplosion.rb:20:3563:20:3568 | self | -| UseUseExplosion.rb:20:182:20:191 | ... > ... | UseUseExplosion.rb:20:181:20:192 | [false] ( ... ) | -| UseUseExplosion.rb:20:182:20:191 | ... > ... | UseUseExplosion.rb:20:181:20:192 | [true] ( ... ) | +| UseUseExplosion.rb:20:182:20:191 | ... > ... | UseUseExplosion.rb:20:181:20:192 | ( ... ) | | UseUseExplosion.rb:20:194:20:3556 | then ... | UseUseExplosion.rb:20:178:20:3572 | if ... | | UseUseExplosion.rb:20:199:20:3556 | if ... | UseUseExplosion.rb:20:194:20:3556 | then ... | | UseUseExplosion.rb:20:203:20:207 | [post] self | UseUseExplosion.rb:20:224:20:228 | self | | UseUseExplosion.rb:20:203:20:207 | [post] self | UseUseExplosion.rb:20:3547:20:3552 | self | | UseUseExplosion.rb:20:203:20:207 | self | UseUseExplosion.rb:20:224:20:228 | self | | UseUseExplosion.rb:20:203:20:207 | self | UseUseExplosion.rb:20:3547:20:3552 | self | -| UseUseExplosion.rb:20:203:20:212 | ... > ... | UseUseExplosion.rb:20:202:20:213 | [false] ( ... ) | -| UseUseExplosion.rb:20:203:20:212 | ... > ... | UseUseExplosion.rb:20:202:20:213 | [true] ( ... ) | +| UseUseExplosion.rb:20:203:20:212 | ... > ... | UseUseExplosion.rb:20:202:20:213 | ( ... ) | | UseUseExplosion.rb:20:215:20:3540 | then ... | UseUseExplosion.rb:20:199:20:3556 | if ... | | UseUseExplosion.rb:20:220:20:3540 | if ... | UseUseExplosion.rb:20:215:20:3540 | then ... | | UseUseExplosion.rb:20:224:20:228 | [post] self | UseUseExplosion.rb:20:245:20:249 | self | | UseUseExplosion.rb:20:224:20:228 | [post] self | UseUseExplosion.rb:20:3531:20:3536 | self | | UseUseExplosion.rb:20:224:20:228 | self | UseUseExplosion.rb:20:245:20:249 | self | | UseUseExplosion.rb:20:224:20:228 | self | UseUseExplosion.rb:20:3531:20:3536 | self | -| UseUseExplosion.rb:20:224:20:233 | ... > ... | UseUseExplosion.rb:20:223:20:234 | [false] ( ... ) | -| UseUseExplosion.rb:20:224:20:233 | ... > ... | UseUseExplosion.rb:20:223:20:234 | [true] ( ... ) | +| UseUseExplosion.rb:20:224:20:233 | ... > ... | UseUseExplosion.rb:20:223:20:234 | ( ... ) | | UseUseExplosion.rb:20:236:20:3524 | then ... | UseUseExplosion.rb:20:220:20:3540 | if ... | | UseUseExplosion.rb:20:241:20:3524 | if ... | UseUseExplosion.rb:20:236:20:3524 | then ... | | UseUseExplosion.rb:20:245:20:249 | [post] self | UseUseExplosion.rb:20:266:20:270 | self | | UseUseExplosion.rb:20:245:20:249 | [post] self | UseUseExplosion.rb:20:3515:20:3520 | self | | UseUseExplosion.rb:20:245:20:249 | self | UseUseExplosion.rb:20:266:20:270 | self | | UseUseExplosion.rb:20:245:20:249 | self | UseUseExplosion.rb:20:3515:20:3520 | self | -| UseUseExplosion.rb:20:245:20:254 | ... > ... | UseUseExplosion.rb:20:244:20:255 | [false] ( ... ) | -| UseUseExplosion.rb:20:245:20:254 | ... > ... | UseUseExplosion.rb:20:244:20:255 | [true] ( ... ) | +| UseUseExplosion.rb:20:245:20:254 | ... > ... | UseUseExplosion.rb:20:244:20:255 | ( ... ) | | UseUseExplosion.rb:20:257:20:3508 | then ... | UseUseExplosion.rb:20:241:20:3524 | if ... | | UseUseExplosion.rb:20:262:20:3508 | if ... | UseUseExplosion.rb:20:257:20:3508 | then ... | | UseUseExplosion.rb:20:266:20:270 | [post] self | UseUseExplosion.rb:20:287:20:291 | self | | UseUseExplosion.rb:20:266:20:270 | [post] self | UseUseExplosion.rb:20:3499:20:3504 | self | | UseUseExplosion.rb:20:266:20:270 | self | UseUseExplosion.rb:20:287:20:291 | self | | UseUseExplosion.rb:20:266:20:270 | self | UseUseExplosion.rb:20:3499:20:3504 | self | -| UseUseExplosion.rb:20:266:20:275 | ... > ... | UseUseExplosion.rb:20:265:20:276 | [false] ( ... ) | -| UseUseExplosion.rb:20:266:20:275 | ... > ... | UseUseExplosion.rb:20:265:20:276 | [true] ( ... ) | +| UseUseExplosion.rb:20:266:20:275 | ... > ... | UseUseExplosion.rb:20:265:20:276 | ( ... ) | | UseUseExplosion.rb:20:278:20:3492 | then ... | UseUseExplosion.rb:20:262:20:3508 | if ... | | UseUseExplosion.rb:20:283:20:3492 | if ... | UseUseExplosion.rb:20:278:20:3492 | then ... | | UseUseExplosion.rb:20:287:20:291 | [post] self | UseUseExplosion.rb:20:308:20:312 | self | | UseUseExplosion.rb:20:287:20:291 | [post] self | UseUseExplosion.rb:20:3483:20:3488 | self | | UseUseExplosion.rb:20:287:20:291 | self | UseUseExplosion.rb:20:308:20:312 | self | | UseUseExplosion.rb:20:287:20:291 | self | UseUseExplosion.rb:20:3483:20:3488 | self | -| UseUseExplosion.rb:20:287:20:296 | ... > ... | UseUseExplosion.rb:20:286:20:297 | [false] ( ... ) | -| UseUseExplosion.rb:20:287:20:296 | ... > ... | UseUseExplosion.rb:20:286:20:297 | [true] ( ... ) | +| UseUseExplosion.rb:20:287:20:296 | ... > ... | UseUseExplosion.rb:20:286:20:297 | ( ... ) | | UseUseExplosion.rb:20:299:20:3476 | then ... | UseUseExplosion.rb:20:283:20:3492 | if ... | | UseUseExplosion.rb:20:304:20:3476 | if ... | UseUseExplosion.rb:20:299:20:3476 | then ... | | UseUseExplosion.rb:20:308:20:312 | [post] self | UseUseExplosion.rb:20:329:20:333 | self | | UseUseExplosion.rb:20:308:20:312 | [post] self | UseUseExplosion.rb:20:3467:20:3472 | self | | UseUseExplosion.rb:20:308:20:312 | self | UseUseExplosion.rb:20:329:20:333 | self | | UseUseExplosion.rb:20:308:20:312 | self | UseUseExplosion.rb:20:3467:20:3472 | self | -| UseUseExplosion.rb:20:308:20:317 | ... > ... | UseUseExplosion.rb:20:307:20:318 | [false] ( ... ) | -| UseUseExplosion.rb:20:308:20:317 | ... > ... | UseUseExplosion.rb:20:307:20:318 | [true] ( ... ) | +| UseUseExplosion.rb:20:308:20:317 | ... > ... | UseUseExplosion.rb:20:307:20:318 | ( ... ) | | UseUseExplosion.rb:20:320:20:3460 | then ... | UseUseExplosion.rb:20:304:20:3476 | if ... | | UseUseExplosion.rb:20:325:20:3460 | if ... | UseUseExplosion.rb:20:320:20:3460 | then ... | | UseUseExplosion.rb:20:329:20:333 | [post] self | UseUseExplosion.rb:20:350:20:354 | self | | UseUseExplosion.rb:20:329:20:333 | [post] self | UseUseExplosion.rb:20:3451:20:3456 | self | | UseUseExplosion.rb:20:329:20:333 | self | UseUseExplosion.rb:20:350:20:354 | self | | UseUseExplosion.rb:20:329:20:333 | self | UseUseExplosion.rb:20:3451:20:3456 | self | -| UseUseExplosion.rb:20:329:20:338 | ... > ... | UseUseExplosion.rb:20:328:20:339 | [false] ( ... ) | -| UseUseExplosion.rb:20:329:20:338 | ... > ... | UseUseExplosion.rb:20:328:20:339 | [true] ( ... ) | +| UseUseExplosion.rb:20:329:20:338 | ... > ... | UseUseExplosion.rb:20:328:20:339 | ( ... ) | | UseUseExplosion.rb:20:341:20:3444 | then ... | UseUseExplosion.rb:20:325:20:3460 | if ... | | UseUseExplosion.rb:20:346:20:3444 | if ... | UseUseExplosion.rb:20:341:20:3444 | then ... | | UseUseExplosion.rb:20:350:20:354 | [post] self | UseUseExplosion.rb:20:371:20:375 | self | | UseUseExplosion.rb:20:350:20:354 | [post] self | UseUseExplosion.rb:20:3435:20:3440 | self | | UseUseExplosion.rb:20:350:20:354 | self | UseUseExplosion.rb:20:371:20:375 | self | | UseUseExplosion.rb:20:350:20:354 | self | UseUseExplosion.rb:20:3435:20:3440 | self | -| UseUseExplosion.rb:20:350:20:359 | ... > ... | UseUseExplosion.rb:20:349:20:360 | [false] ( ... ) | -| UseUseExplosion.rb:20:350:20:359 | ... > ... | UseUseExplosion.rb:20:349:20:360 | [true] ( ... ) | +| UseUseExplosion.rb:20:350:20:359 | ... > ... | UseUseExplosion.rb:20:349:20:360 | ( ... ) | | UseUseExplosion.rb:20:362:20:3428 | then ... | UseUseExplosion.rb:20:346:20:3444 | if ... | | UseUseExplosion.rb:20:367:20:3428 | if ... | UseUseExplosion.rb:20:362:20:3428 | then ... | | UseUseExplosion.rb:20:371:20:375 | [post] self | UseUseExplosion.rb:20:392:20:396 | self | | UseUseExplosion.rb:20:371:20:375 | [post] self | UseUseExplosion.rb:20:3419:20:3424 | self | | UseUseExplosion.rb:20:371:20:375 | self | UseUseExplosion.rb:20:392:20:396 | self | | UseUseExplosion.rb:20:371:20:375 | self | UseUseExplosion.rb:20:3419:20:3424 | self | -| UseUseExplosion.rb:20:371:20:380 | ... > ... | UseUseExplosion.rb:20:370:20:381 | [false] ( ... ) | -| UseUseExplosion.rb:20:371:20:380 | ... > ... | UseUseExplosion.rb:20:370:20:381 | [true] ( ... ) | +| UseUseExplosion.rb:20:371:20:380 | ... > ... | UseUseExplosion.rb:20:370:20:381 | ( ... ) | | UseUseExplosion.rb:20:383:20:3412 | then ... | UseUseExplosion.rb:20:367:20:3428 | if ... | | UseUseExplosion.rb:20:388:20:3412 | if ... | UseUseExplosion.rb:20:383:20:3412 | then ... | | UseUseExplosion.rb:20:392:20:396 | [post] self | UseUseExplosion.rb:20:413:20:417 | self | | UseUseExplosion.rb:20:392:20:396 | [post] self | UseUseExplosion.rb:20:3403:20:3408 | self | | UseUseExplosion.rb:20:392:20:396 | self | UseUseExplosion.rb:20:413:20:417 | self | | UseUseExplosion.rb:20:392:20:396 | self | UseUseExplosion.rb:20:3403:20:3408 | self | -| UseUseExplosion.rb:20:392:20:401 | ... > ... | UseUseExplosion.rb:20:391:20:402 | [false] ( ... ) | -| UseUseExplosion.rb:20:392:20:401 | ... > ... | UseUseExplosion.rb:20:391:20:402 | [true] ( ... ) | +| UseUseExplosion.rb:20:392:20:401 | ... > ... | UseUseExplosion.rb:20:391:20:402 | ( ... ) | | UseUseExplosion.rb:20:404:20:3396 | then ... | UseUseExplosion.rb:20:388:20:3412 | if ... | | UseUseExplosion.rb:20:409:20:3396 | if ... | UseUseExplosion.rb:20:404:20:3396 | then ... | | UseUseExplosion.rb:20:413:20:417 | [post] self | UseUseExplosion.rb:20:434:20:438 | self | | UseUseExplosion.rb:20:413:20:417 | [post] self | UseUseExplosion.rb:20:3387:20:3392 | self | | UseUseExplosion.rb:20:413:20:417 | self | UseUseExplosion.rb:20:434:20:438 | self | | UseUseExplosion.rb:20:413:20:417 | self | UseUseExplosion.rb:20:3387:20:3392 | self | -| UseUseExplosion.rb:20:413:20:422 | ... > ... | UseUseExplosion.rb:20:412:20:423 | [false] ( ... ) | -| UseUseExplosion.rb:20:413:20:422 | ... > ... | UseUseExplosion.rb:20:412:20:423 | [true] ( ... ) | +| UseUseExplosion.rb:20:413:20:422 | ... > ... | UseUseExplosion.rb:20:412:20:423 | ( ... ) | | UseUseExplosion.rb:20:425:20:3380 | then ... | UseUseExplosion.rb:20:409:20:3396 | if ... | | UseUseExplosion.rb:20:430:20:3380 | if ... | UseUseExplosion.rb:20:425:20:3380 | then ... | | UseUseExplosion.rb:20:434:20:438 | [post] self | UseUseExplosion.rb:20:455:20:459 | self | | UseUseExplosion.rb:20:434:20:438 | [post] self | UseUseExplosion.rb:20:3371:20:3376 | self | | UseUseExplosion.rb:20:434:20:438 | self | UseUseExplosion.rb:20:455:20:459 | self | | UseUseExplosion.rb:20:434:20:438 | self | UseUseExplosion.rb:20:3371:20:3376 | self | -| UseUseExplosion.rb:20:434:20:443 | ... > ... | UseUseExplosion.rb:20:433:20:444 | [false] ( ... ) | -| UseUseExplosion.rb:20:434:20:443 | ... > ... | UseUseExplosion.rb:20:433:20:444 | [true] ( ... ) | +| UseUseExplosion.rb:20:434:20:443 | ... > ... | UseUseExplosion.rb:20:433:20:444 | ( ... ) | | UseUseExplosion.rb:20:446:20:3364 | then ... | UseUseExplosion.rb:20:430:20:3380 | if ... | | UseUseExplosion.rb:20:451:20:3364 | if ... | UseUseExplosion.rb:20:446:20:3364 | then ... | | UseUseExplosion.rb:20:455:20:459 | [post] self | UseUseExplosion.rb:20:476:20:480 | self | | UseUseExplosion.rb:20:455:20:459 | [post] self | UseUseExplosion.rb:20:3355:20:3360 | self | | UseUseExplosion.rb:20:455:20:459 | self | UseUseExplosion.rb:20:476:20:480 | self | | UseUseExplosion.rb:20:455:20:459 | self | UseUseExplosion.rb:20:3355:20:3360 | self | -| UseUseExplosion.rb:20:455:20:464 | ... > ... | UseUseExplosion.rb:20:454:20:465 | [false] ( ... ) | -| UseUseExplosion.rb:20:455:20:464 | ... > ... | UseUseExplosion.rb:20:454:20:465 | [true] ( ... ) | +| UseUseExplosion.rb:20:455:20:464 | ... > ... | UseUseExplosion.rb:20:454:20:465 | ( ... ) | | UseUseExplosion.rb:20:467:20:3348 | then ... | UseUseExplosion.rb:20:451:20:3364 | if ... | | UseUseExplosion.rb:20:472:20:3348 | if ... | UseUseExplosion.rb:20:467:20:3348 | then ... | | UseUseExplosion.rb:20:476:20:480 | [post] self | UseUseExplosion.rb:20:497:20:501 | self | | UseUseExplosion.rb:20:476:20:480 | [post] self | UseUseExplosion.rb:20:3339:20:3344 | self | | UseUseExplosion.rb:20:476:20:480 | self | UseUseExplosion.rb:20:497:20:501 | self | | UseUseExplosion.rb:20:476:20:480 | self | UseUseExplosion.rb:20:3339:20:3344 | self | -| UseUseExplosion.rb:20:476:20:485 | ... > ... | UseUseExplosion.rb:20:475:20:486 | [false] ( ... ) | -| UseUseExplosion.rb:20:476:20:485 | ... > ... | UseUseExplosion.rb:20:475:20:486 | [true] ( ... ) | +| UseUseExplosion.rb:20:476:20:485 | ... > ... | UseUseExplosion.rb:20:475:20:486 | ( ... ) | | UseUseExplosion.rb:20:488:20:3332 | then ... | UseUseExplosion.rb:20:472:20:3348 | if ... | | UseUseExplosion.rb:20:493:20:3332 | if ... | UseUseExplosion.rb:20:488:20:3332 | then ... | | UseUseExplosion.rb:20:497:20:501 | [post] self | UseUseExplosion.rb:20:518:20:522 | self | | UseUseExplosion.rb:20:497:20:501 | [post] self | UseUseExplosion.rb:20:3323:20:3328 | self | | UseUseExplosion.rb:20:497:20:501 | self | UseUseExplosion.rb:20:518:20:522 | self | | UseUseExplosion.rb:20:497:20:501 | self | UseUseExplosion.rb:20:3323:20:3328 | self | -| UseUseExplosion.rb:20:497:20:506 | ... > ... | UseUseExplosion.rb:20:496:20:507 | [false] ( ... ) | -| UseUseExplosion.rb:20:497:20:506 | ... > ... | UseUseExplosion.rb:20:496:20:507 | [true] ( ... ) | +| UseUseExplosion.rb:20:497:20:506 | ... > ... | UseUseExplosion.rb:20:496:20:507 | ( ... ) | | UseUseExplosion.rb:20:509:20:3316 | then ... | UseUseExplosion.rb:20:493:20:3332 | if ... | | UseUseExplosion.rb:20:514:20:3316 | if ... | UseUseExplosion.rb:20:509:20:3316 | then ... | | UseUseExplosion.rb:20:518:20:522 | [post] self | UseUseExplosion.rb:20:539:20:543 | self | | UseUseExplosion.rb:20:518:20:522 | [post] self | UseUseExplosion.rb:20:3307:20:3312 | self | | UseUseExplosion.rb:20:518:20:522 | self | UseUseExplosion.rb:20:539:20:543 | self | | UseUseExplosion.rb:20:518:20:522 | self | UseUseExplosion.rb:20:3307:20:3312 | self | -| UseUseExplosion.rb:20:518:20:527 | ... > ... | UseUseExplosion.rb:20:517:20:528 | [false] ( ... ) | -| UseUseExplosion.rb:20:518:20:527 | ... > ... | UseUseExplosion.rb:20:517:20:528 | [true] ( ... ) | +| UseUseExplosion.rb:20:518:20:527 | ... > ... | UseUseExplosion.rb:20:517:20:528 | ( ... ) | | UseUseExplosion.rb:20:530:20:3300 | then ... | UseUseExplosion.rb:20:514:20:3316 | if ... | | UseUseExplosion.rb:20:535:20:3300 | if ... | UseUseExplosion.rb:20:530:20:3300 | then ... | | UseUseExplosion.rb:20:539:20:543 | [post] self | UseUseExplosion.rb:20:560:20:564 | self | | UseUseExplosion.rb:20:539:20:543 | [post] self | UseUseExplosion.rb:20:3291:20:3296 | self | | UseUseExplosion.rb:20:539:20:543 | self | UseUseExplosion.rb:20:560:20:564 | self | | UseUseExplosion.rb:20:539:20:543 | self | UseUseExplosion.rb:20:3291:20:3296 | self | -| UseUseExplosion.rb:20:539:20:548 | ... > ... | UseUseExplosion.rb:20:538:20:549 | [false] ( ... ) | -| UseUseExplosion.rb:20:539:20:548 | ... > ... | UseUseExplosion.rb:20:538:20:549 | [true] ( ... ) | +| UseUseExplosion.rb:20:539:20:548 | ... > ... | UseUseExplosion.rb:20:538:20:549 | ( ... ) | | UseUseExplosion.rb:20:551:20:3284 | then ... | UseUseExplosion.rb:20:535:20:3300 | if ... | | UseUseExplosion.rb:20:556:20:3284 | if ... | UseUseExplosion.rb:20:551:20:3284 | then ... | | UseUseExplosion.rb:20:560:20:564 | [post] self | UseUseExplosion.rb:20:581:20:585 | self | | UseUseExplosion.rb:20:560:20:564 | [post] self | UseUseExplosion.rb:20:3275:20:3280 | self | | UseUseExplosion.rb:20:560:20:564 | self | UseUseExplosion.rb:20:581:20:585 | self | | UseUseExplosion.rb:20:560:20:564 | self | UseUseExplosion.rb:20:3275:20:3280 | self | -| UseUseExplosion.rb:20:560:20:569 | ... > ... | UseUseExplosion.rb:20:559:20:570 | [false] ( ... ) | -| UseUseExplosion.rb:20:560:20:569 | ... > ... | UseUseExplosion.rb:20:559:20:570 | [true] ( ... ) | +| UseUseExplosion.rb:20:560:20:569 | ... > ... | UseUseExplosion.rb:20:559:20:570 | ( ... ) | | UseUseExplosion.rb:20:572:20:3268 | then ... | UseUseExplosion.rb:20:556:20:3284 | if ... | | UseUseExplosion.rb:20:577:20:3268 | if ... | UseUseExplosion.rb:20:572:20:3268 | then ... | | UseUseExplosion.rb:20:581:20:585 | [post] self | UseUseExplosion.rb:20:602:20:606 | self | | UseUseExplosion.rb:20:581:20:585 | [post] self | UseUseExplosion.rb:20:3259:20:3264 | self | | UseUseExplosion.rb:20:581:20:585 | self | UseUseExplosion.rb:20:602:20:606 | self | | UseUseExplosion.rb:20:581:20:585 | self | UseUseExplosion.rb:20:3259:20:3264 | self | -| UseUseExplosion.rb:20:581:20:590 | ... > ... | UseUseExplosion.rb:20:580:20:591 | [false] ( ... ) | -| UseUseExplosion.rb:20:581:20:590 | ... > ... | UseUseExplosion.rb:20:580:20:591 | [true] ( ... ) | +| UseUseExplosion.rb:20:581:20:590 | ... > ... | UseUseExplosion.rb:20:580:20:591 | ( ... ) | | UseUseExplosion.rb:20:593:20:3252 | then ... | UseUseExplosion.rb:20:577:20:3268 | if ... | | UseUseExplosion.rb:20:598:20:3252 | if ... | UseUseExplosion.rb:20:593:20:3252 | then ... | | UseUseExplosion.rb:20:602:20:606 | [post] self | UseUseExplosion.rb:20:623:20:627 | self | | UseUseExplosion.rb:20:602:20:606 | [post] self | UseUseExplosion.rb:20:3243:20:3248 | self | | UseUseExplosion.rb:20:602:20:606 | self | UseUseExplosion.rb:20:623:20:627 | self | | UseUseExplosion.rb:20:602:20:606 | self | UseUseExplosion.rb:20:3243:20:3248 | self | -| UseUseExplosion.rb:20:602:20:611 | ... > ... | UseUseExplosion.rb:20:601:20:612 | [false] ( ... ) | -| UseUseExplosion.rb:20:602:20:611 | ... > ... | UseUseExplosion.rb:20:601:20:612 | [true] ( ... ) | +| UseUseExplosion.rb:20:602:20:611 | ... > ... | UseUseExplosion.rb:20:601:20:612 | ( ... ) | | UseUseExplosion.rb:20:614:20:3236 | then ... | UseUseExplosion.rb:20:598:20:3252 | if ... | | UseUseExplosion.rb:20:619:20:3236 | if ... | UseUseExplosion.rb:20:614:20:3236 | then ... | | UseUseExplosion.rb:20:623:20:627 | [post] self | UseUseExplosion.rb:20:644:20:648 | self | | UseUseExplosion.rb:20:623:20:627 | [post] self | UseUseExplosion.rb:20:3227:20:3232 | self | | UseUseExplosion.rb:20:623:20:627 | self | UseUseExplosion.rb:20:644:20:648 | self | | UseUseExplosion.rb:20:623:20:627 | self | UseUseExplosion.rb:20:3227:20:3232 | self | -| UseUseExplosion.rb:20:623:20:632 | ... > ... | UseUseExplosion.rb:20:622:20:633 | [false] ( ... ) | -| UseUseExplosion.rb:20:623:20:632 | ... > ... | UseUseExplosion.rb:20:622:20:633 | [true] ( ... ) | +| UseUseExplosion.rb:20:623:20:632 | ... > ... | UseUseExplosion.rb:20:622:20:633 | ( ... ) | | UseUseExplosion.rb:20:635:20:3220 | then ... | UseUseExplosion.rb:20:619:20:3236 | if ... | | UseUseExplosion.rb:20:640:20:3220 | if ... | UseUseExplosion.rb:20:635:20:3220 | then ... | | UseUseExplosion.rb:20:644:20:648 | [post] self | UseUseExplosion.rb:20:665:20:669 | self | | UseUseExplosion.rb:20:644:20:648 | [post] self | UseUseExplosion.rb:20:3211:20:3216 | self | | UseUseExplosion.rb:20:644:20:648 | self | UseUseExplosion.rb:20:665:20:669 | self | | UseUseExplosion.rb:20:644:20:648 | self | UseUseExplosion.rb:20:3211:20:3216 | self | -| UseUseExplosion.rb:20:644:20:653 | ... > ... | UseUseExplosion.rb:20:643:20:654 | [false] ( ... ) | -| UseUseExplosion.rb:20:644:20:653 | ... > ... | UseUseExplosion.rb:20:643:20:654 | [true] ( ... ) | +| UseUseExplosion.rb:20:644:20:653 | ... > ... | UseUseExplosion.rb:20:643:20:654 | ( ... ) | | UseUseExplosion.rb:20:656:20:3204 | then ... | UseUseExplosion.rb:20:640:20:3220 | if ... | | UseUseExplosion.rb:20:661:20:3204 | if ... | UseUseExplosion.rb:20:656:20:3204 | then ... | | UseUseExplosion.rb:20:665:20:669 | [post] self | UseUseExplosion.rb:20:686:20:690 | self | | UseUseExplosion.rb:20:665:20:669 | [post] self | UseUseExplosion.rb:20:3195:20:3200 | self | | UseUseExplosion.rb:20:665:20:669 | self | UseUseExplosion.rb:20:686:20:690 | self | | UseUseExplosion.rb:20:665:20:669 | self | UseUseExplosion.rb:20:3195:20:3200 | self | -| UseUseExplosion.rb:20:665:20:674 | ... > ... | UseUseExplosion.rb:20:664:20:675 | [false] ( ... ) | -| UseUseExplosion.rb:20:665:20:674 | ... > ... | UseUseExplosion.rb:20:664:20:675 | [true] ( ... ) | +| UseUseExplosion.rb:20:665:20:674 | ... > ... | UseUseExplosion.rb:20:664:20:675 | ( ... ) | | UseUseExplosion.rb:20:677:20:3188 | then ... | UseUseExplosion.rb:20:661:20:3204 | if ... | | UseUseExplosion.rb:20:682:20:3188 | if ... | UseUseExplosion.rb:20:677:20:3188 | then ... | | UseUseExplosion.rb:20:686:20:690 | [post] self | UseUseExplosion.rb:20:707:20:711 | self | | UseUseExplosion.rb:20:686:20:690 | [post] self | UseUseExplosion.rb:20:3179:20:3184 | self | | UseUseExplosion.rb:20:686:20:690 | self | UseUseExplosion.rb:20:707:20:711 | self | | UseUseExplosion.rb:20:686:20:690 | self | UseUseExplosion.rb:20:3179:20:3184 | self | -| UseUseExplosion.rb:20:686:20:695 | ... > ... | UseUseExplosion.rb:20:685:20:696 | [false] ( ... ) | -| UseUseExplosion.rb:20:686:20:695 | ... > ... | UseUseExplosion.rb:20:685:20:696 | [true] ( ... ) | +| UseUseExplosion.rb:20:686:20:695 | ... > ... | UseUseExplosion.rb:20:685:20:696 | ( ... ) | | UseUseExplosion.rb:20:698:20:3172 | then ... | UseUseExplosion.rb:20:682:20:3188 | if ... | | UseUseExplosion.rb:20:703:20:3172 | if ... | UseUseExplosion.rb:20:698:20:3172 | then ... | | UseUseExplosion.rb:20:707:20:711 | [post] self | UseUseExplosion.rb:20:728:20:732 | self | | UseUseExplosion.rb:20:707:20:711 | [post] self | UseUseExplosion.rb:20:3163:20:3168 | self | | UseUseExplosion.rb:20:707:20:711 | self | UseUseExplosion.rb:20:728:20:732 | self | | UseUseExplosion.rb:20:707:20:711 | self | UseUseExplosion.rb:20:3163:20:3168 | self | -| UseUseExplosion.rb:20:707:20:716 | ... > ... | UseUseExplosion.rb:20:706:20:717 | [false] ( ... ) | -| UseUseExplosion.rb:20:707:20:716 | ... > ... | UseUseExplosion.rb:20:706:20:717 | [true] ( ... ) | +| UseUseExplosion.rb:20:707:20:716 | ... > ... | UseUseExplosion.rb:20:706:20:717 | ( ... ) | | UseUseExplosion.rb:20:719:20:3156 | then ... | UseUseExplosion.rb:20:703:20:3172 | if ... | | UseUseExplosion.rb:20:724:20:3156 | if ... | UseUseExplosion.rb:20:719:20:3156 | then ... | | UseUseExplosion.rb:20:728:20:732 | [post] self | UseUseExplosion.rb:20:749:20:753 | self | | UseUseExplosion.rb:20:728:20:732 | [post] self | UseUseExplosion.rb:20:3147:20:3152 | self | | UseUseExplosion.rb:20:728:20:732 | self | UseUseExplosion.rb:20:749:20:753 | self | | UseUseExplosion.rb:20:728:20:732 | self | UseUseExplosion.rb:20:3147:20:3152 | self | -| UseUseExplosion.rb:20:728:20:737 | ... > ... | UseUseExplosion.rb:20:727:20:738 | [false] ( ... ) | -| UseUseExplosion.rb:20:728:20:737 | ... > ... | UseUseExplosion.rb:20:727:20:738 | [true] ( ... ) | +| UseUseExplosion.rb:20:728:20:737 | ... > ... | UseUseExplosion.rb:20:727:20:738 | ( ... ) | | UseUseExplosion.rb:20:740:20:3140 | then ... | UseUseExplosion.rb:20:724:20:3156 | if ... | | UseUseExplosion.rb:20:745:20:3140 | if ... | UseUseExplosion.rb:20:740:20:3140 | then ... | | UseUseExplosion.rb:20:749:20:753 | [post] self | UseUseExplosion.rb:20:770:20:774 | self | | UseUseExplosion.rb:20:749:20:753 | [post] self | UseUseExplosion.rb:20:3131:20:3136 | self | | UseUseExplosion.rb:20:749:20:753 | self | UseUseExplosion.rb:20:770:20:774 | self | | UseUseExplosion.rb:20:749:20:753 | self | UseUseExplosion.rb:20:3131:20:3136 | self | -| UseUseExplosion.rb:20:749:20:758 | ... > ... | UseUseExplosion.rb:20:748:20:759 | [false] ( ... ) | -| UseUseExplosion.rb:20:749:20:758 | ... > ... | UseUseExplosion.rb:20:748:20:759 | [true] ( ... ) | +| UseUseExplosion.rb:20:749:20:758 | ... > ... | UseUseExplosion.rb:20:748:20:759 | ( ... ) | | UseUseExplosion.rb:20:761:20:3124 | then ... | UseUseExplosion.rb:20:745:20:3140 | if ... | | UseUseExplosion.rb:20:766:20:3124 | if ... | UseUseExplosion.rb:20:761:20:3124 | then ... | | UseUseExplosion.rb:20:770:20:774 | [post] self | UseUseExplosion.rb:20:791:20:795 | self | | UseUseExplosion.rb:20:770:20:774 | [post] self | UseUseExplosion.rb:20:3115:20:3120 | self | | UseUseExplosion.rb:20:770:20:774 | self | UseUseExplosion.rb:20:791:20:795 | self | | UseUseExplosion.rb:20:770:20:774 | self | UseUseExplosion.rb:20:3115:20:3120 | self | -| UseUseExplosion.rb:20:770:20:779 | ... > ... | UseUseExplosion.rb:20:769:20:780 | [false] ( ... ) | -| UseUseExplosion.rb:20:770:20:779 | ... > ... | UseUseExplosion.rb:20:769:20:780 | [true] ( ... ) | +| UseUseExplosion.rb:20:770:20:779 | ... > ... | UseUseExplosion.rb:20:769:20:780 | ( ... ) | | UseUseExplosion.rb:20:782:20:3108 | then ... | UseUseExplosion.rb:20:766:20:3124 | if ... | | UseUseExplosion.rb:20:787:20:3108 | if ... | UseUseExplosion.rb:20:782:20:3108 | then ... | | UseUseExplosion.rb:20:791:20:795 | [post] self | UseUseExplosion.rb:20:812:20:816 | self | | UseUseExplosion.rb:20:791:20:795 | [post] self | UseUseExplosion.rb:20:3099:20:3104 | self | | UseUseExplosion.rb:20:791:20:795 | self | UseUseExplosion.rb:20:812:20:816 | self | | UseUseExplosion.rb:20:791:20:795 | self | UseUseExplosion.rb:20:3099:20:3104 | self | -| UseUseExplosion.rb:20:791:20:800 | ... > ... | UseUseExplosion.rb:20:790:20:801 | [false] ( ... ) | -| UseUseExplosion.rb:20:791:20:800 | ... > ... | UseUseExplosion.rb:20:790:20:801 | [true] ( ... ) | +| UseUseExplosion.rb:20:791:20:800 | ... > ... | UseUseExplosion.rb:20:790:20:801 | ( ... ) | | UseUseExplosion.rb:20:803:20:3092 | then ... | UseUseExplosion.rb:20:787:20:3108 | if ... | | UseUseExplosion.rb:20:808:20:3092 | if ... | UseUseExplosion.rb:20:803:20:3092 | then ... | | UseUseExplosion.rb:20:812:20:816 | [post] self | UseUseExplosion.rb:20:833:20:837 | self | | UseUseExplosion.rb:20:812:20:816 | [post] self | UseUseExplosion.rb:20:3083:20:3088 | self | | UseUseExplosion.rb:20:812:20:816 | self | UseUseExplosion.rb:20:833:20:837 | self | | UseUseExplosion.rb:20:812:20:816 | self | UseUseExplosion.rb:20:3083:20:3088 | self | -| UseUseExplosion.rb:20:812:20:821 | ... > ... | UseUseExplosion.rb:20:811:20:822 | [false] ( ... ) | -| UseUseExplosion.rb:20:812:20:821 | ... > ... | UseUseExplosion.rb:20:811:20:822 | [true] ( ... ) | +| UseUseExplosion.rb:20:812:20:821 | ... > ... | UseUseExplosion.rb:20:811:20:822 | ( ... ) | | UseUseExplosion.rb:20:824:20:3076 | then ... | UseUseExplosion.rb:20:808:20:3092 | if ... | | UseUseExplosion.rb:20:829:20:3076 | if ... | UseUseExplosion.rb:20:824:20:3076 | then ... | | UseUseExplosion.rb:20:833:20:837 | [post] self | UseUseExplosion.rb:20:854:20:858 | self | | UseUseExplosion.rb:20:833:20:837 | [post] self | UseUseExplosion.rb:20:3067:20:3072 | self | | UseUseExplosion.rb:20:833:20:837 | self | UseUseExplosion.rb:20:854:20:858 | self | | UseUseExplosion.rb:20:833:20:837 | self | UseUseExplosion.rb:20:3067:20:3072 | self | -| UseUseExplosion.rb:20:833:20:842 | ... > ... | UseUseExplosion.rb:20:832:20:843 | [false] ( ... ) | -| UseUseExplosion.rb:20:833:20:842 | ... > ... | UseUseExplosion.rb:20:832:20:843 | [true] ( ... ) | +| UseUseExplosion.rb:20:833:20:842 | ... > ... | UseUseExplosion.rb:20:832:20:843 | ( ... ) | | UseUseExplosion.rb:20:845:20:3060 | then ... | UseUseExplosion.rb:20:829:20:3076 | if ... | | UseUseExplosion.rb:20:850:20:3060 | if ... | UseUseExplosion.rb:20:845:20:3060 | then ... | | UseUseExplosion.rb:20:854:20:858 | [post] self | UseUseExplosion.rb:20:875:20:879 | self | | UseUseExplosion.rb:20:854:20:858 | [post] self | UseUseExplosion.rb:20:3051:20:3056 | self | | UseUseExplosion.rb:20:854:20:858 | self | UseUseExplosion.rb:20:875:20:879 | self | | UseUseExplosion.rb:20:854:20:858 | self | UseUseExplosion.rb:20:3051:20:3056 | self | -| UseUseExplosion.rb:20:854:20:863 | ... > ... | UseUseExplosion.rb:20:853:20:864 | [false] ( ... ) | -| UseUseExplosion.rb:20:854:20:863 | ... > ... | UseUseExplosion.rb:20:853:20:864 | [true] ( ... ) | +| UseUseExplosion.rb:20:854:20:863 | ... > ... | UseUseExplosion.rb:20:853:20:864 | ( ... ) | | UseUseExplosion.rb:20:866:20:3044 | then ... | UseUseExplosion.rb:20:850:20:3060 | if ... | | UseUseExplosion.rb:20:871:20:3044 | if ... | UseUseExplosion.rb:20:866:20:3044 | then ... | | UseUseExplosion.rb:20:875:20:879 | [post] self | UseUseExplosion.rb:20:896:20:900 | self | | UseUseExplosion.rb:20:875:20:879 | [post] self | UseUseExplosion.rb:20:3035:20:3040 | self | | UseUseExplosion.rb:20:875:20:879 | self | UseUseExplosion.rb:20:896:20:900 | self | | UseUseExplosion.rb:20:875:20:879 | self | UseUseExplosion.rb:20:3035:20:3040 | self | -| UseUseExplosion.rb:20:875:20:884 | ... > ... | UseUseExplosion.rb:20:874:20:885 | [false] ( ... ) | -| UseUseExplosion.rb:20:875:20:884 | ... > ... | UseUseExplosion.rb:20:874:20:885 | [true] ( ... ) | +| UseUseExplosion.rb:20:875:20:884 | ... > ... | UseUseExplosion.rb:20:874:20:885 | ( ... ) | | UseUseExplosion.rb:20:887:20:3028 | then ... | UseUseExplosion.rb:20:871:20:3044 | if ... | | UseUseExplosion.rb:20:892:20:3028 | if ... | UseUseExplosion.rb:20:887:20:3028 | then ... | | UseUseExplosion.rb:20:896:20:900 | [post] self | UseUseExplosion.rb:20:917:20:921 | self | | UseUseExplosion.rb:20:896:20:900 | [post] self | UseUseExplosion.rb:20:3019:20:3024 | self | | UseUseExplosion.rb:20:896:20:900 | self | UseUseExplosion.rb:20:917:20:921 | self | | UseUseExplosion.rb:20:896:20:900 | self | UseUseExplosion.rb:20:3019:20:3024 | self | -| UseUseExplosion.rb:20:896:20:905 | ... > ... | UseUseExplosion.rb:20:895:20:906 | [false] ( ... ) | -| UseUseExplosion.rb:20:896:20:905 | ... > ... | UseUseExplosion.rb:20:895:20:906 | [true] ( ... ) | +| UseUseExplosion.rb:20:896:20:905 | ... > ... | UseUseExplosion.rb:20:895:20:906 | ( ... ) | | UseUseExplosion.rb:20:908:20:3012 | then ... | UseUseExplosion.rb:20:892:20:3028 | if ... | | UseUseExplosion.rb:20:913:20:3012 | if ... | UseUseExplosion.rb:20:908:20:3012 | then ... | | UseUseExplosion.rb:20:917:20:921 | [post] self | UseUseExplosion.rb:20:938:20:942 | self | | UseUseExplosion.rb:20:917:20:921 | [post] self | UseUseExplosion.rb:20:3003:20:3008 | self | | UseUseExplosion.rb:20:917:20:921 | self | UseUseExplosion.rb:20:938:20:942 | self | | UseUseExplosion.rb:20:917:20:921 | self | UseUseExplosion.rb:20:3003:20:3008 | self | -| UseUseExplosion.rb:20:917:20:926 | ... > ... | UseUseExplosion.rb:20:916:20:927 | [false] ( ... ) | -| UseUseExplosion.rb:20:917:20:926 | ... > ... | UseUseExplosion.rb:20:916:20:927 | [true] ( ... ) | +| UseUseExplosion.rb:20:917:20:926 | ... > ... | UseUseExplosion.rb:20:916:20:927 | ( ... ) | | UseUseExplosion.rb:20:929:20:2996 | then ... | UseUseExplosion.rb:20:913:20:3012 | if ... | | UseUseExplosion.rb:20:934:20:2996 | if ... | UseUseExplosion.rb:20:929:20:2996 | then ... | | UseUseExplosion.rb:20:938:20:942 | [post] self | UseUseExplosion.rb:20:959:20:963 | self | | UseUseExplosion.rb:20:938:20:942 | [post] self | UseUseExplosion.rb:20:2987:20:2992 | self | | UseUseExplosion.rb:20:938:20:942 | self | UseUseExplosion.rb:20:959:20:963 | self | | UseUseExplosion.rb:20:938:20:942 | self | UseUseExplosion.rb:20:2987:20:2992 | self | -| UseUseExplosion.rb:20:938:20:947 | ... > ... | UseUseExplosion.rb:20:937:20:948 | [false] ( ... ) | -| UseUseExplosion.rb:20:938:20:947 | ... > ... | UseUseExplosion.rb:20:937:20:948 | [true] ( ... ) | +| UseUseExplosion.rb:20:938:20:947 | ... > ... | UseUseExplosion.rb:20:937:20:948 | ( ... ) | | UseUseExplosion.rb:20:950:20:2980 | then ... | UseUseExplosion.rb:20:934:20:2996 | if ... | | UseUseExplosion.rb:20:955:20:2980 | if ... | UseUseExplosion.rb:20:950:20:2980 | then ... | | UseUseExplosion.rb:20:959:20:963 | [post] self | UseUseExplosion.rb:20:980:20:984 | self | | UseUseExplosion.rb:20:959:20:963 | [post] self | UseUseExplosion.rb:20:2971:20:2976 | self | | UseUseExplosion.rb:20:959:20:963 | self | UseUseExplosion.rb:20:980:20:984 | self | | UseUseExplosion.rb:20:959:20:963 | self | UseUseExplosion.rb:20:2971:20:2976 | self | -| UseUseExplosion.rb:20:959:20:968 | ... > ... | UseUseExplosion.rb:20:958:20:969 | [false] ( ... ) | -| UseUseExplosion.rb:20:959:20:968 | ... > ... | UseUseExplosion.rb:20:958:20:969 | [true] ( ... ) | +| UseUseExplosion.rb:20:959:20:968 | ... > ... | UseUseExplosion.rb:20:958:20:969 | ( ... ) | | UseUseExplosion.rb:20:971:20:2964 | then ... | UseUseExplosion.rb:20:955:20:2980 | if ... | | UseUseExplosion.rb:20:976:20:2964 | if ... | UseUseExplosion.rb:20:971:20:2964 | then ... | | UseUseExplosion.rb:20:980:20:984 | [post] self | UseUseExplosion.rb:20:1001:20:1005 | self | | UseUseExplosion.rb:20:980:20:984 | [post] self | UseUseExplosion.rb:20:2955:20:2960 | self | | UseUseExplosion.rb:20:980:20:984 | self | UseUseExplosion.rb:20:1001:20:1005 | self | | UseUseExplosion.rb:20:980:20:984 | self | UseUseExplosion.rb:20:2955:20:2960 | self | -| UseUseExplosion.rb:20:980:20:989 | ... > ... | UseUseExplosion.rb:20:979:20:990 | [false] ( ... ) | -| UseUseExplosion.rb:20:980:20:989 | ... > ... | UseUseExplosion.rb:20:979:20:990 | [true] ( ... ) | +| UseUseExplosion.rb:20:980:20:989 | ... > ... | UseUseExplosion.rb:20:979:20:990 | ( ... ) | | UseUseExplosion.rb:20:992:20:2948 | then ... | UseUseExplosion.rb:20:976:20:2964 | if ... | | UseUseExplosion.rb:20:997:20:2948 | if ... | UseUseExplosion.rb:20:992:20:2948 | then ... | | UseUseExplosion.rb:20:1001:20:1005 | [post] self | UseUseExplosion.rb:20:1022:20:1026 | self | | UseUseExplosion.rb:20:1001:20:1005 | [post] self | UseUseExplosion.rb:20:2939:20:2944 | self | | UseUseExplosion.rb:20:1001:20:1005 | self | UseUseExplosion.rb:20:1022:20:1026 | self | | UseUseExplosion.rb:20:1001:20:1005 | self | UseUseExplosion.rb:20:2939:20:2944 | self | -| UseUseExplosion.rb:20:1001:20:1010 | ... > ... | UseUseExplosion.rb:20:1000:20:1011 | [false] ( ... ) | -| UseUseExplosion.rb:20:1001:20:1010 | ... > ... | UseUseExplosion.rb:20:1000:20:1011 | [true] ( ... ) | +| UseUseExplosion.rb:20:1001:20:1010 | ... > ... | UseUseExplosion.rb:20:1000:20:1011 | ( ... ) | | UseUseExplosion.rb:20:1013:20:2932 | then ... | UseUseExplosion.rb:20:997:20:2948 | if ... | | UseUseExplosion.rb:20:1018:20:2932 | if ... | UseUseExplosion.rb:20:1013:20:2932 | then ... | | UseUseExplosion.rb:20:1022:20:1026 | [post] self | UseUseExplosion.rb:20:1043:20:1047 | self | | UseUseExplosion.rb:20:1022:20:1026 | [post] self | UseUseExplosion.rb:20:2923:20:2928 | self | | UseUseExplosion.rb:20:1022:20:1026 | self | UseUseExplosion.rb:20:1043:20:1047 | self | | UseUseExplosion.rb:20:1022:20:1026 | self | UseUseExplosion.rb:20:2923:20:2928 | self | -| UseUseExplosion.rb:20:1022:20:1031 | ... > ... | UseUseExplosion.rb:20:1021:20:1032 | [false] ( ... ) | -| UseUseExplosion.rb:20:1022:20:1031 | ... > ... | UseUseExplosion.rb:20:1021:20:1032 | [true] ( ... ) | +| UseUseExplosion.rb:20:1022:20:1031 | ... > ... | UseUseExplosion.rb:20:1021:20:1032 | ( ... ) | | UseUseExplosion.rb:20:1034:20:2916 | then ... | UseUseExplosion.rb:20:1018:20:2932 | if ... | | UseUseExplosion.rb:20:1039:20:2916 | if ... | UseUseExplosion.rb:20:1034:20:2916 | then ... | | UseUseExplosion.rb:20:1043:20:1047 | [post] self | UseUseExplosion.rb:20:1064:20:1068 | self | | UseUseExplosion.rb:20:1043:20:1047 | [post] self | UseUseExplosion.rb:20:2907:20:2912 | self | | UseUseExplosion.rb:20:1043:20:1047 | self | UseUseExplosion.rb:20:1064:20:1068 | self | | UseUseExplosion.rb:20:1043:20:1047 | self | UseUseExplosion.rb:20:2907:20:2912 | self | -| UseUseExplosion.rb:20:1043:20:1052 | ... > ... | UseUseExplosion.rb:20:1042:20:1053 | [false] ( ... ) | -| UseUseExplosion.rb:20:1043:20:1052 | ... > ... | UseUseExplosion.rb:20:1042:20:1053 | [true] ( ... ) | +| UseUseExplosion.rb:20:1043:20:1052 | ... > ... | UseUseExplosion.rb:20:1042:20:1053 | ( ... ) | | UseUseExplosion.rb:20:1055:20:2900 | then ... | UseUseExplosion.rb:20:1039:20:2916 | if ... | | UseUseExplosion.rb:20:1060:20:2900 | if ... | UseUseExplosion.rb:20:1055:20:2900 | then ... | | UseUseExplosion.rb:20:1064:20:1068 | [post] self | UseUseExplosion.rb:20:1085:20:1089 | self | | UseUseExplosion.rb:20:1064:20:1068 | [post] self | UseUseExplosion.rb:20:2891:20:2896 | self | | UseUseExplosion.rb:20:1064:20:1068 | self | UseUseExplosion.rb:20:1085:20:1089 | self | | UseUseExplosion.rb:20:1064:20:1068 | self | UseUseExplosion.rb:20:2891:20:2896 | self | -| UseUseExplosion.rb:20:1064:20:1073 | ... > ... | UseUseExplosion.rb:20:1063:20:1074 | [false] ( ... ) | -| UseUseExplosion.rb:20:1064:20:1073 | ... > ... | UseUseExplosion.rb:20:1063:20:1074 | [true] ( ... ) | +| UseUseExplosion.rb:20:1064:20:1073 | ... > ... | UseUseExplosion.rb:20:1063:20:1074 | ( ... ) | | UseUseExplosion.rb:20:1076:20:2884 | then ... | UseUseExplosion.rb:20:1060:20:2900 | if ... | | UseUseExplosion.rb:20:1081:20:2884 | if ... | UseUseExplosion.rb:20:1076:20:2884 | then ... | | UseUseExplosion.rb:20:1085:20:1089 | [post] self | UseUseExplosion.rb:20:1106:20:1110 | self | | UseUseExplosion.rb:20:1085:20:1089 | [post] self | UseUseExplosion.rb:20:2875:20:2880 | self | | UseUseExplosion.rb:20:1085:20:1089 | self | UseUseExplosion.rb:20:1106:20:1110 | self | | UseUseExplosion.rb:20:1085:20:1089 | self | UseUseExplosion.rb:20:2875:20:2880 | self | -| UseUseExplosion.rb:20:1085:20:1094 | ... > ... | UseUseExplosion.rb:20:1084:20:1095 | [false] ( ... ) | -| UseUseExplosion.rb:20:1085:20:1094 | ... > ... | UseUseExplosion.rb:20:1084:20:1095 | [true] ( ... ) | +| UseUseExplosion.rb:20:1085:20:1094 | ... > ... | UseUseExplosion.rb:20:1084:20:1095 | ( ... ) | | UseUseExplosion.rb:20:1097:20:2868 | then ... | UseUseExplosion.rb:20:1081:20:2884 | if ... | | UseUseExplosion.rb:20:1102:20:2868 | if ... | UseUseExplosion.rb:20:1097:20:2868 | then ... | | UseUseExplosion.rb:20:1106:20:1110 | [post] self | UseUseExplosion.rb:20:1127:20:1131 | self | | UseUseExplosion.rb:20:1106:20:1110 | [post] self | UseUseExplosion.rb:20:2859:20:2864 | self | | UseUseExplosion.rb:20:1106:20:1110 | self | UseUseExplosion.rb:20:1127:20:1131 | self | | UseUseExplosion.rb:20:1106:20:1110 | self | UseUseExplosion.rb:20:2859:20:2864 | self | -| UseUseExplosion.rb:20:1106:20:1115 | ... > ... | UseUseExplosion.rb:20:1105:20:1116 | [false] ( ... ) | -| UseUseExplosion.rb:20:1106:20:1115 | ... > ... | UseUseExplosion.rb:20:1105:20:1116 | [true] ( ... ) | +| UseUseExplosion.rb:20:1106:20:1115 | ... > ... | UseUseExplosion.rb:20:1105:20:1116 | ( ... ) | | UseUseExplosion.rb:20:1118:20:2852 | then ... | UseUseExplosion.rb:20:1102:20:2868 | if ... | | UseUseExplosion.rb:20:1123:20:2852 | if ... | UseUseExplosion.rb:20:1118:20:2852 | then ... | | UseUseExplosion.rb:20:1127:20:1131 | [post] self | UseUseExplosion.rb:20:1148:20:1152 | self | | UseUseExplosion.rb:20:1127:20:1131 | [post] self | UseUseExplosion.rb:20:2843:20:2848 | self | | UseUseExplosion.rb:20:1127:20:1131 | self | UseUseExplosion.rb:20:1148:20:1152 | self | | UseUseExplosion.rb:20:1127:20:1131 | self | UseUseExplosion.rb:20:2843:20:2848 | self | -| UseUseExplosion.rb:20:1127:20:1136 | ... > ... | UseUseExplosion.rb:20:1126:20:1137 | [false] ( ... ) | -| UseUseExplosion.rb:20:1127:20:1136 | ... > ... | UseUseExplosion.rb:20:1126:20:1137 | [true] ( ... ) | +| UseUseExplosion.rb:20:1127:20:1136 | ... > ... | UseUseExplosion.rb:20:1126:20:1137 | ( ... ) | | UseUseExplosion.rb:20:1139:20:2836 | then ... | UseUseExplosion.rb:20:1123:20:2852 | if ... | | UseUseExplosion.rb:20:1144:20:2836 | if ... | UseUseExplosion.rb:20:1139:20:2836 | then ... | | UseUseExplosion.rb:20:1148:20:1152 | [post] self | UseUseExplosion.rb:20:1169:20:1173 | self | | UseUseExplosion.rb:20:1148:20:1152 | [post] self | UseUseExplosion.rb:20:2827:20:2832 | self | | UseUseExplosion.rb:20:1148:20:1152 | self | UseUseExplosion.rb:20:1169:20:1173 | self | | UseUseExplosion.rb:20:1148:20:1152 | self | UseUseExplosion.rb:20:2827:20:2832 | self | -| UseUseExplosion.rb:20:1148:20:1157 | ... > ... | UseUseExplosion.rb:20:1147:20:1158 | [false] ( ... ) | -| UseUseExplosion.rb:20:1148:20:1157 | ... > ... | UseUseExplosion.rb:20:1147:20:1158 | [true] ( ... ) | +| UseUseExplosion.rb:20:1148:20:1157 | ... > ... | UseUseExplosion.rb:20:1147:20:1158 | ( ... ) | | UseUseExplosion.rb:20:1160:20:2820 | then ... | UseUseExplosion.rb:20:1144:20:2836 | if ... | | UseUseExplosion.rb:20:1165:20:2820 | if ... | UseUseExplosion.rb:20:1160:20:2820 | then ... | | UseUseExplosion.rb:20:1169:20:1173 | [post] self | UseUseExplosion.rb:20:1190:20:1194 | self | | UseUseExplosion.rb:20:1169:20:1173 | [post] self | UseUseExplosion.rb:20:2811:20:2816 | self | | UseUseExplosion.rb:20:1169:20:1173 | self | UseUseExplosion.rb:20:1190:20:1194 | self | | UseUseExplosion.rb:20:1169:20:1173 | self | UseUseExplosion.rb:20:2811:20:2816 | self | -| UseUseExplosion.rb:20:1169:20:1178 | ... > ... | UseUseExplosion.rb:20:1168:20:1179 | [false] ( ... ) | -| UseUseExplosion.rb:20:1169:20:1178 | ... > ... | UseUseExplosion.rb:20:1168:20:1179 | [true] ( ... ) | +| UseUseExplosion.rb:20:1169:20:1178 | ... > ... | UseUseExplosion.rb:20:1168:20:1179 | ( ... ) | | UseUseExplosion.rb:20:1181:20:2804 | then ... | UseUseExplosion.rb:20:1165:20:2820 | if ... | | UseUseExplosion.rb:20:1186:20:2804 | if ... | UseUseExplosion.rb:20:1181:20:2804 | then ... | | UseUseExplosion.rb:20:1190:20:1194 | [post] self | UseUseExplosion.rb:20:1211:20:1215 | self | | UseUseExplosion.rb:20:1190:20:1194 | [post] self | UseUseExplosion.rb:20:2795:20:2800 | self | | UseUseExplosion.rb:20:1190:20:1194 | self | UseUseExplosion.rb:20:1211:20:1215 | self | | UseUseExplosion.rb:20:1190:20:1194 | self | UseUseExplosion.rb:20:2795:20:2800 | self | -| UseUseExplosion.rb:20:1190:20:1199 | ... > ... | UseUseExplosion.rb:20:1189:20:1200 | [false] ( ... ) | -| UseUseExplosion.rb:20:1190:20:1199 | ... > ... | UseUseExplosion.rb:20:1189:20:1200 | [true] ( ... ) | +| UseUseExplosion.rb:20:1190:20:1199 | ... > ... | UseUseExplosion.rb:20:1189:20:1200 | ( ... ) | | UseUseExplosion.rb:20:1202:20:2788 | then ... | UseUseExplosion.rb:20:1186:20:2804 | if ... | | UseUseExplosion.rb:20:1207:20:2788 | if ... | UseUseExplosion.rb:20:1202:20:2788 | then ... | | UseUseExplosion.rb:20:1211:20:1215 | [post] self | UseUseExplosion.rb:20:1232:20:1236 | self | | UseUseExplosion.rb:20:1211:20:1215 | [post] self | UseUseExplosion.rb:20:2779:20:2784 | self | | UseUseExplosion.rb:20:1211:20:1215 | self | UseUseExplosion.rb:20:1232:20:1236 | self | | UseUseExplosion.rb:20:1211:20:1215 | self | UseUseExplosion.rb:20:2779:20:2784 | self | -| UseUseExplosion.rb:20:1211:20:1220 | ... > ... | UseUseExplosion.rb:20:1210:20:1221 | [false] ( ... ) | -| UseUseExplosion.rb:20:1211:20:1220 | ... > ... | UseUseExplosion.rb:20:1210:20:1221 | [true] ( ... ) | +| UseUseExplosion.rb:20:1211:20:1220 | ... > ... | UseUseExplosion.rb:20:1210:20:1221 | ( ... ) | | UseUseExplosion.rb:20:1223:20:2772 | then ... | UseUseExplosion.rb:20:1207:20:2788 | if ... | | UseUseExplosion.rb:20:1228:20:2772 | if ... | UseUseExplosion.rb:20:1223:20:2772 | then ... | | UseUseExplosion.rb:20:1232:20:1236 | [post] self | UseUseExplosion.rb:20:1253:20:1257 | self | | UseUseExplosion.rb:20:1232:20:1236 | [post] self | UseUseExplosion.rb:20:2763:20:2768 | self | | UseUseExplosion.rb:20:1232:20:1236 | self | UseUseExplosion.rb:20:1253:20:1257 | self | | UseUseExplosion.rb:20:1232:20:1236 | self | UseUseExplosion.rb:20:2763:20:2768 | self | -| UseUseExplosion.rb:20:1232:20:1241 | ... > ... | UseUseExplosion.rb:20:1231:20:1242 | [false] ( ... ) | -| UseUseExplosion.rb:20:1232:20:1241 | ... > ... | UseUseExplosion.rb:20:1231:20:1242 | [true] ( ... ) | +| UseUseExplosion.rb:20:1232:20:1241 | ... > ... | UseUseExplosion.rb:20:1231:20:1242 | ( ... ) | | UseUseExplosion.rb:20:1244:20:2756 | then ... | UseUseExplosion.rb:20:1228:20:2772 | if ... | | UseUseExplosion.rb:20:1249:20:2756 | if ... | UseUseExplosion.rb:20:1244:20:2756 | then ... | | UseUseExplosion.rb:20:1253:20:1257 | [post] self | UseUseExplosion.rb:20:1274:20:1278 | self | | UseUseExplosion.rb:20:1253:20:1257 | [post] self | UseUseExplosion.rb:20:2747:20:2752 | self | | UseUseExplosion.rb:20:1253:20:1257 | self | UseUseExplosion.rb:20:1274:20:1278 | self | | UseUseExplosion.rb:20:1253:20:1257 | self | UseUseExplosion.rb:20:2747:20:2752 | self | -| UseUseExplosion.rb:20:1253:20:1262 | ... > ... | UseUseExplosion.rb:20:1252:20:1263 | [false] ( ... ) | -| UseUseExplosion.rb:20:1253:20:1262 | ... > ... | UseUseExplosion.rb:20:1252:20:1263 | [true] ( ... ) | +| UseUseExplosion.rb:20:1253:20:1262 | ... > ... | UseUseExplosion.rb:20:1252:20:1263 | ( ... ) | | UseUseExplosion.rb:20:1265:20:2740 | then ... | UseUseExplosion.rb:20:1249:20:2756 | if ... | | UseUseExplosion.rb:20:1270:20:2740 | if ... | UseUseExplosion.rb:20:1265:20:2740 | then ... | | UseUseExplosion.rb:20:1274:20:1278 | [post] self | UseUseExplosion.rb:20:1295:20:1299 | self | | UseUseExplosion.rb:20:1274:20:1278 | [post] self | UseUseExplosion.rb:20:2731:20:2736 | self | | UseUseExplosion.rb:20:1274:20:1278 | self | UseUseExplosion.rb:20:1295:20:1299 | self | | UseUseExplosion.rb:20:1274:20:1278 | self | UseUseExplosion.rb:20:2731:20:2736 | self | -| UseUseExplosion.rb:20:1274:20:1283 | ... > ... | UseUseExplosion.rb:20:1273:20:1284 | [false] ( ... ) | -| UseUseExplosion.rb:20:1274:20:1283 | ... > ... | UseUseExplosion.rb:20:1273:20:1284 | [true] ( ... ) | +| UseUseExplosion.rb:20:1274:20:1283 | ... > ... | UseUseExplosion.rb:20:1273:20:1284 | ( ... ) | | UseUseExplosion.rb:20:1286:20:2724 | then ... | UseUseExplosion.rb:20:1270:20:2740 | if ... | | UseUseExplosion.rb:20:1291:20:2724 | if ... | UseUseExplosion.rb:20:1286:20:2724 | then ... | | UseUseExplosion.rb:20:1295:20:1299 | [post] self | UseUseExplosion.rb:20:1316:20:1320 | self | | UseUseExplosion.rb:20:1295:20:1299 | [post] self | UseUseExplosion.rb:20:2715:20:2720 | self | | UseUseExplosion.rb:20:1295:20:1299 | self | UseUseExplosion.rb:20:1316:20:1320 | self | | UseUseExplosion.rb:20:1295:20:1299 | self | UseUseExplosion.rb:20:2715:20:2720 | self | -| UseUseExplosion.rb:20:1295:20:1304 | ... > ... | UseUseExplosion.rb:20:1294:20:1305 | [false] ( ... ) | -| UseUseExplosion.rb:20:1295:20:1304 | ... > ... | UseUseExplosion.rb:20:1294:20:1305 | [true] ( ... ) | +| UseUseExplosion.rb:20:1295:20:1304 | ... > ... | UseUseExplosion.rb:20:1294:20:1305 | ( ... ) | | UseUseExplosion.rb:20:1307:20:2708 | then ... | UseUseExplosion.rb:20:1291:20:2724 | if ... | | UseUseExplosion.rb:20:1312:20:2708 | if ... | UseUseExplosion.rb:20:1307:20:2708 | then ... | | UseUseExplosion.rb:20:1316:20:1320 | [post] self | UseUseExplosion.rb:20:1337:20:1341 | self | | UseUseExplosion.rb:20:1316:20:1320 | [post] self | UseUseExplosion.rb:20:2699:20:2704 | self | | UseUseExplosion.rb:20:1316:20:1320 | self | UseUseExplosion.rb:20:1337:20:1341 | self | | UseUseExplosion.rb:20:1316:20:1320 | self | UseUseExplosion.rb:20:2699:20:2704 | self | -| UseUseExplosion.rb:20:1316:20:1325 | ... > ... | UseUseExplosion.rb:20:1315:20:1326 | [false] ( ... ) | -| UseUseExplosion.rb:20:1316:20:1325 | ... > ... | UseUseExplosion.rb:20:1315:20:1326 | [true] ( ... ) | +| UseUseExplosion.rb:20:1316:20:1325 | ... > ... | UseUseExplosion.rb:20:1315:20:1326 | ( ... ) | | UseUseExplosion.rb:20:1328:20:2692 | then ... | UseUseExplosion.rb:20:1312:20:2708 | if ... | | UseUseExplosion.rb:20:1333:20:2692 | if ... | UseUseExplosion.rb:20:1328:20:2692 | then ... | | UseUseExplosion.rb:20:1337:20:1341 | [post] self | UseUseExplosion.rb:20:1358:20:1362 | self | | UseUseExplosion.rb:20:1337:20:1341 | [post] self | UseUseExplosion.rb:20:2683:20:2688 | self | | UseUseExplosion.rb:20:1337:20:1341 | self | UseUseExplosion.rb:20:1358:20:1362 | self | | UseUseExplosion.rb:20:1337:20:1341 | self | UseUseExplosion.rb:20:2683:20:2688 | self | -| UseUseExplosion.rb:20:1337:20:1346 | ... > ... | UseUseExplosion.rb:20:1336:20:1347 | [false] ( ... ) | -| UseUseExplosion.rb:20:1337:20:1346 | ... > ... | UseUseExplosion.rb:20:1336:20:1347 | [true] ( ... ) | +| UseUseExplosion.rb:20:1337:20:1346 | ... > ... | UseUseExplosion.rb:20:1336:20:1347 | ( ... ) | | UseUseExplosion.rb:20:1349:20:2676 | then ... | UseUseExplosion.rb:20:1333:20:2692 | if ... | | UseUseExplosion.rb:20:1354:20:2676 | if ... | UseUseExplosion.rb:20:1349:20:2676 | then ... | | UseUseExplosion.rb:20:1358:20:1362 | [post] self | UseUseExplosion.rb:20:1379:20:1383 | self | | UseUseExplosion.rb:20:1358:20:1362 | [post] self | UseUseExplosion.rb:20:2667:20:2672 | self | | UseUseExplosion.rb:20:1358:20:1362 | self | UseUseExplosion.rb:20:1379:20:1383 | self | | UseUseExplosion.rb:20:1358:20:1362 | self | UseUseExplosion.rb:20:2667:20:2672 | self | -| UseUseExplosion.rb:20:1358:20:1367 | ... > ... | UseUseExplosion.rb:20:1357:20:1368 | [false] ( ... ) | -| UseUseExplosion.rb:20:1358:20:1367 | ... > ... | UseUseExplosion.rb:20:1357:20:1368 | [true] ( ... ) | +| UseUseExplosion.rb:20:1358:20:1367 | ... > ... | UseUseExplosion.rb:20:1357:20:1368 | ( ... ) | | UseUseExplosion.rb:20:1370:20:2660 | then ... | UseUseExplosion.rb:20:1354:20:2676 | if ... | | UseUseExplosion.rb:20:1375:20:2660 | if ... | UseUseExplosion.rb:20:1370:20:2660 | then ... | | UseUseExplosion.rb:20:1379:20:1383 | [post] self | UseUseExplosion.rb:20:1400:20:1404 | self | | UseUseExplosion.rb:20:1379:20:1383 | [post] self | UseUseExplosion.rb:20:2651:20:2656 | self | | UseUseExplosion.rb:20:1379:20:1383 | self | UseUseExplosion.rb:20:1400:20:1404 | self | | UseUseExplosion.rb:20:1379:20:1383 | self | UseUseExplosion.rb:20:2651:20:2656 | self | -| UseUseExplosion.rb:20:1379:20:1388 | ... > ... | UseUseExplosion.rb:20:1378:20:1389 | [false] ( ... ) | -| UseUseExplosion.rb:20:1379:20:1388 | ... > ... | UseUseExplosion.rb:20:1378:20:1389 | [true] ( ... ) | +| UseUseExplosion.rb:20:1379:20:1388 | ... > ... | UseUseExplosion.rb:20:1378:20:1389 | ( ... ) | | UseUseExplosion.rb:20:1391:20:2644 | then ... | UseUseExplosion.rb:20:1375:20:2660 | if ... | | UseUseExplosion.rb:20:1396:20:2644 | if ... | UseUseExplosion.rb:20:1391:20:2644 | then ... | | UseUseExplosion.rb:20:1400:20:1404 | [post] self | UseUseExplosion.rb:20:1421:20:1425 | self | | UseUseExplosion.rb:20:1400:20:1404 | [post] self | UseUseExplosion.rb:20:2635:20:2640 | self | | UseUseExplosion.rb:20:1400:20:1404 | self | UseUseExplosion.rb:20:1421:20:1425 | self | | UseUseExplosion.rb:20:1400:20:1404 | self | UseUseExplosion.rb:20:2635:20:2640 | self | -| UseUseExplosion.rb:20:1400:20:1409 | ... > ... | UseUseExplosion.rb:20:1399:20:1410 | [false] ( ... ) | -| UseUseExplosion.rb:20:1400:20:1409 | ... > ... | UseUseExplosion.rb:20:1399:20:1410 | [true] ( ... ) | +| UseUseExplosion.rb:20:1400:20:1409 | ... > ... | UseUseExplosion.rb:20:1399:20:1410 | ( ... ) | | UseUseExplosion.rb:20:1412:20:2628 | then ... | UseUseExplosion.rb:20:1396:20:2644 | if ... | | UseUseExplosion.rb:20:1417:20:2628 | if ... | UseUseExplosion.rb:20:1412:20:2628 | then ... | | UseUseExplosion.rb:20:1421:20:1425 | [post] self | UseUseExplosion.rb:20:1442:20:1446 | self | | UseUseExplosion.rb:20:1421:20:1425 | [post] self | UseUseExplosion.rb:20:2619:20:2624 | self | | UseUseExplosion.rb:20:1421:20:1425 | self | UseUseExplosion.rb:20:1442:20:1446 | self | | UseUseExplosion.rb:20:1421:20:1425 | self | UseUseExplosion.rb:20:2619:20:2624 | self | -| UseUseExplosion.rb:20:1421:20:1430 | ... > ... | UseUseExplosion.rb:20:1420:20:1431 | [false] ( ... ) | -| UseUseExplosion.rb:20:1421:20:1430 | ... > ... | UseUseExplosion.rb:20:1420:20:1431 | [true] ( ... ) | +| UseUseExplosion.rb:20:1421:20:1430 | ... > ... | UseUseExplosion.rb:20:1420:20:1431 | ( ... ) | | UseUseExplosion.rb:20:1433:20:2612 | then ... | UseUseExplosion.rb:20:1417:20:2628 | if ... | | UseUseExplosion.rb:20:1438:20:2612 | if ... | UseUseExplosion.rb:20:1433:20:2612 | then ... | | UseUseExplosion.rb:20:1442:20:1446 | [post] self | UseUseExplosion.rb:20:1463:20:1467 | self | | UseUseExplosion.rb:20:1442:20:1446 | [post] self | UseUseExplosion.rb:20:2603:20:2608 | self | | UseUseExplosion.rb:20:1442:20:1446 | self | UseUseExplosion.rb:20:1463:20:1467 | self | | UseUseExplosion.rb:20:1442:20:1446 | self | UseUseExplosion.rb:20:2603:20:2608 | self | -| UseUseExplosion.rb:20:1442:20:1451 | ... > ... | UseUseExplosion.rb:20:1441:20:1452 | [false] ( ... ) | -| UseUseExplosion.rb:20:1442:20:1451 | ... > ... | UseUseExplosion.rb:20:1441:20:1452 | [true] ( ... ) | +| UseUseExplosion.rb:20:1442:20:1451 | ... > ... | UseUseExplosion.rb:20:1441:20:1452 | ( ... ) | | UseUseExplosion.rb:20:1454:20:2596 | then ... | UseUseExplosion.rb:20:1438:20:2612 | if ... | | UseUseExplosion.rb:20:1459:20:2596 | if ... | UseUseExplosion.rb:20:1454:20:2596 | then ... | | UseUseExplosion.rb:20:1463:20:1467 | [post] self | UseUseExplosion.rb:20:1484:20:1488 | self | | UseUseExplosion.rb:20:1463:20:1467 | [post] self | UseUseExplosion.rb:20:2587:20:2592 | self | | UseUseExplosion.rb:20:1463:20:1467 | self | UseUseExplosion.rb:20:1484:20:1488 | self | | UseUseExplosion.rb:20:1463:20:1467 | self | UseUseExplosion.rb:20:2587:20:2592 | self | -| UseUseExplosion.rb:20:1463:20:1472 | ... > ... | UseUseExplosion.rb:20:1462:20:1473 | [false] ( ... ) | -| UseUseExplosion.rb:20:1463:20:1472 | ... > ... | UseUseExplosion.rb:20:1462:20:1473 | [true] ( ... ) | +| UseUseExplosion.rb:20:1463:20:1472 | ... > ... | UseUseExplosion.rb:20:1462:20:1473 | ( ... ) | | UseUseExplosion.rb:20:1475:20:2580 | then ... | UseUseExplosion.rb:20:1459:20:2596 | if ... | | UseUseExplosion.rb:20:1480:20:2580 | if ... | UseUseExplosion.rb:20:1475:20:2580 | then ... | | UseUseExplosion.rb:20:1484:20:1488 | [post] self | UseUseExplosion.rb:20:1505:20:1509 | self | | UseUseExplosion.rb:20:1484:20:1488 | [post] self | UseUseExplosion.rb:20:2571:20:2576 | self | | UseUseExplosion.rb:20:1484:20:1488 | self | UseUseExplosion.rb:20:1505:20:1509 | self | | UseUseExplosion.rb:20:1484:20:1488 | self | UseUseExplosion.rb:20:2571:20:2576 | self | -| UseUseExplosion.rb:20:1484:20:1493 | ... > ... | UseUseExplosion.rb:20:1483:20:1494 | [false] ( ... ) | -| UseUseExplosion.rb:20:1484:20:1493 | ... > ... | UseUseExplosion.rb:20:1483:20:1494 | [true] ( ... ) | +| UseUseExplosion.rb:20:1484:20:1493 | ... > ... | UseUseExplosion.rb:20:1483:20:1494 | ( ... ) | | UseUseExplosion.rb:20:1496:20:2564 | then ... | UseUseExplosion.rb:20:1480:20:2580 | if ... | | UseUseExplosion.rb:20:1501:20:2564 | if ... | UseUseExplosion.rb:20:1496:20:2564 | then ... | | UseUseExplosion.rb:20:1505:20:1509 | [post] self | UseUseExplosion.rb:20:1526:20:1530 | self | | UseUseExplosion.rb:20:1505:20:1509 | [post] self | UseUseExplosion.rb:20:2555:20:2560 | self | | UseUseExplosion.rb:20:1505:20:1509 | self | UseUseExplosion.rb:20:1526:20:1530 | self | | UseUseExplosion.rb:20:1505:20:1509 | self | UseUseExplosion.rb:20:2555:20:2560 | self | -| UseUseExplosion.rb:20:1505:20:1514 | ... > ... | UseUseExplosion.rb:20:1504:20:1515 | [false] ( ... ) | -| UseUseExplosion.rb:20:1505:20:1514 | ... > ... | UseUseExplosion.rb:20:1504:20:1515 | [true] ( ... ) | +| UseUseExplosion.rb:20:1505:20:1514 | ... > ... | UseUseExplosion.rb:20:1504:20:1515 | ( ... ) | | UseUseExplosion.rb:20:1517:20:2548 | then ... | UseUseExplosion.rb:20:1501:20:2564 | if ... | | UseUseExplosion.rb:20:1522:20:2548 | if ... | UseUseExplosion.rb:20:1517:20:2548 | then ... | | UseUseExplosion.rb:20:1526:20:1530 | [post] self | UseUseExplosion.rb:20:1547:20:1551 | self | | UseUseExplosion.rb:20:1526:20:1530 | [post] self | UseUseExplosion.rb:20:2539:20:2544 | self | | UseUseExplosion.rb:20:1526:20:1530 | self | UseUseExplosion.rb:20:1547:20:1551 | self | | UseUseExplosion.rb:20:1526:20:1530 | self | UseUseExplosion.rb:20:2539:20:2544 | self | -| UseUseExplosion.rb:20:1526:20:1535 | ... > ... | UseUseExplosion.rb:20:1525:20:1536 | [false] ( ... ) | -| UseUseExplosion.rb:20:1526:20:1535 | ... > ... | UseUseExplosion.rb:20:1525:20:1536 | [true] ( ... ) | +| UseUseExplosion.rb:20:1526:20:1535 | ... > ... | UseUseExplosion.rb:20:1525:20:1536 | ( ... ) | | UseUseExplosion.rb:20:1538:20:2532 | then ... | UseUseExplosion.rb:20:1522:20:2548 | if ... | | UseUseExplosion.rb:20:1543:20:2532 | if ... | UseUseExplosion.rb:20:1538:20:2532 | then ... | | UseUseExplosion.rb:20:1547:20:1551 | [post] self | UseUseExplosion.rb:20:1568:20:1572 | self | | UseUseExplosion.rb:20:1547:20:1551 | [post] self | UseUseExplosion.rb:20:2523:20:2528 | self | | UseUseExplosion.rb:20:1547:20:1551 | self | UseUseExplosion.rb:20:1568:20:1572 | self | | UseUseExplosion.rb:20:1547:20:1551 | self | UseUseExplosion.rb:20:2523:20:2528 | self | -| UseUseExplosion.rb:20:1547:20:1556 | ... > ... | UseUseExplosion.rb:20:1546:20:1557 | [false] ( ... ) | -| UseUseExplosion.rb:20:1547:20:1556 | ... > ... | UseUseExplosion.rb:20:1546:20:1557 | [true] ( ... ) | +| UseUseExplosion.rb:20:1547:20:1556 | ... > ... | UseUseExplosion.rb:20:1546:20:1557 | ( ... ) | | UseUseExplosion.rb:20:1559:20:2516 | then ... | UseUseExplosion.rb:20:1543:20:2532 | if ... | | UseUseExplosion.rb:20:1564:20:2516 | if ... | UseUseExplosion.rb:20:1559:20:2516 | then ... | | UseUseExplosion.rb:20:1568:20:1572 | [post] self | UseUseExplosion.rb:20:1589:20:1593 | self | | UseUseExplosion.rb:20:1568:20:1572 | [post] self | UseUseExplosion.rb:20:2507:20:2512 | self | | UseUseExplosion.rb:20:1568:20:1572 | self | UseUseExplosion.rb:20:1589:20:1593 | self | | UseUseExplosion.rb:20:1568:20:1572 | self | UseUseExplosion.rb:20:2507:20:2512 | self | -| UseUseExplosion.rb:20:1568:20:1577 | ... > ... | UseUseExplosion.rb:20:1567:20:1578 | [false] ( ... ) | -| UseUseExplosion.rb:20:1568:20:1577 | ... > ... | UseUseExplosion.rb:20:1567:20:1578 | [true] ( ... ) | +| UseUseExplosion.rb:20:1568:20:1577 | ... > ... | UseUseExplosion.rb:20:1567:20:1578 | ( ... ) | | UseUseExplosion.rb:20:1580:20:2500 | then ... | UseUseExplosion.rb:20:1564:20:2516 | if ... | | UseUseExplosion.rb:20:1585:20:2500 | if ... | UseUseExplosion.rb:20:1580:20:2500 | then ... | | UseUseExplosion.rb:20:1589:20:1593 | [post] self | UseUseExplosion.rb:20:1610:20:1614 | self | | UseUseExplosion.rb:20:1589:20:1593 | [post] self | UseUseExplosion.rb:20:2491:20:2496 | self | | UseUseExplosion.rb:20:1589:20:1593 | self | UseUseExplosion.rb:20:1610:20:1614 | self | | UseUseExplosion.rb:20:1589:20:1593 | self | UseUseExplosion.rb:20:2491:20:2496 | self | -| UseUseExplosion.rb:20:1589:20:1598 | ... > ... | UseUseExplosion.rb:20:1588:20:1599 | [false] ( ... ) | -| UseUseExplosion.rb:20:1589:20:1598 | ... > ... | UseUseExplosion.rb:20:1588:20:1599 | [true] ( ... ) | +| UseUseExplosion.rb:20:1589:20:1598 | ... > ... | UseUseExplosion.rb:20:1588:20:1599 | ( ... ) | | UseUseExplosion.rb:20:1601:20:2484 | then ... | UseUseExplosion.rb:20:1585:20:2500 | if ... | | UseUseExplosion.rb:20:1606:20:2484 | if ... | UseUseExplosion.rb:20:1601:20:2484 | then ... | | UseUseExplosion.rb:20:1610:20:1614 | [post] self | UseUseExplosion.rb:20:1631:20:1635 | self | | UseUseExplosion.rb:20:1610:20:1614 | [post] self | UseUseExplosion.rb:20:2475:20:2480 | self | | UseUseExplosion.rb:20:1610:20:1614 | self | UseUseExplosion.rb:20:1631:20:1635 | self | | UseUseExplosion.rb:20:1610:20:1614 | self | UseUseExplosion.rb:20:2475:20:2480 | self | -| UseUseExplosion.rb:20:1610:20:1619 | ... > ... | UseUseExplosion.rb:20:1609:20:1620 | [false] ( ... ) | -| UseUseExplosion.rb:20:1610:20:1619 | ... > ... | UseUseExplosion.rb:20:1609:20:1620 | [true] ( ... ) | +| UseUseExplosion.rb:20:1610:20:1619 | ... > ... | UseUseExplosion.rb:20:1609:20:1620 | ( ... ) | | UseUseExplosion.rb:20:1622:20:2468 | then ... | UseUseExplosion.rb:20:1606:20:2484 | if ... | | UseUseExplosion.rb:20:1627:20:2468 | if ... | UseUseExplosion.rb:20:1622:20:2468 | then ... | | UseUseExplosion.rb:20:1631:20:1635 | [post] self | UseUseExplosion.rb:20:1652:20:1656 | self | | UseUseExplosion.rb:20:1631:20:1635 | [post] self | UseUseExplosion.rb:20:2459:20:2464 | self | | UseUseExplosion.rb:20:1631:20:1635 | self | UseUseExplosion.rb:20:1652:20:1656 | self | | UseUseExplosion.rb:20:1631:20:1635 | self | UseUseExplosion.rb:20:2459:20:2464 | self | -| UseUseExplosion.rb:20:1631:20:1640 | ... > ... | UseUseExplosion.rb:20:1630:20:1641 | [false] ( ... ) | -| UseUseExplosion.rb:20:1631:20:1640 | ... > ... | UseUseExplosion.rb:20:1630:20:1641 | [true] ( ... ) | +| UseUseExplosion.rb:20:1631:20:1640 | ... > ... | UseUseExplosion.rb:20:1630:20:1641 | ( ... ) | | UseUseExplosion.rb:20:1643:20:2452 | then ... | UseUseExplosion.rb:20:1627:20:2468 | if ... | | UseUseExplosion.rb:20:1648:20:2452 | if ... | UseUseExplosion.rb:20:1643:20:2452 | then ... | | UseUseExplosion.rb:20:1652:20:1656 | [post] self | UseUseExplosion.rb:20:1673:20:1677 | self | | UseUseExplosion.rb:20:1652:20:1656 | [post] self | UseUseExplosion.rb:20:2443:20:2448 | self | | UseUseExplosion.rb:20:1652:20:1656 | self | UseUseExplosion.rb:20:1673:20:1677 | self | | UseUseExplosion.rb:20:1652:20:1656 | self | UseUseExplosion.rb:20:2443:20:2448 | self | -| UseUseExplosion.rb:20:1652:20:1661 | ... > ... | UseUseExplosion.rb:20:1651:20:1662 | [false] ( ... ) | -| UseUseExplosion.rb:20:1652:20:1661 | ... > ... | UseUseExplosion.rb:20:1651:20:1662 | [true] ( ... ) | +| UseUseExplosion.rb:20:1652:20:1661 | ... > ... | UseUseExplosion.rb:20:1651:20:1662 | ( ... ) | | UseUseExplosion.rb:20:1664:20:2436 | then ... | UseUseExplosion.rb:20:1648:20:2452 | if ... | | UseUseExplosion.rb:20:1669:20:2436 | if ... | UseUseExplosion.rb:20:1664:20:2436 | then ... | | UseUseExplosion.rb:20:1673:20:1677 | [post] self | UseUseExplosion.rb:20:1694:20:1698 | self | | UseUseExplosion.rb:20:1673:20:1677 | [post] self | UseUseExplosion.rb:20:2427:20:2432 | self | | UseUseExplosion.rb:20:1673:20:1677 | self | UseUseExplosion.rb:20:1694:20:1698 | self | | UseUseExplosion.rb:20:1673:20:1677 | self | UseUseExplosion.rb:20:2427:20:2432 | self | -| UseUseExplosion.rb:20:1673:20:1682 | ... > ... | UseUseExplosion.rb:20:1672:20:1683 | [false] ( ... ) | -| UseUseExplosion.rb:20:1673:20:1682 | ... > ... | UseUseExplosion.rb:20:1672:20:1683 | [true] ( ... ) | +| UseUseExplosion.rb:20:1673:20:1682 | ... > ... | UseUseExplosion.rb:20:1672:20:1683 | ( ... ) | | UseUseExplosion.rb:20:1685:20:2420 | then ... | UseUseExplosion.rb:20:1669:20:2436 | if ... | | UseUseExplosion.rb:20:1690:20:2420 | if ... | UseUseExplosion.rb:20:1685:20:2420 | then ... | | UseUseExplosion.rb:20:1694:20:1698 | [post] self | UseUseExplosion.rb:20:1715:20:1719 | self | | UseUseExplosion.rb:20:1694:20:1698 | [post] self | UseUseExplosion.rb:20:2411:20:2416 | self | | UseUseExplosion.rb:20:1694:20:1698 | self | UseUseExplosion.rb:20:1715:20:1719 | self | | UseUseExplosion.rb:20:1694:20:1698 | self | UseUseExplosion.rb:20:2411:20:2416 | self | -| UseUseExplosion.rb:20:1694:20:1703 | ... > ... | UseUseExplosion.rb:20:1693:20:1704 | [false] ( ... ) | -| UseUseExplosion.rb:20:1694:20:1703 | ... > ... | UseUseExplosion.rb:20:1693:20:1704 | [true] ( ... ) | +| UseUseExplosion.rb:20:1694:20:1703 | ... > ... | UseUseExplosion.rb:20:1693:20:1704 | ( ... ) | | UseUseExplosion.rb:20:1706:20:2404 | then ... | UseUseExplosion.rb:20:1690:20:2420 | if ... | | UseUseExplosion.rb:20:1711:20:2404 | if ... | UseUseExplosion.rb:20:1706:20:2404 | then ... | | UseUseExplosion.rb:20:1715:20:1719 | [post] self | UseUseExplosion.rb:20:1736:20:1740 | self | | UseUseExplosion.rb:20:1715:20:1719 | [post] self | UseUseExplosion.rb:20:2395:20:2400 | self | | UseUseExplosion.rb:20:1715:20:1719 | self | UseUseExplosion.rb:20:1736:20:1740 | self | | UseUseExplosion.rb:20:1715:20:1719 | self | UseUseExplosion.rb:20:2395:20:2400 | self | -| UseUseExplosion.rb:20:1715:20:1724 | ... > ... | UseUseExplosion.rb:20:1714:20:1725 | [false] ( ... ) | -| UseUseExplosion.rb:20:1715:20:1724 | ... > ... | UseUseExplosion.rb:20:1714:20:1725 | [true] ( ... ) | +| UseUseExplosion.rb:20:1715:20:1724 | ... > ... | UseUseExplosion.rb:20:1714:20:1725 | ( ... ) | | UseUseExplosion.rb:20:1727:20:2388 | then ... | UseUseExplosion.rb:20:1711:20:2404 | if ... | | UseUseExplosion.rb:20:1732:20:2388 | if ... | UseUseExplosion.rb:20:1727:20:2388 | then ... | | UseUseExplosion.rb:20:1736:20:1740 | [post] self | UseUseExplosion.rb:20:1757:20:1761 | self | | UseUseExplosion.rb:20:1736:20:1740 | [post] self | UseUseExplosion.rb:20:2379:20:2384 | self | | UseUseExplosion.rb:20:1736:20:1740 | self | UseUseExplosion.rb:20:1757:20:1761 | self | | UseUseExplosion.rb:20:1736:20:1740 | self | UseUseExplosion.rb:20:2379:20:2384 | self | -| UseUseExplosion.rb:20:1736:20:1745 | ... > ... | UseUseExplosion.rb:20:1735:20:1746 | [false] ( ... ) | -| UseUseExplosion.rb:20:1736:20:1745 | ... > ... | UseUseExplosion.rb:20:1735:20:1746 | [true] ( ... ) | +| UseUseExplosion.rb:20:1736:20:1745 | ... > ... | UseUseExplosion.rb:20:1735:20:1746 | ( ... ) | | UseUseExplosion.rb:20:1748:20:2372 | then ... | UseUseExplosion.rb:20:1732:20:2388 | if ... | | UseUseExplosion.rb:20:1753:20:2372 | if ... | UseUseExplosion.rb:20:1748:20:2372 | then ... | | UseUseExplosion.rb:20:1757:20:1761 | [post] self | UseUseExplosion.rb:20:1778:20:1782 | self | | UseUseExplosion.rb:20:1757:20:1761 | [post] self | UseUseExplosion.rb:20:2363:20:2368 | self | | UseUseExplosion.rb:20:1757:20:1761 | self | UseUseExplosion.rb:20:1778:20:1782 | self | | UseUseExplosion.rb:20:1757:20:1761 | self | UseUseExplosion.rb:20:2363:20:2368 | self | -| UseUseExplosion.rb:20:1757:20:1766 | ... > ... | UseUseExplosion.rb:20:1756:20:1767 | [false] ( ... ) | -| UseUseExplosion.rb:20:1757:20:1766 | ... > ... | UseUseExplosion.rb:20:1756:20:1767 | [true] ( ... ) | +| UseUseExplosion.rb:20:1757:20:1766 | ... > ... | UseUseExplosion.rb:20:1756:20:1767 | ( ... ) | | UseUseExplosion.rb:20:1769:20:2356 | then ... | UseUseExplosion.rb:20:1753:20:2372 | if ... | | UseUseExplosion.rb:20:1774:20:2356 | if ... | UseUseExplosion.rb:20:1769:20:2356 | then ... | | UseUseExplosion.rb:20:1778:20:1782 | [post] self | UseUseExplosion.rb:20:1799:20:1803 | self | | UseUseExplosion.rb:20:1778:20:1782 | [post] self | UseUseExplosion.rb:20:2347:20:2352 | self | | UseUseExplosion.rb:20:1778:20:1782 | self | UseUseExplosion.rb:20:1799:20:1803 | self | | UseUseExplosion.rb:20:1778:20:1782 | self | UseUseExplosion.rb:20:2347:20:2352 | self | -| UseUseExplosion.rb:20:1778:20:1787 | ... > ... | UseUseExplosion.rb:20:1777:20:1788 | [false] ( ... ) | -| UseUseExplosion.rb:20:1778:20:1787 | ... > ... | UseUseExplosion.rb:20:1777:20:1788 | [true] ( ... ) | +| UseUseExplosion.rb:20:1778:20:1787 | ... > ... | UseUseExplosion.rb:20:1777:20:1788 | ( ... ) | | UseUseExplosion.rb:20:1790:20:2340 | then ... | UseUseExplosion.rb:20:1774:20:2356 | if ... | | UseUseExplosion.rb:20:1795:20:2340 | if ... | UseUseExplosion.rb:20:1790:20:2340 | then ... | | UseUseExplosion.rb:20:1799:20:1803 | [post] self | UseUseExplosion.rb:20:1820:20:1824 | self | | UseUseExplosion.rb:20:1799:20:1803 | [post] self | UseUseExplosion.rb:20:2331:20:2336 | self | | UseUseExplosion.rb:20:1799:20:1803 | self | UseUseExplosion.rb:20:1820:20:1824 | self | | UseUseExplosion.rb:20:1799:20:1803 | self | UseUseExplosion.rb:20:2331:20:2336 | self | -| UseUseExplosion.rb:20:1799:20:1808 | ... > ... | UseUseExplosion.rb:20:1798:20:1809 | [false] ( ... ) | -| UseUseExplosion.rb:20:1799:20:1808 | ... > ... | UseUseExplosion.rb:20:1798:20:1809 | [true] ( ... ) | +| UseUseExplosion.rb:20:1799:20:1808 | ... > ... | UseUseExplosion.rb:20:1798:20:1809 | ( ... ) | | UseUseExplosion.rb:20:1811:20:2324 | then ... | UseUseExplosion.rb:20:1795:20:2340 | if ... | | UseUseExplosion.rb:20:1816:20:2324 | if ... | UseUseExplosion.rb:20:1811:20:2324 | then ... | | UseUseExplosion.rb:20:1820:20:1824 | [post] self | UseUseExplosion.rb:20:1841:20:1845 | self | | UseUseExplosion.rb:20:1820:20:1824 | [post] self | UseUseExplosion.rb:20:2315:20:2320 | self | | UseUseExplosion.rb:20:1820:20:1824 | self | UseUseExplosion.rb:20:1841:20:1845 | self | | UseUseExplosion.rb:20:1820:20:1824 | self | UseUseExplosion.rb:20:2315:20:2320 | self | -| UseUseExplosion.rb:20:1820:20:1829 | ... > ... | UseUseExplosion.rb:20:1819:20:1830 | [false] ( ... ) | -| UseUseExplosion.rb:20:1820:20:1829 | ... > ... | UseUseExplosion.rb:20:1819:20:1830 | [true] ( ... ) | +| UseUseExplosion.rb:20:1820:20:1829 | ... > ... | UseUseExplosion.rb:20:1819:20:1830 | ( ... ) | | UseUseExplosion.rb:20:1832:20:2308 | then ... | UseUseExplosion.rb:20:1816:20:2324 | if ... | | UseUseExplosion.rb:20:1837:20:2308 | if ... | UseUseExplosion.rb:20:1832:20:2308 | then ... | | UseUseExplosion.rb:20:1841:20:1845 | [post] self | UseUseExplosion.rb:20:1862:20:1866 | self | | UseUseExplosion.rb:20:1841:20:1845 | [post] self | UseUseExplosion.rb:20:2299:20:2304 | self | | UseUseExplosion.rb:20:1841:20:1845 | self | UseUseExplosion.rb:20:1862:20:1866 | self | | UseUseExplosion.rb:20:1841:20:1845 | self | UseUseExplosion.rb:20:2299:20:2304 | self | -| UseUseExplosion.rb:20:1841:20:1850 | ... > ... | UseUseExplosion.rb:20:1840:20:1851 | [false] ( ... ) | -| UseUseExplosion.rb:20:1841:20:1850 | ... > ... | UseUseExplosion.rb:20:1840:20:1851 | [true] ( ... ) | +| UseUseExplosion.rb:20:1841:20:1850 | ... > ... | UseUseExplosion.rb:20:1840:20:1851 | ( ... ) | | UseUseExplosion.rb:20:1853:20:2292 | then ... | UseUseExplosion.rb:20:1837:20:2308 | if ... | | UseUseExplosion.rb:20:1858:20:2292 | if ... | UseUseExplosion.rb:20:1853:20:2292 | then ... | | UseUseExplosion.rb:20:1862:20:1866 | [post] self | UseUseExplosion.rb:20:1883:20:1887 | self | | UseUseExplosion.rb:20:1862:20:1866 | [post] self | UseUseExplosion.rb:20:2283:20:2288 | self | | UseUseExplosion.rb:20:1862:20:1866 | self | UseUseExplosion.rb:20:1883:20:1887 | self | | UseUseExplosion.rb:20:1862:20:1866 | self | UseUseExplosion.rb:20:2283:20:2288 | self | -| UseUseExplosion.rb:20:1862:20:1871 | ... > ... | UseUseExplosion.rb:20:1861:20:1872 | [false] ( ... ) | -| UseUseExplosion.rb:20:1862:20:1871 | ... > ... | UseUseExplosion.rb:20:1861:20:1872 | [true] ( ... ) | +| UseUseExplosion.rb:20:1862:20:1871 | ... > ... | UseUseExplosion.rb:20:1861:20:1872 | ( ... ) | | UseUseExplosion.rb:20:1874:20:2276 | then ... | UseUseExplosion.rb:20:1858:20:2292 | if ... | | UseUseExplosion.rb:20:1879:20:2276 | if ... | UseUseExplosion.rb:20:1874:20:2276 | then ... | | UseUseExplosion.rb:20:1883:20:1887 | [post] self | UseUseExplosion.rb:20:1904:20:1908 | self | | UseUseExplosion.rb:20:1883:20:1887 | [post] self | UseUseExplosion.rb:20:2267:20:2272 | self | | UseUseExplosion.rb:20:1883:20:1887 | self | UseUseExplosion.rb:20:1904:20:1908 | self | | UseUseExplosion.rb:20:1883:20:1887 | self | UseUseExplosion.rb:20:2267:20:2272 | self | -| UseUseExplosion.rb:20:1883:20:1892 | ... > ... | UseUseExplosion.rb:20:1882:20:1893 | [false] ( ... ) | -| UseUseExplosion.rb:20:1883:20:1892 | ... > ... | UseUseExplosion.rb:20:1882:20:1893 | [true] ( ... ) | +| UseUseExplosion.rb:20:1883:20:1892 | ... > ... | UseUseExplosion.rb:20:1882:20:1893 | ( ... ) | | UseUseExplosion.rb:20:1895:20:2260 | then ... | UseUseExplosion.rb:20:1879:20:2276 | if ... | | UseUseExplosion.rb:20:1900:20:2260 | if ... | UseUseExplosion.rb:20:1895:20:2260 | then ... | | UseUseExplosion.rb:20:1904:20:1908 | [post] self | UseUseExplosion.rb:20:1925:20:1929 | self | | UseUseExplosion.rb:20:1904:20:1908 | [post] self | UseUseExplosion.rb:20:2251:20:2256 | self | | UseUseExplosion.rb:20:1904:20:1908 | self | UseUseExplosion.rb:20:1925:20:1929 | self | | UseUseExplosion.rb:20:1904:20:1908 | self | UseUseExplosion.rb:20:2251:20:2256 | self | -| UseUseExplosion.rb:20:1904:20:1913 | ... > ... | UseUseExplosion.rb:20:1903:20:1914 | [false] ( ... ) | -| UseUseExplosion.rb:20:1904:20:1913 | ... > ... | UseUseExplosion.rb:20:1903:20:1914 | [true] ( ... ) | +| UseUseExplosion.rb:20:1904:20:1913 | ... > ... | UseUseExplosion.rb:20:1903:20:1914 | ( ... ) | | UseUseExplosion.rb:20:1916:20:2244 | then ... | UseUseExplosion.rb:20:1900:20:2260 | if ... | | UseUseExplosion.rb:20:1921:20:2244 | if ... | UseUseExplosion.rb:20:1916:20:2244 | then ... | | UseUseExplosion.rb:20:1925:20:1929 | [post] self | UseUseExplosion.rb:20:1945:20:1949 | self | | UseUseExplosion.rb:20:1925:20:1929 | [post] self | UseUseExplosion.rb:20:2235:20:2240 | self | | UseUseExplosion.rb:20:1925:20:1929 | self | UseUseExplosion.rb:20:1945:20:1949 | self | | UseUseExplosion.rb:20:1925:20:1929 | self | UseUseExplosion.rb:20:2235:20:2240 | self | -| UseUseExplosion.rb:20:1925:20:1933 | ... > ... | UseUseExplosion.rb:20:1924:20:1934 | [false] ( ... ) | -| UseUseExplosion.rb:20:1925:20:1933 | ... > ... | UseUseExplosion.rb:20:1924:20:1934 | [true] ( ... ) | +| UseUseExplosion.rb:20:1925:20:1933 | ... > ... | UseUseExplosion.rb:20:1924:20:1934 | ( ... ) | | UseUseExplosion.rb:20:1936:20:2228 | then ... | UseUseExplosion.rb:20:1921:20:2244 | if ... | | UseUseExplosion.rb:20:1941:20:2228 | if ... | UseUseExplosion.rb:20:1936:20:2228 | then ... | | UseUseExplosion.rb:20:1945:20:1949 | [post] self | UseUseExplosion.rb:20:1965:20:1969 | self | | UseUseExplosion.rb:20:1945:20:1949 | [post] self | UseUseExplosion.rb:20:2219:20:2224 | self | | UseUseExplosion.rb:20:1945:20:1949 | self | UseUseExplosion.rb:20:1965:20:1969 | self | | UseUseExplosion.rb:20:1945:20:1949 | self | UseUseExplosion.rb:20:2219:20:2224 | self | -| UseUseExplosion.rb:20:1945:20:1953 | ... > ... | UseUseExplosion.rb:20:1944:20:1954 | [false] ( ... ) | -| UseUseExplosion.rb:20:1945:20:1953 | ... > ... | UseUseExplosion.rb:20:1944:20:1954 | [true] ( ... ) | +| UseUseExplosion.rb:20:1945:20:1953 | ... > ... | UseUseExplosion.rb:20:1944:20:1954 | ( ... ) | | UseUseExplosion.rb:20:1956:20:2212 | then ... | UseUseExplosion.rb:20:1941:20:2228 | if ... | | UseUseExplosion.rb:20:1961:20:2212 | if ... | UseUseExplosion.rb:20:1956:20:2212 | then ... | | UseUseExplosion.rb:20:1965:20:1969 | [post] self | UseUseExplosion.rb:20:1985:20:1989 | self | | UseUseExplosion.rb:20:1965:20:1969 | [post] self | UseUseExplosion.rb:20:2203:20:2208 | self | | UseUseExplosion.rb:20:1965:20:1969 | self | UseUseExplosion.rb:20:1985:20:1989 | self | | UseUseExplosion.rb:20:1965:20:1969 | self | UseUseExplosion.rb:20:2203:20:2208 | self | -| UseUseExplosion.rb:20:1965:20:1973 | ... > ... | UseUseExplosion.rb:20:1964:20:1974 | [false] ( ... ) | -| UseUseExplosion.rb:20:1965:20:1973 | ... > ... | UseUseExplosion.rb:20:1964:20:1974 | [true] ( ... ) | +| UseUseExplosion.rb:20:1965:20:1973 | ... > ... | UseUseExplosion.rb:20:1964:20:1974 | ( ... ) | | UseUseExplosion.rb:20:1976:20:2196 | then ... | UseUseExplosion.rb:20:1961:20:2212 | if ... | | UseUseExplosion.rb:20:1981:20:2196 | if ... | UseUseExplosion.rb:20:1976:20:2196 | then ... | | UseUseExplosion.rb:20:1985:20:1989 | [post] self | UseUseExplosion.rb:20:2005:20:2009 | self | | UseUseExplosion.rb:20:1985:20:1989 | [post] self | UseUseExplosion.rb:20:2187:20:2192 | self | | UseUseExplosion.rb:20:1985:20:1989 | self | UseUseExplosion.rb:20:2005:20:2009 | self | | UseUseExplosion.rb:20:1985:20:1989 | self | UseUseExplosion.rb:20:2187:20:2192 | self | -| UseUseExplosion.rb:20:1985:20:1993 | ... > ... | UseUseExplosion.rb:20:1984:20:1994 | [false] ( ... ) | -| UseUseExplosion.rb:20:1985:20:1993 | ... > ... | UseUseExplosion.rb:20:1984:20:1994 | [true] ( ... ) | +| UseUseExplosion.rb:20:1985:20:1993 | ... > ... | UseUseExplosion.rb:20:1984:20:1994 | ( ... ) | | UseUseExplosion.rb:20:1996:20:2180 | then ... | UseUseExplosion.rb:20:1981:20:2196 | if ... | | UseUseExplosion.rb:20:2001:20:2180 | if ... | UseUseExplosion.rb:20:1996:20:2180 | then ... | | UseUseExplosion.rb:20:2005:20:2009 | [post] self | UseUseExplosion.rb:20:2025:20:2029 | self | | UseUseExplosion.rb:20:2005:20:2009 | [post] self | UseUseExplosion.rb:20:2171:20:2176 | self | | UseUseExplosion.rb:20:2005:20:2009 | self | UseUseExplosion.rb:20:2025:20:2029 | self | | UseUseExplosion.rb:20:2005:20:2009 | self | UseUseExplosion.rb:20:2171:20:2176 | self | -| UseUseExplosion.rb:20:2005:20:2013 | ... > ... | UseUseExplosion.rb:20:2004:20:2014 | [false] ( ... ) | -| UseUseExplosion.rb:20:2005:20:2013 | ... > ... | UseUseExplosion.rb:20:2004:20:2014 | [true] ( ... ) | +| UseUseExplosion.rb:20:2005:20:2013 | ... > ... | UseUseExplosion.rb:20:2004:20:2014 | ( ... ) | | UseUseExplosion.rb:20:2016:20:2164 | then ... | UseUseExplosion.rb:20:2001:20:2180 | if ... | | UseUseExplosion.rb:20:2021:20:2164 | if ... | UseUseExplosion.rb:20:2016:20:2164 | then ... | | UseUseExplosion.rb:20:2025:20:2029 | [post] self | UseUseExplosion.rb:20:2045:20:2049 | self | | UseUseExplosion.rb:20:2025:20:2029 | [post] self | UseUseExplosion.rb:20:2155:20:2160 | self | | UseUseExplosion.rb:20:2025:20:2029 | self | UseUseExplosion.rb:20:2045:20:2049 | self | | UseUseExplosion.rb:20:2025:20:2029 | self | UseUseExplosion.rb:20:2155:20:2160 | self | -| UseUseExplosion.rb:20:2025:20:2033 | ... > ... | UseUseExplosion.rb:20:2024:20:2034 | [false] ( ... ) | -| UseUseExplosion.rb:20:2025:20:2033 | ... > ... | UseUseExplosion.rb:20:2024:20:2034 | [true] ( ... ) | +| UseUseExplosion.rb:20:2025:20:2033 | ... > ... | UseUseExplosion.rb:20:2024:20:2034 | ( ... ) | | UseUseExplosion.rb:20:2036:20:2148 | then ... | UseUseExplosion.rb:20:2021:20:2164 | if ... | | UseUseExplosion.rb:20:2041:20:2148 | if ... | UseUseExplosion.rb:20:2036:20:2148 | then ... | | UseUseExplosion.rb:20:2045:20:2049 | [post] self | UseUseExplosion.rb:20:2065:20:2069 | self | | UseUseExplosion.rb:20:2045:20:2049 | [post] self | UseUseExplosion.rb:20:2139:20:2144 | self | | UseUseExplosion.rb:20:2045:20:2049 | self | UseUseExplosion.rb:20:2065:20:2069 | self | | UseUseExplosion.rb:20:2045:20:2049 | self | UseUseExplosion.rb:20:2139:20:2144 | self | -| UseUseExplosion.rb:20:2045:20:2053 | ... > ... | UseUseExplosion.rb:20:2044:20:2054 | [false] ( ... ) | -| UseUseExplosion.rb:20:2045:20:2053 | ... > ... | UseUseExplosion.rb:20:2044:20:2054 | [true] ( ... ) | +| UseUseExplosion.rb:20:2045:20:2053 | ... > ... | UseUseExplosion.rb:20:2044:20:2054 | ( ... ) | | UseUseExplosion.rb:20:2056:20:2132 | then ... | UseUseExplosion.rb:20:2041:20:2148 | if ... | | UseUseExplosion.rb:20:2061:20:2132 | if ... | UseUseExplosion.rb:20:2056:20:2132 | then ... | | UseUseExplosion.rb:20:2065:20:2069 | [post] self | UseUseExplosion.rb:20:2085:20:2089 | self | | UseUseExplosion.rb:20:2065:20:2069 | [post] self | UseUseExplosion.rb:20:2123:20:2128 | self | | UseUseExplosion.rb:20:2065:20:2069 | self | UseUseExplosion.rb:20:2085:20:2089 | self | | UseUseExplosion.rb:20:2065:20:2069 | self | UseUseExplosion.rb:20:2123:20:2128 | self | -| UseUseExplosion.rb:20:2065:20:2073 | ... > ... | UseUseExplosion.rb:20:2064:20:2074 | [false] ( ... ) | -| UseUseExplosion.rb:20:2065:20:2073 | ... > ... | UseUseExplosion.rb:20:2064:20:2074 | [true] ( ... ) | +| UseUseExplosion.rb:20:2065:20:2073 | ... > ... | UseUseExplosion.rb:20:2064:20:2074 | ( ... ) | | UseUseExplosion.rb:20:2076:20:2116 | then ... | UseUseExplosion.rb:20:2061:20:2132 | if ... | | UseUseExplosion.rb:20:2081:20:2116 | if ... | UseUseExplosion.rb:20:2076:20:2116 | then ... | | UseUseExplosion.rb:20:2085:20:2089 | [post] self | UseUseExplosion.rb:20:2096:20:2099 | [input] SSA phi read(self) | | UseUseExplosion.rb:20:2085:20:2089 | [post] self | UseUseExplosion.rb:20:2107:20:2112 | self | | UseUseExplosion.rb:20:2085:20:2089 | self | UseUseExplosion.rb:20:2096:20:2099 | [input] SSA phi read(self) | | UseUseExplosion.rb:20:2085:20:2089 | self | UseUseExplosion.rb:20:2107:20:2112 | self | -| UseUseExplosion.rb:20:2085:20:2093 | ... > ... | UseUseExplosion.rb:20:2084:20:2094 | [false] ( ... ) | -| UseUseExplosion.rb:20:2085:20:2093 | ... > ... | UseUseExplosion.rb:20:2084:20:2094 | [true] ( ... ) | +| UseUseExplosion.rb:20:2085:20:2093 | ... > ... | UseUseExplosion.rb:20:2084:20:2094 | ( ... ) | | UseUseExplosion.rb:20:2096:20:2099 | [input] SSA phi read(self) | UseUseExplosion.rb:21:13:21:17 | self | | UseUseExplosion.rb:20:2096:20:2099 | [input] SSA phi read(x) | UseUseExplosion.rb:20:9:20:3700 | SSA phi read(x) | | UseUseExplosion.rb:20:2096:20:2099 | then ... | UseUseExplosion.rb:20:2081:20:2116 | if ... | @@ -1504,802 +1404,703 @@ | UseUseExplosion.rb:20:3691:20:3696 | call to use | UseUseExplosion.rb:20:3686:20:3696 | else ... | | UseUseExplosion.rb:20:3691:20:3696 | self | UseUseExplosion.rb:21:13:21:17 | self | | UseUseExplosion.rb:20:3695:20:3695 | x | UseUseExplosion.rb:20:9:20:3700 | SSA phi read(x) | +| UseUseExplosion.rb:21:9:21:3700 | if ... | UseUseExplosion.rb:19:9:21:3700 | ... | | UseUseExplosion.rb:21:13:21:17 | [post] self | UseUseExplosion.rb:21:35:21:39 | self | | UseUseExplosion.rb:21:13:21:17 | [post] self | UseUseExplosion.rb:21:3691:21:3696 | self | | UseUseExplosion.rb:21:13:21:17 | self | UseUseExplosion.rb:21:35:21:39 | self | | UseUseExplosion.rb:21:13:21:17 | self | UseUseExplosion.rb:21:3691:21:3696 | self | -| UseUseExplosion.rb:21:13:21:23 | ... > ... | UseUseExplosion.rb:21:12:21:24 | [false] ( ... ) | -| UseUseExplosion.rb:21:13:21:23 | ... > ... | UseUseExplosion.rb:21:12:21:24 | [true] ( ... ) | +| UseUseExplosion.rb:21:13:21:23 | ... > ... | UseUseExplosion.rb:21:12:21:24 | ( ... ) | | UseUseExplosion.rb:21:26:21:3684 | then ... | UseUseExplosion.rb:21:9:21:3700 | if ... | | UseUseExplosion.rb:21:31:21:3684 | if ... | UseUseExplosion.rb:21:26:21:3684 | then ... | | UseUseExplosion.rb:21:35:21:39 | [post] self | UseUseExplosion.rb:21:56:21:60 | self | | UseUseExplosion.rb:21:35:21:39 | [post] self | UseUseExplosion.rb:21:3675:21:3680 | self | | UseUseExplosion.rb:21:35:21:39 | self | UseUseExplosion.rb:21:56:21:60 | self | | UseUseExplosion.rb:21:35:21:39 | self | UseUseExplosion.rb:21:3675:21:3680 | self | -| UseUseExplosion.rb:21:35:21:44 | ... > ... | UseUseExplosion.rb:21:34:21:45 | [false] ( ... ) | -| UseUseExplosion.rb:21:35:21:44 | ... > ... | UseUseExplosion.rb:21:34:21:45 | [true] ( ... ) | +| UseUseExplosion.rb:21:35:21:44 | ... > ... | UseUseExplosion.rb:21:34:21:45 | ( ... ) | | UseUseExplosion.rb:21:47:21:3668 | then ... | UseUseExplosion.rb:21:31:21:3684 | if ... | | UseUseExplosion.rb:21:52:21:3668 | if ... | UseUseExplosion.rb:21:47:21:3668 | then ... | | UseUseExplosion.rb:21:56:21:60 | [post] self | UseUseExplosion.rb:21:77:21:81 | self | | UseUseExplosion.rb:21:56:21:60 | [post] self | UseUseExplosion.rb:21:3659:21:3664 | self | | UseUseExplosion.rb:21:56:21:60 | self | UseUseExplosion.rb:21:77:21:81 | self | | UseUseExplosion.rb:21:56:21:60 | self | UseUseExplosion.rb:21:3659:21:3664 | self | -| UseUseExplosion.rb:21:56:21:65 | ... > ... | UseUseExplosion.rb:21:55:21:66 | [false] ( ... ) | -| UseUseExplosion.rb:21:56:21:65 | ... > ... | UseUseExplosion.rb:21:55:21:66 | [true] ( ... ) | +| UseUseExplosion.rb:21:56:21:65 | ... > ... | UseUseExplosion.rb:21:55:21:66 | ( ... ) | | UseUseExplosion.rb:21:68:21:3652 | then ... | UseUseExplosion.rb:21:52:21:3668 | if ... | | UseUseExplosion.rb:21:73:21:3652 | if ... | UseUseExplosion.rb:21:68:21:3652 | then ... | | UseUseExplosion.rb:21:77:21:81 | [post] self | UseUseExplosion.rb:21:98:21:102 | self | | UseUseExplosion.rb:21:77:21:81 | [post] self | UseUseExplosion.rb:21:3643:21:3648 | self | | UseUseExplosion.rb:21:77:21:81 | self | UseUseExplosion.rb:21:98:21:102 | self | | UseUseExplosion.rb:21:77:21:81 | self | UseUseExplosion.rb:21:3643:21:3648 | self | -| UseUseExplosion.rb:21:77:21:86 | ... > ... | UseUseExplosion.rb:21:76:21:87 | [false] ( ... ) | -| UseUseExplosion.rb:21:77:21:86 | ... > ... | UseUseExplosion.rb:21:76:21:87 | [true] ( ... ) | +| UseUseExplosion.rb:21:77:21:86 | ... > ... | UseUseExplosion.rb:21:76:21:87 | ( ... ) | | UseUseExplosion.rb:21:89:21:3636 | then ... | UseUseExplosion.rb:21:73:21:3652 | if ... | | UseUseExplosion.rb:21:94:21:3636 | if ... | UseUseExplosion.rb:21:89:21:3636 | then ... | | UseUseExplosion.rb:21:98:21:102 | [post] self | UseUseExplosion.rb:21:119:21:123 | self | | UseUseExplosion.rb:21:98:21:102 | [post] self | UseUseExplosion.rb:21:3627:21:3632 | self | | UseUseExplosion.rb:21:98:21:102 | self | UseUseExplosion.rb:21:119:21:123 | self | | UseUseExplosion.rb:21:98:21:102 | self | UseUseExplosion.rb:21:3627:21:3632 | self | -| UseUseExplosion.rb:21:98:21:107 | ... > ... | UseUseExplosion.rb:21:97:21:108 | [false] ( ... ) | -| UseUseExplosion.rb:21:98:21:107 | ... > ... | UseUseExplosion.rb:21:97:21:108 | [true] ( ... ) | +| UseUseExplosion.rb:21:98:21:107 | ... > ... | UseUseExplosion.rb:21:97:21:108 | ( ... ) | | UseUseExplosion.rb:21:110:21:3620 | then ... | UseUseExplosion.rb:21:94:21:3636 | if ... | | UseUseExplosion.rb:21:115:21:3620 | if ... | UseUseExplosion.rb:21:110:21:3620 | then ... | | UseUseExplosion.rb:21:119:21:123 | [post] self | UseUseExplosion.rb:21:140:21:144 | self | | UseUseExplosion.rb:21:119:21:123 | [post] self | UseUseExplosion.rb:21:3611:21:3616 | self | | UseUseExplosion.rb:21:119:21:123 | self | UseUseExplosion.rb:21:140:21:144 | self | | UseUseExplosion.rb:21:119:21:123 | self | UseUseExplosion.rb:21:3611:21:3616 | self | -| UseUseExplosion.rb:21:119:21:128 | ... > ... | UseUseExplosion.rb:21:118:21:129 | [false] ( ... ) | -| UseUseExplosion.rb:21:119:21:128 | ... > ... | UseUseExplosion.rb:21:118:21:129 | [true] ( ... ) | +| UseUseExplosion.rb:21:119:21:128 | ... > ... | UseUseExplosion.rb:21:118:21:129 | ( ... ) | | UseUseExplosion.rb:21:131:21:3604 | then ... | UseUseExplosion.rb:21:115:21:3620 | if ... | | UseUseExplosion.rb:21:136:21:3604 | if ... | UseUseExplosion.rb:21:131:21:3604 | then ... | | UseUseExplosion.rb:21:140:21:144 | [post] self | UseUseExplosion.rb:21:161:21:165 | self | | UseUseExplosion.rb:21:140:21:144 | [post] self | UseUseExplosion.rb:21:3595:21:3600 | self | | UseUseExplosion.rb:21:140:21:144 | self | UseUseExplosion.rb:21:161:21:165 | self | | UseUseExplosion.rb:21:140:21:144 | self | UseUseExplosion.rb:21:3595:21:3600 | self | -| UseUseExplosion.rb:21:140:21:149 | ... > ... | UseUseExplosion.rb:21:139:21:150 | [false] ( ... ) | -| UseUseExplosion.rb:21:140:21:149 | ... > ... | UseUseExplosion.rb:21:139:21:150 | [true] ( ... ) | +| UseUseExplosion.rb:21:140:21:149 | ... > ... | UseUseExplosion.rb:21:139:21:150 | ( ... ) | | UseUseExplosion.rb:21:152:21:3588 | then ... | UseUseExplosion.rb:21:136:21:3604 | if ... | | UseUseExplosion.rb:21:157:21:3588 | if ... | UseUseExplosion.rb:21:152:21:3588 | then ... | | UseUseExplosion.rb:21:161:21:165 | [post] self | UseUseExplosion.rb:21:182:21:186 | self | | UseUseExplosion.rb:21:161:21:165 | [post] self | UseUseExplosion.rb:21:3579:21:3584 | self | | UseUseExplosion.rb:21:161:21:165 | self | UseUseExplosion.rb:21:182:21:186 | self | | UseUseExplosion.rb:21:161:21:165 | self | UseUseExplosion.rb:21:3579:21:3584 | self | -| UseUseExplosion.rb:21:161:21:170 | ... > ... | UseUseExplosion.rb:21:160:21:171 | [false] ( ... ) | -| UseUseExplosion.rb:21:161:21:170 | ... > ... | UseUseExplosion.rb:21:160:21:171 | [true] ( ... ) | +| UseUseExplosion.rb:21:161:21:170 | ... > ... | UseUseExplosion.rb:21:160:21:171 | ( ... ) | | UseUseExplosion.rb:21:173:21:3572 | then ... | UseUseExplosion.rb:21:157:21:3588 | if ... | | UseUseExplosion.rb:21:178:21:3572 | if ... | UseUseExplosion.rb:21:173:21:3572 | then ... | | UseUseExplosion.rb:21:182:21:186 | [post] self | UseUseExplosion.rb:21:203:21:207 | self | | UseUseExplosion.rb:21:182:21:186 | [post] self | UseUseExplosion.rb:21:3563:21:3568 | self | | UseUseExplosion.rb:21:182:21:186 | self | UseUseExplosion.rb:21:203:21:207 | self | | UseUseExplosion.rb:21:182:21:186 | self | UseUseExplosion.rb:21:3563:21:3568 | self | -| UseUseExplosion.rb:21:182:21:191 | ... > ... | UseUseExplosion.rb:21:181:21:192 | [false] ( ... ) | -| UseUseExplosion.rb:21:182:21:191 | ... > ... | UseUseExplosion.rb:21:181:21:192 | [true] ( ... ) | +| UseUseExplosion.rb:21:182:21:191 | ... > ... | UseUseExplosion.rb:21:181:21:192 | ( ... ) | | UseUseExplosion.rb:21:194:21:3556 | then ... | UseUseExplosion.rb:21:178:21:3572 | if ... | | UseUseExplosion.rb:21:199:21:3556 | if ... | UseUseExplosion.rb:21:194:21:3556 | then ... | | UseUseExplosion.rb:21:203:21:207 | [post] self | UseUseExplosion.rb:21:224:21:228 | self | | UseUseExplosion.rb:21:203:21:207 | [post] self | UseUseExplosion.rb:21:3547:21:3552 | self | | UseUseExplosion.rb:21:203:21:207 | self | UseUseExplosion.rb:21:224:21:228 | self | | UseUseExplosion.rb:21:203:21:207 | self | UseUseExplosion.rb:21:3547:21:3552 | self | -| UseUseExplosion.rb:21:203:21:212 | ... > ... | UseUseExplosion.rb:21:202:21:213 | [false] ( ... ) | -| UseUseExplosion.rb:21:203:21:212 | ... > ... | UseUseExplosion.rb:21:202:21:213 | [true] ( ... ) | +| UseUseExplosion.rb:21:203:21:212 | ... > ... | UseUseExplosion.rb:21:202:21:213 | ( ... ) | | UseUseExplosion.rb:21:215:21:3540 | then ... | UseUseExplosion.rb:21:199:21:3556 | if ... | | UseUseExplosion.rb:21:220:21:3540 | if ... | UseUseExplosion.rb:21:215:21:3540 | then ... | | UseUseExplosion.rb:21:224:21:228 | [post] self | UseUseExplosion.rb:21:245:21:249 | self | | UseUseExplosion.rb:21:224:21:228 | [post] self | UseUseExplosion.rb:21:3531:21:3536 | self | | UseUseExplosion.rb:21:224:21:228 | self | UseUseExplosion.rb:21:245:21:249 | self | | UseUseExplosion.rb:21:224:21:228 | self | UseUseExplosion.rb:21:3531:21:3536 | self | -| UseUseExplosion.rb:21:224:21:233 | ... > ... | UseUseExplosion.rb:21:223:21:234 | [false] ( ... ) | -| UseUseExplosion.rb:21:224:21:233 | ... > ... | UseUseExplosion.rb:21:223:21:234 | [true] ( ... ) | +| UseUseExplosion.rb:21:224:21:233 | ... > ... | UseUseExplosion.rb:21:223:21:234 | ( ... ) | | UseUseExplosion.rb:21:236:21:3524 | then ... | UseUseExplosion.rb:21:220:21:3540 | if ... | | UseUseExplosion.rb:21:241:21:3524 | if ... | UseUseExplosion.rb:21:236:21:3524 | then ... | | UseUseExplosion.rb:21:245:21:249 | [post] self | UseUseExplosion.rb:21:266:21:270 | self | | UseUseExplosion.rb:21:245:21:249 | [post] self | UseUseExplosion.rb:21:3515:21:3520 | self | | UseUseExplosion.rb:21:245:21:249 | self | UseUseExplosion.rb:21:266:21:270 | self | | UseUseExplosion.rb:21:245:21:249 | self | UseUseExplosion.rb:21:3515:21:3520 | self | -| UseUseExplosion.rb:21:245:21:254 | ... > ... | UseUseExplosion.rb:21:244:21:255 | [false] ( ... ) | -| UseUseExplosion.rb:21:245:21:254 | ... > ... | UseUseExplosion.rb:21:244:21:255 | [true] ( ... ) | +| UseUseExplosion.rb:21:245:21:254 | ... > ... | UseUseExplosion.rb:21:244:21:255 | ( ... ) | | UseUseExplosion.rb:21:257:21:3508 | then ... | UseUseExplosion.rb:21:241:21:3524 | if ... | | UseUseExplosion.rb:21:262:21:3508 | if ... | UseUseExplosion.rb:21:257:21:3508 | then ... | | UseUseExplosion.rb:21:266:21:270 | [post] self | UseUseExplosion.rb:21:287:21:291 | self | | UseUseExplosion.rb:21:266:21:270 | [post] self | UseUseExplosion.rb:21:3499:21:3504 | self | | UseUseExplosion.rb:21:266:21:270 | self | UseUseExplosion.rb:21:287:21:291 | self | | UseUseExplosion.rb:21:266:21:270 | self | UseUseExplosion.rb:21:3499:21:3504 | self | -| UseUseExplosion.rb:21:266:21:275 | ... > ... | UseUseExplosion.rb:21:265:21:276 | [false] ( ... ) | -| UseUseExplosion.rb:21:266:21:275 | ... > ... | UseUseExplosion.rb:21:265:21:276 | [true] ( ... ) | +| UseUseExplosion.rb:21:266:21:275 | ... > ... | UseUseExplosion.rb:21:265:21:276 | ( ... ) | | UseUseExplosion.rb:21:278:21:3492 | then ... | UseUseExplosion.rb:21:262:21:3508 | if ... | | UseUseExplosion.rb:21:283:21:3492 | if ... | UseUseExplosion.rb:21:278:21:3492 | then ... | | UseUseExplosion.rb:21:287:21:291 | [post] self | UseUseExplosion.rb:21:308:21:312 | self | | UseUseExplosion.rb:21:287:21:291 | [post] self | UseUseExplosion.rb:21:3483:21:3488 | self | | UseUseExplosion.rb:21:287:21:291 | self | UseUseExplosion.rb:21:308:21:312 | self | | UseUseExplosion.rb:21:287:21:291 | self | UseUseExplosion.rb:21:3483:21:3488 | self | -| UseUseExplosion.rb:21:287:21:296 | ... > ... | UseUseExplosion.rb:21:286:21:297 | [false] ( ... ) | -| UseUseExplosion.rb:21:287:21:296 | ... > ... | UseUseExplosion.rb:21:286:21:297 | [true] ( ... ) | +| UseUseExplosion.rb:21:287:21:296 | ... > ... | UseUseExplosion.rb:21:286:21:297 | ( ... ) | | UseUseExplosion.rb:21:299:21:3476 | then ... | UseUseExplosion.rb:21:283:21:3492 | if ... | | UseUseExplosion.rb:21:304:21:3476 | if ... | UseUseExplosion.rb:21:299:21:3476 | then ... | | UseUseExplosion.rb:21:308:21:312 | [post] self | UseUseExplosion.rb:21:329:21:333 | self | | UseUseExplosion.rb:21:308:21:312 | [post] self | UseUseExplosion.rb:21:3467:21:3472 | self | | UseUseExplosion.rb:21:308:21:312 | self | UseUseExplosion.rb:21:329:21:333 | self | | UseUseExplosion.rb:21:308:21:312 | self | UseUseExplosion.rb:21:3467:21:3472 | self | -| UseUseExplosion.rb:21:308:21:317 | ... > ... | UseUseExplosion.rb:21:307:21:318 | [false] ( ... ) | -| UseUseExplosion.rb:21:308:21:317 | ... > ... | UseUseExplosion.rb:21:307:21:318 | [true] ( ... ) | +| UseUseExplosion.rb:21:308:21:317 | ... > ... | UseUseExplosion.rb:21:307:21:318 | ( ... ) | | UseUseExplosion.rb:21:320:21:3460 | then ... | UseUseExplosion.rb:21:304:21:3476 | if ... | | UseUseExplosion.rb:21:325:21:3460 | if ... | UseUseExplosion.rb:21:320:21:3460 | then ... | | UseUseExplosion.rb:21:329:21:333 | [post] self | UseUseExplosion.rb:21:350:21:354 | self | | UseUseExplosion.rb:21:329:21:333 | [post] self | UseUseExplosion.rb:21:3451:21:3456 | self | | UseUseExplosion.rb:21:329:21:333 | self | UseUseExplosion.rb:21:350:21:354 | self | | UseUseExplosion.rb:21:329:21:333 | self | UseUseExplosion.rb:21:3451:21:3456 | self | -| UseUseExplosion.rb:21:329:21:338 | ... > ... | UseUseExplosion.rb:21:328:21:339 | [false] ( ... ) | -| UseUseExplosion.rb:21:329:21:338 | ... > ... | UseUseExplosion.rb:21:328:21:339 | [true] ( ... ) | +| UseUseExplosion.rb:21:329:21:338 | ... > ... | UseUseExplosion.rb:21:328:21:339 | ( ... ) | | UseUseExplosion.rb:21:341:21:3444 | then ... | UseUseExplosion.rb:21:325:21:3460 | if ... | | UseUseExplosion.rb:21:346:21:3444 | if ... | UseUseExplosion.rb:21:341:21:3444 | then ... | | UseUseExplosion.rb:21:350:21:354 | [post] self | UseUseExplosion.rb:21:371:21:375 | self | | UseUseExplosion.rb:21:350:21:354 | [post] self | UseUseExplosion.rb:21:3435:21:3440 | self | | UseUseExplosion.rb:21:350:21:354 | self | UseUseExplosion.rb:21:371:21:375 | self | | UseUseExplosion.rb:21:350:21:354 | self | UseUseExplosion.rb:21:3435:21:3440 | self | -| UseUseExplosion.rb:21:350:21:359 | ... > ... | UseUseExplosion.rb:21:349:21:360 | [false] ( ... ) | -| UseUseExplosion.rb:21:350:21:359 | ... > ... | UseUseExplosion.rb:21:349:21:360 | [true] ( ... ) | +| UseUseExplosion.rb:21:350:21:359 | ... > ... | UseUseExplosion.rb:21:349:21:360 | ( ... ) | | UseUseExplosion.rb:21:362:21:3428 | then ... | UseUseExplosion.rb:21:346:21:3444 | if ... | | UseUseExplosion.rb:21:367:21:3428 | if ... | UseUseExplosion.rb:21:362:21:3428 | then ... | | UseUseExplosion.rb:21:371:21:375 | [post] self | UseUseExplosion.rb:21:392:21:396 | self | | UseUseExplosion.rb:21:371:21:375 | [post] self | UseUseExplosion.rb:21:3419:21:3424 | self | | UseUseExplosion.rb:21:371:21:375 | self | UseUseExplosion.rb:21:392:21:396 | self | | UseUseExplosion.rb:21:371:21:375 | self | UseUseExplosion.rb:21:3419:21:3424 | self | -| UseUseExplosion.rb:21:371:21:380 | ... > ... | UseUseExplosion.rb:21:370:21:381 | [false] ( ... ) | -| UseUseExplosion.rb:21:371:21:380 | ... > ... | UseUseExplosion.rb:21:370:21:381 | [true] ( ... ) | +| UseUseExplosion.rb:21:371:21:380 | ... > ... | UseUseExplosion.rb:21:370:21:381 | ( ... ) | | UseUseExplosion.rb:21:383:21:3412 | then ... | UseUseExplosion.rb:21:367:21:3428 | if ... | | UseUseExplosion.rb:21:388:21:3412 | if ... | UseUseExplosion.rb:21:383:21:3412 | then ... | | UseUseExplosion.rb:21:392:21:396 | [post] self | UseUseExplosion.rb:21:413:21:417 | self | | UseUseExplosion.rb:21:392:21:396 | [post] self | UseUseExplosion.rb:21:3403:21:3408 | self | | UseUseExplosion.rb:21:392:21:396 | self | UseUseExplosion.rb:21:413:21:417 | self | | UseUseExplosion.rb:21:392:21:396 | self | UseUseExplosion.rb:21:3403:21:3408 | self | -| UseUseExplosion.rb:21:392:21:401 | ... > ... | UseUseExplosion.rb:21:391:21:402 | [false] ( ... ) | -| UseUseExplosion.rb:21:392:21:401 | ... > ... | UseUseExplosion.rb:21:391:21:402 | [true] ( ... ) | +| UseUseExplosion.rb:21:392:21:401 | ... > ... | UseUseExplosion.rb:21:391:21:402 | ( ... ) | | UseUseExplosion.rb:21:404:21:3396 | then ... | UseUseExplosion.rb:21:388:21:3412 | if ... | | UseUseExplosion.rb:21:409:21:3396 | if ... | UseUseExplosion.rb:21:404:21:3396 | then ... | | UseUseExplosion.rb:21:413:21:417 | [post] self | UseUseExplosion.rb:21:434:21:438 | self | | UseUseExplosion.rb:21:413:21:417 | [post] self | UseUseExplosion.rb:21:3387:21:3392 | self | | UseUseExplosion.rb:21:413:21:417 | self | UseUseExplosion.rb:21:434:21:438 | self | | UseUseExplosion.rb:21:413:21:417 | self | UseUseExplosion.rb:21:3387:21:3392 | self | -| UseUseExplosion.rb:21:413:21:422 | ... > ... | UseUseExplosion.rb:21:412:21:423 | [false] ( ... ) | -| UseUseExplosion.rb:21:413:21:422 | ... > ... | UseUseExplosion.rb:21:412:21:423 | [true] ( ... ) | +| UseUseExplosion.rb:21:413:21:422 | ... > ... | UseUseExplosion.rb:21:412:21:423 | ( ... ) | | UseUseExplosion.rb:21:425:21:3380 | then ... | UseUseExplosion.rb:21:409:21:3396 | if ... | | UseUseExplosion.rb:21:430:21:3380 | if ... | UseUseExplosion.rb:21:425:21:3380 | then ... | | UseUseExplosion.rb:21:434:21:438 | [post] self | UseUseExplosion.rb:21:455:21:459 | self | | UseUseExplosion.rb:21:434:21:438 | [post] self | UseUseExplosion.rb:21:3371:21:3376 | self | | UseUseExplosion.rb:21:434:21:438 | self | UseUseExplosion.rb:21:455:21:459 | self | | UseUseExplosion.rb:21:434:21:438 | self | UseUseExplosion.rb:21:3371:21:3376 | self | -| UseUseExplosion.rb:21:434:21:443 | ... > ... | UseUseExplosion.rb:21:433:21:444 | [false] ( ... ) | -| UseUseExplosion.rb:21:434:21:443 | ... > ... | UseUseExplosion.rb:21:433:21:444 | [true] ( ... ) | +| UseUseExplosion.rb:21:434:21:443 | ... > ... | UseUseExplosion.rb:21:433:21:444 | ( ... ) | | UseUseExplosion.rb:21:446:21:3364 | then ... | UseUseExplosion.rb:21:430:21:3380 | if ... | | UseUseExplosion.rb:21:451:21:3364 | if ... | UseUseExplosion.rb:21:446:21:3364 | then ... | | UseUseExplosion.rb:21:455:21:459 | [post] self | UseUseExplosion.rb:21:476:21:480 | self | | UseUseExplosion.rb:21:455:21:459 | [post] self | UseUseExplosion.rb:21:3355:21:3360 | self | | UseUseExplosion.rb:21:455:21:459 | self | UseUseExplosion.rb:21:476:21:480 | self | | UseUseExplosion.rb:21:455:21:459 | self | UseUseExplosion.rb:21:3355:21:3360 | self | -| UseUseExplosion.rb:21:455:21:464 | ... > ... | UseUseExplosion.rb:21:454:21:465 | [false] ( ... ) | -| UseUseExplosion.rb:21:455:21:464 | ... > ... | UseUseExplosion.rb:21:454:21:465 | [true] ( ... ) | +| UseUseExplosion.rb:21:455:21:464 | ... > ... | UseUseExplosion.rb:21:454:21:465 | ( ... ) | | UseUseExplosion.rb:21:467:21:3348 | then ... | UseUseExplosion.rb:21:451:21:3364 | if ... | | UseUseExplosion.rb:21:472:21:3348 | if ... | UseUseExplosion.rb:21:467:21:3348 | then ... | | UseUseExplosion.rb:21:476:21:480 | [post] self | UseUseExplosion.rb:21:497:21:501 | self | | UseUseExplosion.rb:21:476:21:480 | [post] self | UseUseExplosion.rb:21:3339:21:3344 | self | | UseUseExplosion.rb:21:476:21:480 | self | UseUseExplosion.rb:21:497:21:501 | self | | UseUseExplosion.rb:21:476:21:480 | self | UseUseExplosion.rb:21:3339:21:3344 | self | -| UseUseExplosion.rb:21:476:21:485 | ... > ... | UseUseExplosion.rb:21:475:21:486 | [false] ( ... ) | -| UseUseExplosion.rb:21:476:21:485 | ... > ... | UseUseExplosion.rb:21:475:21:486 | [true] ( ... ) | +| UseUseExplosion.rb:21:476:21:485 | ... > ... | UseUseExplosion.rb:21:475:21:486 | ( ... ) | | UseUseExplosion.rb:21:488:21:3332 | then ... | UseUseExplosion.rb:21:472:21:3348 | if ... | | UseUseExplosion.rb:21:493:21:3332 | if ... | UseUseExplosion.rb:21:488:21:3332 | then ... | | UseUseExplosion.rb:21:497:21:501 | [post] self | UseUseExplosion.rb:21:518:21:522 | self | | UseUseExplosion.rb:21:497:21:501 | [post] self | UseUseExplosion.rb:21:3323:21:3328 | self | | UseUseExplosion.rb:21:497:21:501 | self | UseUseExplosion.rb:21:518:21:522 | self | | UseUseExplosion.rb:21:497:21:501 | self | UseUseExplosion.rb:21:3323:21:3328 | self | -| UseUseExplosion.rb:21:497:21:506 | ... > ... | UseUseExplosion.rb:21:496:21:507 | [false] ( ... ) | -| UseUseExplosion.rb:21:497:21:506 | ... > ... | UseUseExplosion.rb:21:496:21:507 | [true] ( ... ) | +| UseUseExplosion.rb:21:497:21:506 | ... > ... | UseUseExplosion.rb:21:496:21:507 | ( ... ) | | UseUseExplosion.rb:21:509:21:3316 | then ... | UseUseExplosion.rb:21:493:21:3332 | if ... | | UseUseExplosion.rb:21:514:21:3316 | if ... | UseUseExplosion.rb:21:509:21:3316 | then ... | | UseUseExplosion.rb:21:518:21:522 | [post] self | UseUseExplosion.rb:21:539:21:543 | self | | UseUseExplosion.rb:21:518:21:522 | [post] self | UseUseExplosion.rb:21:3307:21:3312 | self | | UseUseExplosion.rb:21:518:21:522 | self | UseUseExplosion.rb:21:539:21:543 | self | | UseUseExplosion.rb:21:518:21:522 | self | UseUseExplosion.rb:21:3307:21:3312 | self | -| UseUseExplosion.rb:21:518:21:527 | ... > ... | UseUseExplosion.rb:21:517:21:528 | [false] ( ... ) | -| UseUseExplosion.rb:21:518:21:527 | ... > ... | UseUseExplosion.rb:21:517:21:528 | [true] ( ... ) | +| UseUseExplosion.rb:21:518:21:527 | ... > ... | UseUseExplosion.rb:21:517:21:528 | ( ... ) | | UseUseExplosion.rb:21:530:21:3300 | then ... | UseUseExplosion.rb:21:514:21:3316 | if ... | | UseUseExplosion.rb:21:535:21:3300 | if ... | UseUseExplosion.rb:21:530:21:3300 | then ... | | UseUseExplosion.rb:21:539:21:543 | [post] self | UseUseExplosion.rb:21:560:21:564 | self | | UseUseExplosion.rb:21:539:21:543 | [post] self | UseUseExplosion.rb:21:3291:21:3296 | self | | UseUseExplosion.rb:21:539:21:543 | self | UseUseExplosion.rb:21:560:21:564 | self | | UseUseExplosion.rb:21:539:21:543 | self | UseUseExplosion.rb:21:3291:21:3296 | self | -| UseUseExplosion.rb:21:539:21:548 | ... > ... | UseUseExplosion.rb:21:538:21:549 | [false] ( ... ) | -| UseUseExplosion.rb:21:539:21:548 | ... > ... | UseUseExplosion.rb:21:538:21:549 | [true] ( ... ) | +| UseUseExplosion.rb:21:539:21:548 | ... > ... | UseUseExplosion.rb:21:538:21:549 | ( ... ) | | UseUseExplosion.rb:21:551:21:3284 | then ... | UseUseExplosion.rb:21:535:21:3300 | if ... | | UseUseExplosion.rb:21:556:21:3284 | if ... | UseUseExplosion.rb:21:551:21:3284 | then ... | | UseUseExplosion.rb:21:560:21:564 | [post] self | UseUseExplosion.rb:21:581:21:585 | self | | UseUseExplosion.rb:21:560:21:564 | [post] self | UseUseExplosion.rb:21:3275:21:3280 | self | | UseUseExplosion.rb:21:560:21:564 | self | UseUseExplosion.rb:21:581:21:585 | self | | UseUseExplosion.rb:21:560:21:564 | self | UseUseExplosion.rb:21:3275:21:3280 | self | -| UseUseExplosion.rb:21:560:21:569 | ... > ... | UseUseExplosion.rb:21:559:21:570 | [false] ( ... ) | -| UseUseExplosion.rb:21:560:21:569 | ... > ... | UseUseExplosion.rb:21:559:21:570 | [true] ( ... ) | +| UseUseExplosion.rb:21:560:21:569 | ... > ... | UseUseExplosion.rb:21:559:21:570 | ( ... ) | | UseUseExplosion.rb:21:572:21:3268 | then ... | UseUseExplosion.rb:21:556:21:3284 | if ... | | UseUseExplosion.rb:21:577:21:3268 | if ... | UseUseExplosion.rb:21:572:21:3268 | then ... | | UseUseExplosion.rb:21:581:21:585 | [post] self | UseUseExplosion.rb:21:602:21:606 | self | | UseUseExplosion.rb:21:581:21:585 | [post] self | UseUseExplosion.rb:21:3259:21:3264 | self | | UseUseExplosion.rb:21:581:21:585 | self | UseUseExplosion.rb:21:602:21:606 | self | | UseUseExplosion.rb:21:581:21:585 | self | UseUseExplosion.rb:21:3259:21:3264 | self | -| UseUseExplosion.rb:21:581:21:590 | ... > ... | UseUseExplosion.rb:21:580:21:591 | [false] ( ... ) | -| UseUseExplosion.rb:21:581:21:590 | ... > ... | UseUseExplosion.rb:21:580:21:591 | [true] ( ... ) | +| UseUseExplosion.rb:21:581:21:590 | ... > ... | UseUseExplosion.rb:21:580:21:591 | ( ... ) | | UseUseExplosion.rb:21:593:21:3252 | then ... | UseUseExplosion.rb:21:577:21:3268 | if ... | | UseUseExplosion.rb:21:598:21:3252 | if ... | UseUseExplosion.rb:21:593:21:3252 | then ... | | UseUseExplosion.rb:21:602:21:606 | [post] self | UseUseExplosion.rb:21:623:21:627 | self | | UseUseExplosion.rb:21:602:21:606 | [post] self | UseUseExplosion.rb:21:3243:21:3248 | self | | UseUseExplosion.rb:21:602:21:606 | self | UseUseExplosion.rb:21:623:21:627 | self | | UseUseExplosion.rb:21:602:21:606 | self | UseUseExplosion.rb:21:3243:21:3248 | self | -| UseUseExplosion.rb:21:602:21:611 | ... > ... | UseUseExplosion.rb:21:601:21:612 | [false] ( ... ) | -| UseUseExplosion.rb:21:602:21:611 | ... > ... | UseUseExplosion.rb:21:601:21:612 | [true] ( ... ) | +| UseUseExplosion.rb:21:602:21:611 | ... > ... | UseUseExplosion.rb:21:601:21:612 | ( ... ) | | UseUseExplosion.rb:21:614:21:3236 | then ... | UseUseExplosion.rb:21:598:21:3252 | if ... | | UseUseExplosion.rb:21:619:21:3236 | if ... | UseUseExplosion.rb:21:614:21:3236 | then ... | | UseUseExplosion.rb:21:623:21:627 | [post] self | UseUseExplosion.rb:21:644:21:648 | self | | UseUseExplosion.rb:21:623:21:627 | [post] self | UseUseExplosion.rb:21:3227:21:3232 | self | | UseUseExplosion.rb:21:623:21:627 | self | UseUseExplosion.rb:21:644:21:648 | self | | UseUseExplosion.rb:21:623:21:627 | self | UseUseExplosion.rb:21:3227:21:3232 | self | -| UseUseExplosion.rb:21:623:21:632 | ... > ... | UseUseExplosion.rb:21:622:21:633 | [false] ( ... ) | -| UseUseExplosion.rb:21:623:21:632 | ... > ... | UseUseExplosion.rb:21:622:21:633 | [true] ( ... ) | +| UseUseExplosion.rb:21:623:21:632 | ... > ... | UseUseExplosion.rb:21:622:21:633 | ( ... ) | | UseUseExplosion.rb:21:635:21:3220 | then ... | UseUseExplosion.rb:21:619:21:3236 | if ... | | UseUseExplosion.rb:21:640:21:3220 | if ... | UseUseExplosion.rb:21:635:21:3220 | then ... | | UseUseExplosion.rb:21:644:21:648 | [post] self | UseUseExplosion.rb:21:665:21:669 | self | | UseUseExplosion.rb:21:644:21:648 | [post] self | UseUseExplosion.rb:21:3211:21:3216 | self | | UseUseExplosion.rb:21:644:21:648 | self | UseUseExplosion.rb:21:665:21:669 | self | | UseUseExplosion.rb:21:644:21:648 | self | UseUseExplosion.rb:21:3211:21:3216 | self | -| UseUseExplosion.rb:21:644:21:653 | ... > ... | UseUseExplosion.rb:21:643:21:654 | [false] ( ... ) | -| UseUseExplosion.rb:21:644:21:653 | ... > ... | UseUseExplosion.rb:21:643:21:654 | [true] ( ... ) | +| UseUseExplosion.rb:21:644:21:653 | ... > ... | UseUseExplosion.rb:21:643:21:654 | ( ... ) | | UseUseExplosion.rb:21:656:21:3204 | then ... | UseUseExplosion.rb:21:640:21:3220 | if ... | | UseUseExplosion.rb:21:661:21:3204 | if ... | UseUseExplosion.rb:21:656:21:3204 | then ... | | UseUseExplosion.rb:21:665:21:669 | [post] self | UseUseExplosion.rb:21:686:21:690 | self | | UseUseExplosion.rb:21:665:21:669 | [post] self | UseUseExplosion.rb:21:3195:21:3200 | self | | UseUseExplosion.rb:21:665:21:669 | self | UseUseExplosion.rb:21:686:21:690 | self | | UseUseExplosion.rb:21:665:21:669 | self | UseUseExplosion.rb:21:3195:21:3200 | self | -| UseUseExplosion.rb:21:665:21:674 | ... > ... | UseUseExplosion.rb:21:664:21:675 | [false] ( ... ) | -| UseUseExplosion.rb:21:665:21:674 | ... > ... | UseUseExplosion.rb:21:664:21:675 | [true] ( ... ) | +| UseUseExplosion.rb:21:665:21:674 | ... > ... | UseUseExplosion.rb:21:664:21:675 | ( ... ) | | UseUseExplosion.rb:21:677:21:3188 | then ... | UseUseExplosion.rb:21:661:21:3204 | if ... | | UseUseExplosion.rb:21:682:21:3188 | if ... | UseUseExplosion.rb:21:677:21:3188 | then ... | | UseUseExplosion.rb:21:686:21:690 | [post] self | UseUseExplosion.rb:21:707:21:711 | self | | UseUseExplosion.rb:21:686:21:690 | [post] self | UseUseExplosion.rb:21:3179:21:3184 | self | | UseUseExplosion.rb:21:686:21:690 | self | UseUseExplosion.rb:21:707:21:711 | self | | UseUseExplosion.rb:21:686:21:690 | self | UseUseExplosion.rb:21:3179:21:3184 | self | -| UseUseExplosion.rb:21:686:21:695 | ... > ... | UseUseExplosion.rb:21:685:21:696 | [false] ( ... ) | -| UseUseExplosion.rb:21:686:21:695 | ... > ... | UseUseExplosion.rb:21:685:21:696 | [true] ( ... ) | +| UseUseExplosion.rb:21:686:21:695 | ... > ... | UseUseExplosion.rb:21:685:21:696 | ( ... ) | | UseUseExplosion.rb:21:698:21:3172 | then ... | UseUseExplosion.rb:21:682:21:3188 | if ... | | UseUseExplosion.rb:21:703:21:3172 | if ... | UseUseExplosion.rb:21:698:21:3172 | then ... | | UseUseExplosion.rb:21:707:21:711 | [post] self | UseUseExplosion.rb:21:728:21:732 | self | | UseUseExplosion.rb:21:707:21:711 | [post] self | UseUseExplosion.rb:21:3163:21:3168 | self | | UseUseExplosion.rb:21:707:21:711 | self | UseUseExplosion.rb:21:728:21:732 | self | | UseUseExplosion.rb:21:707:21:711 | self | UseUseExplosion.rb:21:3163:21:3168 | self | -| UseUseExplosion.rb:21:707:21:716 | ... > ... | UseUseExplosion.rb:21:706:21:717 | [false] ( ... ) | -| UseUseExplosion.rb:21:707:21:716 | ... > ... | UseUseExplosion.rb:21:706:21:717 | [true] ( ... ) | +| UseUseExplosion.rb:21:707:21:716 | ... > ... | UseUseExplosion.rb:21:706:21:717 | ( ... ) | | UseUseExplosion.rb:21:719:21:3156 | then ... | UseUseExplosion.rb:21:703:21:3172 | if ... | | UseUseExplosion.rb:21:724:21:3156 | if ... | UseUseExplosion.rb:21:719:21:3156 | then ... | | UseUseExplosion.rb:21:728:21:732 | [post] self | UseUseExplosion.rb:21:749:21:753 | self | | UseUseExplosion.rb:21:728:21:732 | [post] self | UseUseExplosion.rb:21:3147:21:3152 | self | | UseUseExplosion.rb:21:728:21:732 | self | UseUseExplosion.rb:21:749:21:753 | self | | UseUseExplosion.rb:21:728:21:732 | self | UseUseExplosion.rb:21:3147:21:3152 | self | -| UseUseExplosion.rb:21:728:21:737 | ... > ... | UseUseExplosion.rb:21:727:21:738 | [false] ( ... ) | -| UseUseExplosion.rb:21:728:21:737 | ... > ... | UseUseExplosion.rb:21:727:21:738 | [true] ( ... ) | +| UseUseExplosion.rb:21:728:21:737 | ... > ... | UseUseExplosion.rb:21:727:21:738 | ( ... ) | | UseUseExplosion.rb:21:740:21:3140 | then ... | UseUseExplosion.rb:21:724:21:3156 | if ... | | UseUseExplosion.rb:21:745:21:3140 | if ... | UseUseExplosion.rb:21:740:21:3140 | then ... | | UseUseExplosion.rb:21:749:21:753 | [post] self | UseUseExplosion.rb:21:770:21:774 | self | | UseUseExplosion.rb:21:749:21:753 | [post] self | UseUseExplosion.rb:21:3131:21:3136 | self | | UseUseExplosion.rb:21:749:21:753 | self | UseUseExplosion.rb:21:770:21:774 | self | | UseUseExplosion.rb:21:749:21:753 | self | UseUseExplosion.rb:21:3131:21:3136 | self | -| UseUseExplosion.rb:21:749:21:758 | ... > ... | UseUseExplosion.rb:21:748:21:759 | [false] ( ... ) | -| UseUseExplosion.rb:21:749:21:758 | ... > ... | UseUseExplosion.rb:21:748:21:759 | [true] ( ... ) | +| UseUseExplosion.rb:21:749:21:758 | ... > ... | UseUseExplosion.rb:21:748:21:759 | ( ... ) | | UseUseExplosion.rb:21:761:21:3124 | then ... | UseUseExplosion.rb:21:745:21:3140 | if ... | | UseUseExplosion.rb:21:766:21:3124 | if ... | UseUseExplosion.rb:21:761:21:3124 | then ... | | UseUseExplosion.rb:21:770:21:774 | [post] self | UseUseExplosion.rb:21:791:21:795 | self | | UseUseExplosion.rb:21:770:21:774 | [post] self | UseUseExplosion.rb:21:3115:21:3120 | self | | UseUseExplosion.rb:21:770:21:774 | self | UseUseExplosion.rb:21:791:21:795 | self | | UseUseExplosion.rb:21:770:21:774 | self | UseUseExplosion.rb:21:3115:21:3120 | self | -| UseUseExplosion.rb:21:770:21:779 | ... > ... | UseUseExplosion.rb:21:769:21:780 | [false] ( ... ) | -| UseUseExplosion.rb:21:770:21:779 | ... > ... | UseUseExplosion.rb:21:769:21:780 | [true] ( ... ) | +| UseUseExplosion.rb:21:770:21:779 | ... > ... | UseUseExplosion.rb:21:769:21:780 | ( ... ) | | UseUseExplosion.rb:21:782:21:3108 | then ... | UseUseExplosion.rb:21:766:21:3124 | if ... | | UseUseExplosion.rb:21:787:21:3108 | if ... | UseUseExplosion.rb:21:782:21:3108 | then ... | | UseUseExplosion.rb:21:791:21:795 | [post] self | UseUseExplosion.rb:21:812:21:816 | self | | UseUseExplosion.rb:21:791:21:795 | [post] self | UseUseExplosion.rb:21:3099:21:3104 | self | | UseUseExplosion.rb:21:791:21:795 | self | UseUseExplosion.rb:21:812:21:816 | self | | UseUseExplosion.rb:21:791:21:795 | self | UseUseExplosion.rb:21:3099:21:3104 | self | -| UseUseExplosion.rb:21:791:21:800 | ... > ... | UseUseExplosion.rb:21:790:21:801 | [false] ( ... ) | -| UseUseExplosion.rb:21:791:21:800 | ... > ... | UseUseExplosion.rb:21:790:21:801 | [true] ( ... ) | +| UseUseExplosion.rb:21:791:21:800 | ... > ... | UseUseExplosion.rb:21:790:21:801 | ( ... ) | | UseUseExplosion.rb:21:803:21:3092 | then ... | UseUseExplosion.rb:21:787:21:3108 | if ... | | UseUseExplosion.rb:21:808:21:3092 | if ... | UseUseExplosion.rb:21:803:21:3092 | then ... | | UseUseExplosion.rb:21:812:21:816 | [post] self | UseUseExplosion.rb:21:833:21:837 | self | | UseUseExplosion.rb:21:812:21:816 | [post] self | UseUseExplosion.rb:21:3083:21:3088 | self | | UseUseExplosion.rb:21:812:21:816 | self | UseUseExplosion.rb:21:833:21:837 | self | | UseUseExplosion.rb:21:812:21:816 | self | UseUseExplosion.rb:21:3083:21:3088 | self | -| UseUseExplosion.rb:21:812:21:821 | ... > ... | UseUseExplosion.rb:21:811:21:822 | [false] ( ... ) | -| UseUseExplosion.rb:21:812:21:821 | ... > ... | UseUseExplosion.rb:21:811:21:822 | [true] ( ... ) | +| UseUseExplosion.rb:21:812:21:821 | ... > ... | UseUseExplosion.rb:21:811:21:822 | ( ... ) | | UseUseExplosion.rb:21:824:21:3076 | then ... | UseUseExplosion.rb:21:808:21:3092 | if ... | | UseUseExplosion.rb:21:829:21:3076 | if ... | UseUseExplosion.rb:21:824:21:3076 | then ... | | UseUseExplosion.rb:21:833:21:837 | [post] self | UseUseExplosion.rb:21:854:21:858 | self | | UseUseExplosion.rb:21:833:21:837 | [post] self | UseUseExplosion.rb:21:3067:21:3072 | self | | UseUseExplosion.rb:21:833:21:837 | self | UseUseExplosion.rb:21:854:21:858 | self | | UseUseExplosion.rb:21:833:21:837 | self | UseUseExplosion.rb:21:3067:21:3072 | self | -| UseUseExplosion.rb:21:833:21:842 | ... > ... | UseUseExplosion.rb:21:832:21:843 | [false] ( ... ) | -| UseUseExplosion.rb:21:833:21:842 | ... > ... | UseUseExplosion.rb:21:832:21:843 | [true] ( ... ) | +| UseUseExplosion.rb:21:833:21:842 | ... > ... | UseUseExplosion.rb:21:832:21:843 | ( ... ) | | UseUseExplosion.rb:21:845:21:3060 | then ... | UseUseExplosion.rb:21:829:21:3076 | if ... | | UseUseExplosion.rb:21:850:21:3060 | if ... | UseUseExplosion.rb:21:845:21:3060 | then ... | | UseUseExplosion.rb:21:854:21:858 | [post] self | UseUseExplosion.rb:21:875:21:879 | self | | UseUseExplosion.rb:21:854:21:858 | [post] self | UseUseExplosion.rb:21:3051:21:3056 | self | | UseUseExplosion.rb:21:854:21:858 | self | UseUseExplosion.rb:21:875:21:879 | self | | UseUseExplosion.rb:21:854:21:858 | self | UseUseExplosion.rb:21:3051:21:3056 | self | -| UseUseExplosion.rb:21:854:21:863 | ... > ... | UseUseExplosion.rb:21:853:21:864 | [false] ( ... ) | -| UseUseExplosion.rb:21:854:21:863 | ... > ... | UseUseExplosion.rb:21:853:21:864 | [true] ( ... ) | +| UseUseExplosion.rb:21:854:21:863 | ... > ... | UseUseExplosion.rb:21:853:21:864 | ( ... ) | | UseUseExplosion.rb:21:866:21:3044 | then ... | UseUseExplosion.rb:21:850:21:3060 | if ... | | UseUseExplosion.rb:21:871:21:3044 | if ... | UseUseExplosion.rb:21:866:21:3044 | then ... | | UseUseExplosion.rb:21:875:21:879 | [post] self | UseUseExplosion.rb:21:896:21:900 | self | | UseUseExplosion.rb:21:875:21:879 | [post] self | UseUseExplosion.rb:21:3035:21:3040 | self | | UseUseExplosion.rb:21:875:21:879 | self | UseUseExplosion.rb:21:896:21:900 | self | | UseUseExplosion.rb:21:875:21:879 | self | UseUseExplosion.rb:21:3035:21:3040 | self | -| UseUseExplosion.rb:21:875:21:884 | ... > ... | UseUseExplosion.rb:21:874:21:885 | [false] ( ... ) | -| UseUseExplosion.rb:21:875:21:884 | ... > ... | UseUseExplosion.rb:21:874:21:885 | [true] ( ... ) | +| UseUseExplosion.rb:21:875:21:884 | ... > ... | UseUseExplosion.rb:21:874:21:885 | ( ... ) | | UseUseExplosion.rb:21:887:21:3028 | then ... | UseUseExplosion.rb:21:871:21:3044 | if ... | | UseUseExplosion.rb:21:892:21:3028 | if ... | UseUseExplosion.rb:21:887:21:3028 | then ... | | UseUseExplosion.rb:21:896:21:900 | [post] self | UseUseExplosion.rb:21:917:21:921 | self | | UseUseExplosion.rb:21:896:21:900 | [post] self | UseUseExplosion.rb:21:3019:21:3024 | self | | UseUseExplosion.rb:21:896:21:900 | self | UseUseExplosion.rb:21:917:21:921 | self | | UseUseExplosion.rb:21:896:21:900 | self | UseUseExplosion.rb:21:3019:21:3024 | self | -| UseUseExplosion.rb:21:896:21:905 | ... > ... | UseUseExplosion.rb:21:895:21:906 | [false] ( ... ) | -| UseUseExplosion.rb:21:896:21:905 | ... > ... | UseUseExplosion.rb:21:895:21:906 | [true] ( ... ) | +| UseUseExplosion.rb:21:896:21:905 | ... > ... | UseUseExplosion.rb:21:895:21:906 | ( ... ) | | UseUseExplosion.rb:21:908:21:3012 | then ... | UseUseExplosion.rb:21:892:21:3028 | if ... | | UseUseExplosion.rb:21:913:21:3012 | if ... | UseUseExplosion.rb:21:908:21:3012 | then ... | | UseUseExplosion.rb:21:917:21:921 | [post] self | UseUseExplosion.rb:21:938:21:942 | self | | UseUseExplosion.rb:21:917:21:921 | [post] self | UseUseExplosion.rb:21:3003:21:3008 | self | | UseUseExplosion.rb:21:917:21:921 | self | UseUseExplosion.rb:21:938:21:942 | self | | UseUseExplosion.rb:21:917:21:921 | self | UseUseExplosion.rb:21:3003:21:3008 | self | -| UseUseExplosion.rb:21:917:21:926 | ... > ... | UseUseExplosion.rb:21:916:21:927 | [false] ( ... ) | -| UseUseExplosion.rb:21:917:21:926 | ... > ... | UseUseExplosion.rb:21:916:21:927 | [true] ( ... ) | +| UseUseExplosion.rb:21:917:21:926 | ... > ... | UseUseExplosion.rb:21:916:21:927 | ( ... ) | | UseUseExplosion.rb:21:929:21:2996 | then ... | UseUseExplosion.rb:21:913:21:3012 | if ... | | UseUseExplosion.rb:21:934:21:2996 | if ... | UseUseExplosion.rb:21:929:21:2996 | then ... | | UseUseExplosion.rb:21:938:21:942 | [post] self | UseUseExplosion.rb:21:959:21:963 | self | | UseUseExplosion.rb:21:938:21:942 | [post] self | UseUseExplosion.rb:21:2987:21:2992 | self | | UseUseExplosion.rb:21:938:21:942 | self | UseUseExplosion.rb:21:959:21:963 | self | | UseUseExplosion.rb:21:938:21:942 | self | UseUseExplosion.rb:21:2987:21:2992 | self | -| UseUseExplosion.rb:21:938:21:947 | ... > ... | UseUseExplosion.rb:21:937:21:948 | [false] ( ... ) | -| UseUseExplosion.rb:21:938:21:947 | ... > ... | UseUseExplosion.rb:21:937:21:948 | [true] ( ... ) | +| UseUseExplosion.rb:21:938:21:947 | ... > ... | UseUseExplosion.rb:21:937:21:948 | ( ... ) | | UseUseExplosion.rb:21:950:21:2980 | then ... | UseUseExplosion.rb:21:934:21:2996 | if ... | | UseUseExplosion.rb:21:955:21:2980 | if ... | UseUseExplosion.rb:21:950:21:2980 | then ... | | UseUseExplosion.rb:21:959:21:963 | [post] self | UseUseExplosion.rb:21:980:21:984 | self | | UseUseExplosion.rb:21:959:21:963 | [post] self | UseUseExplosion.rb:21:2971:21:2976 | self | | UseUseExplosion.rb:21:959:21:963 | self | UseUseExplosion.rb:21:980:21:984 | self | | UseUseExplosion.rb:21:959:21:963 | self | UseUseExplosion.rb:21:2971:21:2976 | self | -| UseUseExplosion.rb:21:959:21:968 | ... > ... | UseUseExplosion.rb:21:958:21:969 | [false] ( ... ) | -| UseUseExplosion.rb:21:959:21:968 | ... > ... | UseUseExplosion.rb:21:958:21:969 | [true] ( ... ) | +| UseUseExplosion.rb:21:959:21:968 | ... > ... | UseUseExplosion.rb:21:958:21:969 | ( ... ) | | UseUseExplosion.rb:21:971:21:2964 | then ... | UseUseExplosion.rb:21:955:21:2980 | if ... | | UseUseExplosion.rb:21:976:21:2964 | if ... | UseUseExplosion.rb:21:971:21:2964 | then ... | | UseUseExplosion.rb:21:980:21:984 | [post] self | UseUseExplosion.rb:21:1001:21:1005 | self | | UseUseExplosion.rb:21:980:21:984 | [post] self | UseUseExplosion.rb:21:2955:21:2960 | self | | UseUseExplosion.rb:21:980:21:984 | self | UseUseExplosion.rb:21:1001:21:1005 | self | | UseUseExplosion.rb:21:980:21:984 | self | UseUseExplosion.rb:21:2955:21:2960 | self | -| UseUseExplosion.rb:21:980:21:989 | ... > ... | UseUseExplosion.rb:21:979:21:990 | [false] ( ... ) | -| UseUseExplosion.rb:21:980:21:989 | ... > ... | UseUseExplosion.rb:21:979:21:990 | [true] ( ... ) | +| UseUseExplosion.rb:21:980:21:989 | ... > ... | UseUseExplosion.rb:21:979:21:990 | ( ... ) | | UseUseExplosion.rb:21:992:21:2948 | then ... | UseUseExplosion.rb:21:976:21:2964 | if ... | | UseUseExplosion.rb:21:997:21:2948 | if ... | UseUseExplosion.rb:21:992:21:2948 | then ... | | UseUseExplosion.rb:21:1001:21:1005 | [post] self | UseUseExplosion.rb:21:1022:21:1026 | self | | UseUseExplosion.rb:21:1001:21:1005 | [post] self | UseUseExplosion.rb:21:2939:21:2944 | self | | UseUseExplosion.rb:21:1001:21:1005 | self | UseUseExplosion.rb:21:1022:21:1026 | self | | UseUseExplosion.rb:21:1001:21:1005 | self | UseUseExplosion.rb:21:2939:21:2944 | self | -| UseUseExplosion.rb:21:1001:21:1010 | ... > ... | UseUseExplosion.rb:21:1000:21:1011 | [false] ( ... ) | -| UseUseExplosion.rb:21:1001:21:1010 | ... > ... | UseUseExplosion.rb:21:1000:21:1011 | [true] ( ... ) | +| UseUseExplosion.rb:21:1001:21:1010 | ... > ... | UseUseExplosion.rb:21:1000:21:1011 | ( ... ) | | UseUseExplosion.rb:21:1013:21:2932 | then ... | UseUseExplosion.rb:21:997:21:2948 | if ... | | UseUseExplosion.rb:21:1018:21:2932 | if ... | UseUseExplosion.rb:21:1013:21:2932 | then ... | | UseUseExplosion.rb:21:1022:21:1026 | [post] self | UseUseExplosion.rb:21:1043:21:1047 | self | | UseUseExplosion.rb:21:1022:21:1026 | [post] self | UseUseExplosion.rb:21:2923:21:2928 | self | | UseUseExplosion.rb:21:1022:21:1026 | self | UseUseExplosion.rb:21:1043:21:1047 | self | | UseUseExplosion.rb:21:1022:21:1026 | self | UseUseExplosion.rb:21:2923:21:2928 | self | -| UseUseExplosion.rb:21:1022:21:1031 | ... > ... | UseUseExplosion.rb:21:1021:21:1032 | [false] ( ... ) | -| UseUseExplosion.rb:21:1022:21:1031 | ... > ... | UseUseExplosion.rb:21:1021:21:1032 | [true] ( ... ) | +| UseUseExplosion.rb:21:1022:21:1031 | ... > ... | UseUseExplosion.rb:21:1021:21:1032 | ( ... ) | | UseUseExplosion.rb:21:1034:21:2916 | then ... | UseUseExplosion.rb:21:1018:21:2932 | if ... | | UseUseExplosion.rb:21:1039:21:2916 | if ... | UseUseExplosion.rb:21:1034:21:2916 | then ... | | UseUseExplosion.rb:21:1043:21:1047 | [post] self | UseUseExplosion.rb:21:1064:21:1068 | self | | UseUseExplosion.rb:21:1043:21:1047 | [post] self | UseUseExplosion.rb:21:2907:21:2912 | self | | UseUseExplosion.rb:21:1043:21:1047 | self | UseUseExplosion.rb:21:1064:21:1068 | self | | UseUseExplosion.rb:21:1043:21:1047 | self | UseUseExplosion.rb:21:2907:21:2912 | self | -| UseUseExplosion.rb:21:1043:21:1052 | ... > ... | UseUseExplosion.rb:21:1042:21:1053 | [false] ( ... ) | -| UseUseExplosion.rb:21:1043:21:1052 | ... > ... | UseUseExplosion.rb:21:1042:21:1053 | [true] ( ... ) | +| UseUseExplosion.rb:21:1043:21:1052 | ... > ... | UseUseExplosion.rb:21:1042:21:1053 | ( ... ) | | UseUseExplosion.rb:21:1055:21:2900 | then ... | UseUseExplosion.rb:21:1039:21:2916 | if ... | | UseUseExplosion.rb:21:1060:21:2900 | if ... | UseUseExplosion.rb:21:1055:21:2900 | then ... | | UseUseExplosion.rb:21:1064:21:1068 | [post] self | UseUseExplosion.rb:21:1085:21:1089 | self | | UseUseExplosion.rb:21:1064:21:1068 | [post] self | UseUseExplosion.rb:21:2891:21:2896 | self | | UseUseExplosion.rb:21:1064:21:1068 | self | UseUseExplosion.rb:21:1085:21:1089 | self | | UseUseExplosion.rb:21:1064:21:1068 | self | UseUseExplosion.rb:21:2891:21:2896 | self | -| UseUseExplosion.rb:21:1064:21:1073 | ... > ... | UseUseExplosion.rb:21:1063:21:1074 | [false] ( ... ) | -| UseUseExplosion.rb:21:1064:21:1073 | ... > ... | UseUseExplosion.rb:21:1063:21:1074 | [true] ( ... ) | +| UseUseExplosion.rb:21:1064:21:1073 | ... > ... | UseUseExplosion.rb:21:1063:21:1074 | ( ... ) | | UseUseExplosion.rb:21:1076:21:2884 | then ... | UseUseExplosion.rb:21:1060:21:2900 | if ... | | UseUseExplosion.rb:21:1081:21:2884 | if ... | UseUseExplosion.rb:21:1076:21:2884 | then ... | | UseUseExplosion.rb:21:1085:21:1089 | [post] self | UseUseExplosion.rb:21:1106:21:1110 | self | | UseUseExplosion.rb:21:1085:21:1089 | [post] self | UseUseExplosion.rb:21:2875:21:2880 | self | | UseUseExplosion.rb:21:1085:21:1089 | self | UseUseExplosion.rb:21:1106:21:1110 | self | | UseUseExplosion.rb:21:1085:21:1089 | self | UseUseExplosion.rb:21:2875:21:2880 | self | -| UseUseExplosion.rb:21:1085:21:1094 | ... > ... | UseUseExplosion.rb:21:1084:21:1095 | [false] ( ... ) | -| UseUseExplosion.rb:21:1085:21:1094 | ... > ... | UseUseExplosion.rb:21:1084:21:1095 | [true] ( ... ) | +| UseUseExplosion.rb:21:1085:21:1094 | ... > ... | UseUseExplosion.rb:21:1084:21:1095 | ( ... ) | | UseUseExplosion.rb:21:1097:21:2868 | then ... | UseUseExplosion.rb:21:1081:21:2884 | if ... | | UseUseExplosion.rb:21:1102:21:2868 | if ... | UseUseExplosion.rb:21:1097:21:2868 | then ... | | UseUseExplosion.rb:21:1106:21:1110 | [post] self | UseUseExplosion.rb:21:1127:21:1131 | self | | UseUseExplosion.rb:21:1106:21:1110 | [post] self | UseUseExplosion.rb:21:2859:21:2864 | self | | UseUseExplosion.rb:21:1106:21:1110 | self | UseUseExplosion.rb:21:1127:21:1131 | self | | UseUseExplosion.rb:21:1106:21:1110 | self | UseUseExplosion.rb:21:2859:21:2864 | self | -| UseUseExplosion.rb:21:1106:21:1115 | ... > ... | UseUseExplosion.rb:21:1105:21:1116 | [false] ( ... ) | -| UseUseExplosion.rb:21:1106:21:1115 | ... > ... | UseUseExplosion.rb:21:1105:21:1116 | [true] ( ... ) | +| UseUseExplosion.rb:21:1106:21:1115 | ... > ... | UseUseExplosion.rb:21:1105:21:1116 | ( ... ) | | UseUseExplosion.rb:21:1118:21:2852 | then ... | UseUseExplosion.rb:21:1102:21:2868 | if ... | | UseUseExplosion.rb:21:1123:21:2852 | if ... | UseUseExplosion.rb:21:1118:21:2852 | then ... | | UseUseExplosion.rb:21:1127:21:1131 | [post] self | UseUseExplosion.rb:21:1148:21:1152 | self | | UseUseExplosion.rb:21:1127:21:1131 | [post] self | UseUseExplosion.rb:21:2843:21:2848 | self | | UseUseExplosion.rb:21:1127:21:1131 | self | UseUseExplosion.rb:21:1148:21:1152 | self | | UseUseExplosion.rb:21:1127:21:1131 | self | UseUseExplosion.rb:21:2843:21:2848 | self | -| UseUseExplosion.rb:21:1127:21:1136 | ... > ... | UseUseExplosion.rb:21:1126:21:1137 | [false] ( ... ) | -| UseUseExplosion.rb:21:1127:21:1136 | ... > ... | UseUseExplosion.rb:21:1126:21:1137 | [true] ( ... ) | +| UseUseExplosion.rb:21:1127:21:1136 | ... > ... | UseUseExplosion.rb:21:1126:21:1137 | ( ... ) | | UseUseExplosion.rb:21:1139:21:2836 | then ... | UseUseExplosion.rb:21:1123:21:2852 | if ... | | UseUseExplosion.rb:21:1144:21:2836 | if ... | UseUseExplosion.rb:21:1139:21:2836 | then ... | | UseUseExplosion.rb:21:1148:21:1152 | [post] self | UseUseExplosion.rb:21:1169:21:1173 | self | | UseUseExplosion.rb:21:1148:21:1152 | [post] self | UseUseExplosion.rb:21:2827:21:2832 | self | | UseUseExplosion.rb:21:1148:21:1152 | self | UseUseExplosion.rb:21:1169:21:1173 | self | | UseUseExplosion.rb:21:1148:21:1152 | self | UseUseExplosion.rb:21:2827:21:2832 | self | -| UseUseExplosion.rb:21:1148:21:1157 | ... > ... | UseUseExplosion.rb:21:1147:21:1158 | [false] ( ... ) | -| UseUseExplosion.rb:21:1148:21:1157 | ... > ... | UseUseExplosion.rb:21:1147:21:1158 | [true] ( ... ) | +| UseUseExplosion.rb:21:1148:21:1157 | ... > ... | UseUseExplosion.rb:21:1147:21:1158 | ( ... ) | | UseUseExplosion.rb:21:1160:21:2820 | then ... | UseUseExplosion.rb:21:1144:21:2836 | if ... | | UseUseExplosion.rb:21:1165:21:2820 | if ... | UseUseExplosion.rb:21:1160:21:2820 | then ... | | UseUseExplosion.rb:21:1169:21:1173 | [post] self | UseUseExplosion.rb:21:1190:21:1194 | self | | UseUseExplosion.rb:21:1169:21:1173 | [post] self | UseUseExplosion.rb:21:2811:21:2816 | self | | UseUseExplosion.rb:21:1169:21:1173 | self | UseUseExplosion.rb:21:1190:21:1194 | self | | UseUseExplosion.rb:21:1169:21:1173 | self | UseUseExplosion.rb:21:2811:21:2816 | self | -| UseUseExplosion.rb:21:1169:21:1178 | ... > ... | UseUseExplosion.rb:21:1168:21:1179 | [false] ( ... ) | -| UseUseExplosion.rb:21:1169:21:1178 | ... > ... | UseUseExplosion.rb:21:1168:21:1179 | [true] ( ... ) | +| UseUseExplosion.rb:21:1169:21:1178 | ... > ... | UseUseExplosion.rb:21:1168:21:1179 | ( ... ) | | UseUseExplosion.rb:21:1181:21:2804 | then ... | UseUseExplosion.rb:21:1165:21:2820 | if ... | | UseUseExplosion.rb:21:1186:21:2804 | if ... | UseUseExplosion.rb:21:1181:21:2804 | then ... | | UseUseExplosion.rb:21:1190:21:1194 | [post] self | UseUseExplosion.rb:21:1211:21:1215 | self | | UseUseExplosion.rb:21:1190:21:1194 | [post] self | UseUseExplosion.rb:21:2795:21:2800 | self | | UseUseExplosion.rb:21:1190:21:1194 | self | UseUseExplosion.rb:21:1211:21:1215 | self | | UseUseExplosion.rb:21:1190:21:1194 | self | UseUseExplosion.rb:21:2795:21:2800 | self | -| UseUseExplosion.rb:21:1190:21:1199 | ... > ... | UseUseExplosion.rb:21:1189:21:1200 | [false] ( ... ) | -| UseUseExplosion.rb:21:1190:21:1199 | ... > ... | UseUseExplosion.rb:21:1189:21:1200 | [true] ( ... ) | +| UseUseExplosion.rb:21:1190:21:1199 | ... > ... | UseUseExplosion.rb:21:1189:21:1200 | ( ... ) | | UseUseExplosion.rb:21:1202:21:2788 | then ... | UseUseExplosion.rb:21:1186:21:2804 | if ... | | UseUseExplosion.rb:21:1207:21:2788 | if ... | UseUseExplosion.rb:21:1202:21:2788 | then ... | | UseUseExplosion.rb:21:1211:21:1215 | [post] self | UseUseExplosion.rb:21:1232:21:1236 | self | | UseUseExplosion.rb:21:1211:21:1215 | [post] self | UseUseExplosion.rb:21:2779:21:2784 | self | | UseUseExplosion.rb:21:1211:21:1215 | self | UseUseExplosion.rb:21:1232:21:1236 | self | | UseUseExplosion.rb:21:1211:21:1215 | self | UseUseExplosion.rb:21:2779:21:2784 | self | -| UseUseExplosion.rb:21:1211:21:1220 | ... > ... | UseUseExplosion.rb:21:1210:21:1221 | [false] ( ... ) | -| UseUseExplosion.rb:21:1211:21:1220 | ... > ... | UseUseExplosion.rb:21:1210:21:1221 | [true] ( ... ) | +| UseUseExplosion.rb:21:1211:21:1220 | ... > ... | UseUseExplosion.rb:21:1210:21:1221 | ( ... ) | | UseUseExplosion.rb:21:1223:21:2772 | then ... | UseUseExplosion.rb:21:1207:21:2788 | if ... | | UseUseExplosion.rb:21:1228:21:2772 | if ... | UseUseExplosion.rb:21:1223:21:2772 | then ... | | UseUseExplosion.rb:21:1232:21:1236 | [post] self | UseUseExplosion.rb:21:1253:21:1257 | self | | UseUseExplosion.rb:21:1232:21:1236 | [post] self | UseUseExplosion.rb:21:2763:21:2768 | self | | UseUseExplosion.rb:21:1232:21:1236 | self | UseUseExplosion.rb:21:1253:21:1257 | self | | UseUseExplosion.rb:21:1232:21:1236 | self | UseUseExplosion.rb:21:2763:21:2768 | self | -| UseUseExplosion.rb:21:1232:21:1241 | ... > ... | UseUseExplosion.rb:21:1231:21:1242 | [false] ( ... ) | -| UseUseExplosion.rb:21:1232:21:1241 | ... > ... | UseUseExplosion.rb:21:1231:21:1242 | [true] ( ... ) | +| UseUseExplosion.rb:21:1232:21:1241 | ... > ... | UseUseExplosion.rb:21:1231:21:1242 | ( ... ) | | UseUseExplosion.rb:21:1244:21:2756 | then ... | UseUseExplosion.rb:21:1228:21:2772 | if ... | | UseUseExplosion.rb:21:1249:21:2756 | if ... | UseUseExplosion.rb:21:1244:21:2756 | then ... | | UseUseExplosion.rb:21:1253:21:1257 | [post] self | UseUseExplosion.rb:21:1274:21:1278 | self | | UseUseExplosion.rb:21:1253:21:1257 | [post] self | UseUseExplosion.rb:21:2747:21:2752 | self | | UseUseExplosion.rb:21:1253:21:1257 | self | UseUseExplosion.rb:21:1274:21:1278 | self | | UseUseExplosion.rb:21:1253:21:1257 | self | UseUseExplosion.rb:21:2747:21:2752 | self | -| UseUseExplosion.rb:21:1253:21:1262 | ... > ... | UseUseExplosion.rb:21:1252:21:1263 | [false] ( ... ) | -| UseUseExplosion.rb:21:1253:21:1262 | ... > ... | UseUseExplosion.rb:21:1252:21:1263 | [true] ( ... ) | +| UseUseExplosion.rb:21:1253:21:1262 | ... > ... | UseUseExplosion.rb:21:1252:21:1263 | ( ... ) | | UseUseExplosion.rb:21:1265:21:2740 | then ... | UseUseExplosion.rb:21:1249:21:2756 | if ... | | UseUseExplosion.rb:21:1270:21:2740 | if ... | UseUseExplosion.rb:21:1265:21:2740 | then ... | | UseUseExplosion.rb:21:1274:21:1278 | [post] self | UseUseExplosion.rb:21:1295:21:1299 | self | | UseUseExplosion.rb:21:1274:21:1278 | [post] self | UseUseExplosion.rb:21:2731:21:2736 | self | | UseUseExplosion.rb:21:1274:21:1278 | self | UseUseExplosion.rb:21:1295:21:1299 | self | | UseUseExplosion.rb:21:1274:21:1278 | self | UseUseExplosion.rb:21:2731:21:2736 | self | -| UseUseExplosion.rb:21:1274:21:1283 | ... > ... | UseUseExplosion.rb:21:1273:21:1284 | [false] ( ... ) | -| UseUseExplosion.rb:21:1274:21:1283 | ... > ... | UseUseExplosion.rb:21:1273:21:1284 | [true] ( ... ) | +| UseUseExplosion.rb:21:1274:21:1283 | ... > ... | UseUseExplosion.rb:21:1273:21:1284 | ( ... ) | | UseUseExplosion.rb:21:1286:21:2724 | then ... | UseUseExplosion.rb:21:1270:21:2740 | if ... | | UseUseExplosion.rb:21:1291:21:2724 | if ... | UseUseExplosion.rb:21:1286:21:2724 | then ... | | UseUseExplosion.rb:21:1295:21:1299 | [post] self | UseUseExplosion.rb:21:1316:21:1320 | self | | UseUseExplosion.rb:21:1295:21:1299 | [post] self | UseUseExplosion.rb:21:2715:21:2720 | self | | UseUseExplosion.rb:21:1295:21:1299 | self | UseUseExplosion.rb:21:1316:21:1320 | self | | UseUseExplosion.rb:21:1295:21:1299 | self | UseUseExplosion.rb:21:2715:21:2720 | self | -| UseUseExplosion.rb:21:1295:21:1304 | ... > ... | UseUseExplosion.rb:21:1294:21:1305 | [false] ( ... ) | -| UseUseExplosion.rb:21:1295:21:1304 | ... > ... | UseUseExplosion.rb:21:1294:21:1305 | [true] ( ... ) | +| UseUseExplosion.rb:21:1295:21:1304 | ... > ... | UseUseExplosion.rb:21:1294:21:1305 | ( ... ) | | UseUseExplosion.rb:21:1307:21:2708 | then ... | UseUseExplosion.rb:21:1291:21:2724 | if ... | | UseUseExplosion.rb:21:1312:21:2708 | if ... | UseUseExplosion.rb:21:1307:21:2708 | then ... | | UseUseExplosion.rb:21:1316:21:1320 | [post] self | UseUseExplosion.rb:21:1337:21:1341 | self | | UseUseExplosion.rb:21:1316:21:1320 | [post] self | UseUseExplosion.rb:21:2699:21:2704 | self | | UseUseExplosion.rb:21:1316:21:1320 | self | UseUseExplosion.rb:21:1337:21:1341 | self | | UseUseExplosion.rb:21:1316:21:1320 | self | UseUseExplosion.rb:21:2699:21:2704 | self | -| UseUseExplosion.rb:21:1316:21:1325 | ... > ... | UseUseExplosion.rb:21:1315:21:1326 | [false] ( ... ) | -| UseUseExplosion.rb:21:1316:21:1325 | ... > ... | UseUseExplosion.rb:21:1315:21:1326 | [true] ( ... ) | +| UseUseExplosion.rb:21:1316:21:1325 | ... > ... | UseUseExplosion.rb:21:1315:21:1326 | ( ... ) | | UseUseExplosion.rb:21:1328:21:2692 | then ... | UseUseExplosion.rb:21:1312:21:2708 | if ... | | UseUseExplosion.rb:21:1333:21:2692 | if ... | UseUseExplosion.rb:21:1328:21:2692 | then ... | | UseUseExplosion.rb:21:1337:21:1341 | [post] self | UseUseExplosion.rb:21:1358:21:1362 | self | | UseUseExplosion.rb:21:1337:21:1341 | [post] self | UseUseExplosion.rb:21:2683:21:2688 | self | | UseUseExplosion.rb:21:1337:21:1341 | self | UseUseExplosion.rb:21:1358:21:1362 | self | | UseUseExplosion.rb:21:1337:21:1341 | self | UseUseExplosion.rb:21:2683:21:2688 | self | -| UseUseExplosion.rb:21:1337:21:1346 | ... > ... | UseUseExplosion.rb:21:1336:21:1347 | [false] ( ... ) | -| UseUseExplosion.rb:21:1337:21:1346 | ... > ... | UseUseExplosion.rb:21:1336:21:1347 | [true] ( ... ) | +| UseUseExplosion.rb:21:1337:21:1346 | ... > ... | UseUseExplosion.rb:21:1336:21:1347 | ( ... ) | | UseUseExplosion.rb:21:1349:21:2676 | then ... | UseUseExplosion.rb:21:1333:21:2692 | if ... | | UseUseExplosion.rb:21:1354:21:2676 | if ... | UseUseExplosion.rb:21:1349:21:2676 | then ... | | UseUseExplosion.rb:21:1358:21:1362 | [post] self | UseUseExplosion.rb:21:1379:21:1383 | self | | UseUseExplosion.rb:21:1358:21:1362 | [post] self | UseUseExplosion.rb:21:2667:21:2672 | self | | UseUseExplosion.rb:21:1358:21:1362 | self | UseUseExplosion.rb:21:1379:21:1383 | self | | UseUseExplosion.rb:21:1358:21:1362 | self | UseUseExplosion.rb:21:2667:21:2672 | self | -| UseUseExplosion.rb:21:1358:21:1367 | ... > ... | UseUseExplosion.rb:21:1357:21:1368 | [false] ( ... ) | -| UseUseExplosion.rb:21:1358:21:1367 | ... > ... | UseUseExplosion.rb:21:1357:21:1368 | [true] ( ... ) | +| UseUseExplosion.rb:21:1358:21:1367 | ... > ... | UseUseExplosion.rb:21:1357:21:1368 | ( ... ) | | UseUseExplosion.rb:21:1370:21:2660 | then ... | UseUseExplosion.rb:21:1354:21:2676 | if ... | | UseUseExplosion.rb:21:1375:21:2660 | if ... | UseUseExplosion.rb:21:1370:21:2660 | then ... | | UseUseExplosion.rb:21:1379:21:1383 | [post] self | UseUseExplosion.rb:21:1400:21:1404 | self | | UseUseExplosion.rb:21:1379:21:1383 | [post] self | UseUseExplosion.rb:21:2651:21:2656 | self | | UseUseExplosion.rb:21:1379:21:1383 | self | UseUseExplosion.rb:21:1400:21:1404 | self | | UseUseExplosion.rb:21:1379:21:1383 | self | UseUseExplosion.rb:21:2651:21:2656 | self | -| UseUseExplosion.rb:21:1379:21:1388 | ... > ... | UseUseExplosion.rb:21:1378:21:1389 | [false] ( ... ) | -| UseUseExplosion.rb:21:1379:21:1388 | ... > ... | UseUseExplosion.rb:21:1378:21:1389 | [true] ( ... ) | +| UseUseExplosion.rb:21:1379:21:1388 | ... > ... | UseUseExplosion.rb:21:1378:21:1389 | ( ... ) | | UseUseExplosion.rb:21:1391:21:2644 | then ... | UseUseExplosion.rb:21:1375:21:2660 | if ... | | UseUseExplosion.rb:21:1396:21:2644 | if ... | UseUseExplosion.rb:21:1391:21:2644 | then ... | | UseUseExplosion.rb:21:1400:21:1404 | [post] self | UseUseExplosion.rb:21:1421:21:1425 | self | | UseUseExplosion.rb:21:1400:21:1404 | [post] self | UseUseExplosion.rb:21:2635:21:2640 | self | | UseUseExplosion.rb:21:1400:21:1404 | self | UseUseExplosion.rb:21:1421:21:1425 | self | | UseUseExplosion.rb:21:1400:21:1404 | self | UseUseExplosion.rb:21:2635:21:2640 | self | -| UseUseExplosion.rb:21:1400:21:1409 | ... > ... | UseUseExplosion.rb:21:1399:21:1410 | [false] ( ... ) | -| UseUseExplosion.rb:21:1400:21:1409 | ... > ... | UseUseExplosion.rb:21:1399:21:1410 | [true] ( ... ) | +| UseUseExplosion.rb:21:1400:21:1409 | ... > ... | UseUseExplosion.rb:21:1399:21:1410 | ( ... ) | | UseUseExplosion.rb:21:1412:21:2628 | then ... | UseUseExplosion.rb:21:1396:21:2644 | if ... | | UseUseExplosion.rb:21:1417:21:2628 | if ... | UseUseExplosion.rb:21:1412:21:2628 | then ... | | UseUseExplosion.rb:21:1421:21:1425 | [post] self | UseUseExplosion.rb:21:1442:21:1446 | self | | UseUseExplosion.rb:21:1421:21:1425 | [post] self | UseUseExplosion.rb:21:2619:21:2624 | self | | UseUseExplosion.rb:21:1421:21:1425 | self | UseUseExplosion.rb:21:1442:21:1446 | self | | UseUseExplosion.rb:21:1421:21:1425 | self | UseUseExplosion.rb:21:2619:21:2624 | self | -| UseUseExplosion.rb:21:1421:21:1430 | ... > ... | UseUseExplosion.rb:21:1420:21:1431 | [false] ( ... ) | -| UseUseExplosion.rb:21:1421:21:1430 | ... > ... | UseUseExplosion.rb:21:1420:21:1431 | [true] ( ... ) | +| UseUseExplosion.rb:21:1421:21:1430 | ... > ... | UseUseExplosion.rb:21:1420:21:1431 | ( ... ) | | UseUseExplosion.rb:21:1433:21:2612 | then ... | UseUseExplosion.rb:21:1417:21:2628 | if ... | | UseUseExplosion.rb:21:1438:21:2612 | if ... | UseUseExplosion.rb:21:1433:21:2612 | then ... | | UseUseExplosion.rb:21:1442:21:1446 | [post] self | UseUseExplosion.rb:21:1463:21:1467 | self | | UseUseExplosion.rb:21:1442:21:1446 | [post] self | UseUseExplosion.rb:21:2603:21:2608 | self | | UseUseExplosion.rb:21:1442:21:1446 | self | UseUseExplosion.rb:21:1463:21:1467 | self | | UseUseExplosion.rb:21:1442:21:1446 | self | UseUseExplosion.rb:21:2603:21:2608 | self | -| UseUseExplosion.rb:21:1442:21:1451 | ... > ... | UseUseExplosion.rb:21:1441:21:1452 | [false] ( ... ) | -| UseUseExplosion.rb:21:1442:21:1451 | ... > ... | UseUseExplosion.rb:21:1441:21:1452 | [true] ( ... ) | +| UseUseExplosion.rb:21:1442:21:1451 | ... > ... | UseUseExplosion.rb:21:1441:21:1452 | ( ... ) | | UseUseExplosion.rb:21:1454:21:2596 | then ... | UseUseExplosion.rb:21:1438:21:2612 | if ... | | UseUseExplosion.rb:21:1459:21:2596 | if ... | UseUseExplosion.rb:21:1454:21:2596 | then ... | | UseUseExplosion.rb:21:1463:21:1467 | [post] self | UseUseExplosion.rb:21:1484:21:1488 | self | | UseUseExplosion.rb:21:1463:21:1467 | [post] self | UseUseExplosion.rb:21:2587:21:2592 | self | | UseUseExplosion.rb:21:1463:21:1467 | self | UseUseExplosion.rb:21:1484:21:1488 | self | | UseUseExplosion.rb:21:1463:21:1467 | self | UseUseExplosion.rb:21:2587:21:2592 | self | -| UseUseExplosion.rb:21:1463:21:1472 | ... > ... | UseUseExplosion.rb:21:1462:21:1473 | [false] ( ... ) | -| UseUseExplosion.rb:21:1463:21:1472 | ... > ... | UseUseExplosion.rb:21:1462:21:1473 | [true] ( ... ) | +| UseUseExplosion.rb:21:1463:21:1472 | ... > ... | UseUseExplosion.rb:21:1462:21:1473 | ( ... ) | | UseUseExplosion.rb:21:1475:21:2580 | then ... | UseUseExplosion.rb:21:1459:21:2596 | if ... | | UseUseExplosion.rb:21:1480:21:2580 | if ... | UseUseExplosion.rb:21:1475:21:2580 | then ... | | UseUseExplosion.rb:21:1484:21:1488 | [post] self | UseUseExplosion.rb:21:1505:21:1509 | self | | UseUseExplosion.rb:21:1484:21:1488 | [post] self | UseUseExplosion.rb:21:2571:21:2576 | self | | UseUseExplosion.rb:21:1484:21:1488 | self | UseUseExplosion.rb:21:1505:21:1509 | self | | UseUseExplosion.rb:21:1484:21:1488 | self | UseUseExplosion.rb:21:2571:21:2576 | self | -| UseUseExplosion.rb:21:1484:21:1493 | ... > ... | UseUseExplosion.rb:21:1483:21:1494 | [false] ( ... ) | -| UseUseExplosion.rb:21:1484:21:1493 | ... > ... | UseUseExplosion.rb:21:1483:21:1494 | [true] ( ... ) | +| UseUseExplosion.rb:21:1484:21:1493 | ... > ... | UseUseExplosion.rb:21:1483:21:1494 | ( ... ) | | UseUseExplosion.rb:21:1496:21:2564 | then ... | UseUseExplosion.rb:21:1480:21:2580 | if ... | | UseUseExplosion.rb:21:1501:21:2564 | if ... | UseUseExplosion.rb:21:1496:21:2564 | then ... | | UseUseExplosion.rb:21:1505:21:1509 | [post] self | UseUseExplosion.rb:21:1526:21:1530 | self | | UseUseExplosion.rb:21:1505:21:1509 | [post] self | UseUseExplosion.rb:21:2555:21:2560 | self | | UseUseExplosion.rb:21:1505:21:1509 | self | UseUseExplosion.rb:21:1526:21:1530 | self | | UseUseExplosion.rb:21:1505:21:1509 | self | UseUseExplosion.rb:21:2555:21:2560 | self | -| UseUseExplosion.rb:21:1505:21:1514 | ... > ... | UseUseExplosion.rb:21:1504:21:1515 | [false] ( ... ) | -| UseUseExplosion.rb:21:1505:21:1514 | ... > ... | UseUseExplosion.rb:21:1504:21:1515 | [true] ( ... ) | +| UseUseExplosion.rb:21:1505:21:1514 | ... > ... | UseUseExplosion.rb:21:1504:21:1515 | ( ... ) | | UseUseExplosion.rb:21:1517:21:2548 | then ... | UseUseExplosion.rb:21:1501:21:2564 | if ... | | UseUseExplosion.rb:21:1522:21:2548 | if ... | UseUseExplosion.rb:21:1517:21:2548 | then ... | | UseUseExplosion.rb:21:1526:21:1530 | [post] self | UseUseExplosion.rb:21:1547:21:1551 | self | | UseUseExplosion.rb:21:1526:21:1530 | [post] self | UseUseExplosion.rb:21:2539:21:2544 | self | | UseUseExplosion.rb:21:1526:21:1530 | self | UseUseExplosion.rb:21:1547:21:1551 | self | | UseUseExplosion.rb:21:1526:21:1530 | self | UseUseExplosion.rb:21:2539:21:2544 | self | -| UseUseExplosion.rb:21:1526:21:1535 | ... > ... | UseUseExplosion.rb:21:1525:21:1536 | [false] ( ... ) | -| UseUseExplosion.rb:21:1526:21:1535 | ... > ... | UseUseExplosion.rb:21:1525:21:1536 | [true] ( ... ) | +| UseUseExplosion.rb:21:1526:21:1535 | ... > ... | UseUseExplosion.rb:21:1525:21:1536 | ( ... ) | | UseUseExplosion.rb:21:1538:21:2532 | then ... | UseUseExplosion.rb:21:1522:21:2548 | if ... | | UseUseExplosion.rb:21:1543:21:2532 | if ... | UseUseExplosion.rb:21:1538:21:2532 | then ... | | UseUseExplosion.rb:21:1547:21:1551 | [post] self | UseUseExplosion.rb:21:1568:21:1572 | self | | UseUseExplosion.rb:21:1547:21:1551 | [post] self | UseUseExplosion.rb:21:2523:21:2528 | self | | UseUseExplosion.rb:21:1547:21:1551 | self | UseUseExplosion.rb:21:1568:21:1572 | self | | UseUseExplosion.rb:21:1547:21:1551 | self | UseUseExplosion.rb:21:2523:21:2528 | self | -| UseUseExplosion.rb:21:1547:21:1556 | ... > ... | UseUseExplosion.rb:21:1546:21:1557 | [false] ( ... ) | -| UseUseExplosion.rb:21:1547:21:1556 | ... > ... | UseUseExplosion.rb:21:1546:21:1557 | [true] ( ... ) | +| UseUseExplosion.rb:21:1547:21:1556 | ... > ... | UseUseExplosion.rb:21:1546:21:1557 | ( ... ) | | UseUseExplosion.rb:21:1559:21:2516 | then ... | UseUseExplosion.rb:21:1543:21:2532 | if ... | | UseUseExplosion.rb:21:1564:21:2516 | if ... | UseUseExplosion.rb:21:1559:21:2516 | then ... | | UseUseExplosion.rb:21:1568:21:1572 | [post] self | UseUseExplosion.rb:21:1589:21:1593 | self | | UseUseExplosion.rb:21:1568:21:1572 | [post] self | UseUseExplosion.rb:21:2507:21:2512 | self | | UseUseExplosion.rb:21:1568:21:1572 | self | UseUseExplosion.rb:21:1589:21:1593 | self | | UseUseExplosion.rb:21:1568:21:1572 | self | UseUseExplosion.rb:21:2507:21:2512 | self | -| UseUseExplosion.rb:21:1568:21:1577 | ... > ... | UseUseExplosion.rb:21:1567:21:1578 | [false] ( ... ) | -| UseUseExplosion.rb:21:1568:21:1577 | ... > ... | UseUseExplosion.rb:21:1567:21:1578 | [true] ( ... ) | +| UseUseExplosion.rb:21:1568:21:1577 | ... > ... | UseUseExplosion.rb:21:1567:21:1578 | ( ... ) | | UseUseExplosion.rb:21:1580:21:2500 | then ... | UseUseExplosion.rb:21:1564:21:2516 | if ... | | UseUseExplosion.rb:21:1585:21:2500 | if ... | UseUseExplosion.rb:21:1580:21:2500 | then ... | | UseUseExplosion.rb:21:1589:21:1593 | [post] self | UseUseExplosion.rb:21:1610:21:1614 | self | | UseUseExplosion.rb:21:1589:21:1593 | [post] self | UseUseExplosion.rb:21:2491:21:2496 | self | | UseUseExplosion.rb:21:1589:21:1593 | self | UseUseExplosion.rb:21:1610:21:1614 | self | | UseUseExplosion.rb:21:1589:21:1593 | self | UseUseExplosion.rb:21:2491:21:2496 | self | -| UseUseExplosion.rb:21:1589:21:1598 | ... > ... | UseUseExplosion.rb:21:1588:21:1599 | [false] ( ... ) | -| UseUseExplosion.rb:21:1589:21:1598 | ... > ... | UseUseExplosion.rb:21:1588:21:1599 | [true] ( ... ) | +| UseUseExplosion.rb:21:1589:21:1598 | ... > ... | UseUseExplosion.rb:21:1588:21:1599 | ( ... ) | | UseUseExplosion.rb:21:1601:21:2484 | then ... | UseUseExplosion.rb:21:1585:21:2500 | if ... | | UseUseExplosion.rb:21:1606:21:2484 | if ... | UseUseExplosion.rb:21:1601:21:2484 | then ... | | UseUseExplosion.rb:21:1610:21:1614 | [post] self | UseUseExplosion.rb:21:1631:21:1635 | self | | UseUseExplosion.rb:21:1610:21:1614 | [post] self | UseUseExplosion.rb:21:2475:21:2480 | self | | UseUseExplosion.rb:21:1610:21:1614 | self | UseUseExplosion.rb:21:1631:21:1635 | self | | UseUseExplosion.rb:21:1610:21:1614 | self | UseUseExplosion.rb:21:2475:21:2480 | self | -| UseUseExplosion.rb:21:1610:21:1619 | ... > ... | UseUseExplosion.rb:21:1609:21:1620 | [false] ( ... ) | -| UseUseExplosion.rb:21:1610:21:1619 | ... > ... | UseUseExplosion.rb:21:1609:21:1620 | [true] ( ... ) | +| UseUseExplosion.rb:21:1610:21:1619 | ... > ... | UseUseExplosion.rb:21:1609:21:1620 | ( ... ) | | UseUseExplosion.rb:21:1622:21:2468 | then ... | UseUseExplosion.rb:21:1606:21:2484 | if ... | | UseUseExplosion.rb:21:1627:21:2468 | if ... | UseUseExplosion.rb:21:1622:21:2468 | then ... | | UseUseExplosion.rb:21:1631:21:1635 | [post] self | UseUseExplosion.rb:21:1652:21:1656 | self | | UseUseExplosion.rb:21:1631:21:1635 | [post] self | UseUseExplosion.rb:21:2459:21:2464 | self | | UseUseExplosion.rb:21:1631:21:1635 | self | UseUseExplosion.rb:21:1652:21:1656 | self | | UseUseExplosion.rb:21:1631:21:1635 | self | UseUseExplosion.rb:21:2459:21:2464 | self | -| UseUseExplosion.rb:21:1631:21:1640 | ... > ... | UseUseExplosion.rb:21:1630:21:1641 | [false] ( ... ) | -| UseUseExplosion.rb:21:1631:21:1640 | ... > ... | UseUseExplosion.rb:21:1630:21:1641 | [true] ( ... ) | +| UseUseExplosion.rb:21:1631:21:1640 | ... > ... | UseUseExplosion.rb:21:1630:21:1641 | ( ... ) | | UseUseExplosion.rb:21:1643:21:2452 | then ... | UseUseExplosion.rb:21:1627:21:2468 | if ... | | UseUseExplosion.rb:21:1648:21:2452 | if ... | UseUseExplosion.rb:21:1643:21:2452 | then ... | | UseUseExplosion.rb:21:1652:21:1656 | [post] self | UseUseExplosion.rb:21:1673:21:1677 | self | | UseUseExplosion.rb:21:1652:21:1656 | [post] self | UseUseExplosion.rb:21:2443:21:2448 | self | | UseUseExplosion.rb:21:1652:21:1656 | self | UseUseExplosion.rb:21:1673:21:1677 | self | | UseUseExplosion.rb:21:1652:21:1656 | self | UseUseExplosion.rb:21:2443:21:2448 | self | -| UseUseExplosion.rb:21:1652:21:1661 | ... > ... | UseUseExplosion.rb:21:1651:21:1662 | [false] ( ... ) | -| UseUseExplosion.rb:21:1652:21:1661 | ... > ... | UseUseExplosion.rb:21:1651:21:1662 | [true] ( ... ) | +| UseUseExplosion.rb:21:1652:21:1661 | ... > ... | UseUseExplosion.rb:21:1651:21:1662 | ( ... ) | | UseUseExplosion.rb:21:1664:21:2436 | then ... | UseUseExplosion.rb:21:1648:21:2452 | if ... | | UseUseExplosion.rb:21:1669:21:2436 | if ... | UseUseExplosion.rb:21:1664:21:2436 | then ... | | UseUseExplosion.rb:21:1673:21:1677 | [post] self | UseUseExplosion.rb:21:1694:21:1698 | self | | UseUseExplosion.rb:21:1673:21:1677 | [post] self | UseUseExplosion.rb:21:2427:21:2432 | self | | UseUseExplosion.rb:21:1673:21:1677 | self | UseUseExplosion.rb:21:1694:21:1698 | self | | UseUseExplosion.rb:21:1673:21:1677 | self | UseUseExplosion.rb:21:2427:21:2432 | self | -| UseUseExplosion.rb:21:1673:21:1682 | ... > ... | UseUseExplosion.rb:21:1672:21:1683 | [false] ( ... ) | -| UseUseExplosion.rb:21:1673:21:1682 | ... > ... | UseUseExplosion.rb:21:1672:21:1683 | [true] ( ... ) | +| UseUseExplosion.rb:21:1673:21:1682 | ... > ... | UseUseExplosion.rb:21:1672:21:1683 | ( ... ) | | UseUseExplosion.rb:21:1685:21:2420 | then ... | UseUseExplosion.rb:21:1669:21:2436 | if ... | | UseUseExplosion.rb:21:1690:21:2420 | if ... | UseUseExplosion.rb:21:1685:21:2420 | then ... | | UseUseExplosion.rb:21:1694:21:1698 | [post] self | UseUseExplosion.rb:21:1715:21:1719 | self | | UseUseExplosion.rb:21:1694:21:1698 | [post] self | UseUseExplosion.rb:21:2411:21:2416 | self | | UseUseExplosion.rb:21:1694:21:1698 | self | UseUseExplosion.rb:21:1715:21:1719 | self | | UseUseExplosion.rb:21:1694:21:1698 | self | UseUseExplosion.rb:21:2411:21:2416 | self | -| UseUseExplosion.rb:21:1694:21:1703 | ... > ... | UseUseExplosion.rb:21:1693:21:1704 | [false] ( ... ) | -| UseUseExplosion.rb:21:1694:21:1703 | ... > ... | UseUseExplosion.rb:21:1693:21:1704 | [true] ( ... ) | +| UseUseExplosion.rb:21:1694:21:1703 | ... > ... | UseUseExplosion.rb:21:1693:21:1704 | ( ... ) | | UseUseExplosion.rb:21:1706:21:2404 | then ... | UseUseExplosion.rb:21:1690:21:2420 | if ... | | UseUseExplosion.rb:21:1711:21:2404 | if ... | UseUseExplosion.rb:21:1706:21:2404 | then ... | | UseUseExplosion.rb:21:1715:21:1719 | [post] self | UseUseExplosion.rb:21:1736:21:1740 | self | | UseUseExplosion.rb:21:1715:21:1719 | [post] self | UseUseExplosion.rb:21:2395:21:2400 | self | | UseUseExplosion.rb:21:1715:21:1719 | self | UseUseExplosion.rb:21:1736:21:1740 | self | | UseUseExplosion.rb:21:1715:21:1719 | self | UseUseExplosion.rb:21:2395:21:2400 | self | -| UseUseExplosion.rb:21:1715:21:1724 | ... > ... | UseUseExplosion.rb:21:1714:21:1725 | [false] ( ... ) | -| UseUseExplosion.rb:21:1715:21:1724 | ... > ... | UseUseExplosion.rb:21:1714:21:1725 | [true] ( ... ) | +| UseUseExplosion.rb:21:1715:21:1724 | ... > ... | UseUseExplosion.rb:21:1714:21:1725 | ( ... ) | | UseUseExplosion.rb:21:1727:21:2388 | then ... | UseUseExplosion.rb:21:1711:21:2404 | if ... | | UseUseExplosion.rb:21:1732:21:2388 | if ... | UseUseExplosion.rb:21:1727:21:2388 | then ... | | UseUseExplosion.rb:21:1736:21:1740 | [post] self | UseUseExplosion.rb:21:1757:21:1761 | self | | UseUseExplosion.rb:21:1736:21:1740 | [post] self | UseUseExplosion.rb:21:2379:21:2384 | self | | UseUseExplosion.rb:21:1736:21:1740 | self | UseUseExplosion.rb:21:1757:21:1761 | self | | UseUseExplosion.rb:21:1736:21:1740 | self | UseUseExplosion.rb:21:2379:21:2384 | self | -| UseUseExplosion.rb:21:1736:21:1745 | ... > ... | UseUseExplosion.rb:21:1735:21:1746 | [false] ( ... ) | -| UseUseExplosion.rb:21:1736:21:1745 | ... > ... | UseUseExplosion.rb:21:1735:21:1746 | [true] ( ... ) | +| UseUseExplosion.rb:21:1736:21:1745 | ... > ... | UseUseExplosion.rb:21:1735:21:1746 | ( ... ) | | UseUseExplosion.rb:21:1748:21:2372 | then ... | UseUseExplosion.rb:21:1732:21:2388 | if ... | | UseUseExplosion.rb:21:1753:21:2372 | if ... | UseUseExplosion.rb:21:1748:21:2372 | then ... | | UseUseExplosion.rb:21:1757:21:1761 | [post] self | UseUseExplosion.rb:21:1778:21:1782 | self | | UseUseExplosion.rb:21:1757:21:1761 | [post] self | UseUseExplosion.rb:21:2363:21:2368 | self | | UseUseExplosion.rb:21:1757:21:1761 | self | UseUseExplosion.rb:21:1778:21:1782 | self | | UseUseExplosion.rb:21:1757:21:1761 | self | UseUseExplosion.rb:21:2363:21:2368 | self | -| UseUseExplosion.rb:21:1757:21:1766 | ... > ... | UseUseExplosion.rb:21:1756:21:1767 | [false] ( ... ) | -| UseUseExplosion.rb:21:1757:21:1766 | ... > ... | UseUseExplosion.rb:21:1756:21:1767 | [true] ( ... ) | +| UseUseExplosion.rb:21:1757:21:1766 | ... > ... | UseUseExplosion.rb:21:1756:21:1767 | ( ... ) | | UseUseExplosion.rb:21:1769:21:2356 | then ... | UseUseExplosion.rb:21:1753:21:2372 | if ... | | UseUseExplosion.rb:21:1774:21:2356 | if ... | UseUseExplosion.rb:21:1769:21:2356 | then ... | | UseUseExplosion.rb:21:1778:21:1782 | [post] self | UseUseExplosion.rb:21:1799:21:1803 | self | | UseUseExplosion.rb:21:1778:21:1782 | [post] self | UseUseExplosion.rb:21:2347:21:2352 | self | | UseUseExplosion.rb:21:1778:21:1782 | self | UseUseExplosion.rb:21:1799:21:1803 | self | | UseUseExplosion.rb:21:1778:21:1782 | self | UseUseExplosion.rb:21:2347:21:2352 | self | -| UseUseExplosion.rb:21:1778:21:1787 | ... > ... | UseUseExplosion.rb:21:1777:21:1788 | [false] ( ... ) | -| UseUseExplosion.rb:21:1778:21:1787 | ... > ... | UseUseExplosion.rb:21:1777:21:1788 | [true] ( ... ) | +| UseUseExplosion.rb:21:1778:21:1787 | ... > ... | UseUseExplosion.rb:21:1777:21:1788 | ( ... ) | | UseUseExplosion.rb:21:1790:21:2340 | then ... | UseUseExplosion.rb:21:1774:21:2356 | if ... | | UseUseExplosion.rb:21:1795:21:2340 | if ... | UseUseExplosion.rb:21:1790:21:2340 | then ... | | UseUseExplosion.rb:21:1799:21:1803 | [post] self | UseUseExplosion.rb:21:1820:21:1824 | self | | UseUseExplosion.rb:21:1799:21:1803 | [post] self | UseUseExplosion.rb:21:2331:21:2336 | self | | UseUseExplosion.rb:21:1799:21:1803 | self | UseUseExplosion.rb:21:1820:21:1824 | self | | UseUseExplosion.rb:21:1799:21:1803 | self | UseUseExplosion.rb:21:2331:21:2336 | self | -| UseUseExplosion.rb:21:1799:21:1808 | ... > ... | UseUseExplosion.rb:21:1798:21:1809 | [false] ( ... ) | -| UseUseExplosion.rb:21:1799:21:1808 | ... > ... | UseUseExplosion.rb:21:1798:21:1809 | [true] ( ... ) | +| UseUseExplosion.rb:21:1799:21:1808 | ... > ... | UseUseExplosion.rb:21:1798:21:1809 | ( ... ) | | UseUseExplosion.rb:21:1811:21:2324 | then ... | UseUseExplosion.rb:21:1795:21:2340 | if ... | | UseUseExplosion.rb:21:1816:21:2324 | if ... | UseUseExplosion.rb:21:1811:21:2324 | then ... | | UseUseExplosion.rb:21:1820:21:1824 | [post] self | UseUseExplosion.rb:21:1841:21:1845 | self | | UseUseExplosion.rb:21:1820:21:1824 | [post] self | UseUseExplosion.rb:21:2315:21:2320 | self | | UseUseExplosion.rb:21:1820:21:1824 | self | UseUseExplosion.rb:21:1841:21:1845 | self | | UseUseExplosion.rb:21:1820:21:1824 | self | UseUseExplosion.rb:21:2315:21:2320 | self | -| UseUseExplosion.rb:21:1820:21:1829 | ... > ... | UseUseExplosion.rb:21:1819:21:1830 | [false] ( ... ) | -| UseUseExplosion.rb:21:1820:21:1829 | ... > ... | UseUseExplosion.rb:21:1819:21:1830 | [true] ( ... ) | +| UseUseExplosion.rb:21:1820:21:1829 | ... > ... | UseUseExplosion.rb:21:1819:21:1830 | ( ... ) | | UseUseExplosion.rb:21:1832:21:2308 | then ... | UseUseExplosion.rb:21:1816:21:2324 | if ... | | UseUseExplosion.rb:21:1837:21:2308 | if ... | UseUseExplosion.rb:21:1832:21:2308 | then ... | | UseUseExplosion.rb:21:1841:21:1845 | [post] self | UseUseExplosion.rb:21:1862:21:1866 | self | | UseUseExplosion.rb:21:1841:21:1845 | [post] self | UseUseExplosion.rb:21:2299:21:2304 | self | | UseUseExplosion.rb:21:1841:21:1845 | self | UseUseExplosion.rb:21:1862:21:1866 | self | | UseUseExplosion.rb:21:1841:21:1845 | self | UseUseExplosion.rb:21:2299:21:2304 | self | -| UseUseExplosion.rb:21:1841:21:1850 | ... > ... | UseUseExplosion.rb:21:1840:21:1851 | [false] ( ... ) | -| UseUseExplosion.rb:21:1841:21:1850 | ... > ... | UseUseExplosion.rb:21:1840:21:1851 | [true] ( ... ) | +| UseUseExplosion.rb:21:1841:21:1850 | ... > ... | UseUseExplosion.rb:21:1840:21:1851 | ( ... ) | | UseUseExplosion.rb:21:1853:21:2292 | then ... | UseUseExplosion.rb:21:1837:21:2308 | if ... | | UseUseExplosion.rb:21:1858:21:2292 | if ... | UseUseExplosion.rb:21:1853:21:2292 | then ... | | UseUseExplosion.rb:21:1862:21:1866 | [post] self | UseUseExplosion.rb:21:1883:21:1887 | self | | UseUseExplosion.rb:21:1862:21:1866 | [post] self | UseUseExplosion.rb:21:2283:21:2288 | self | | UseUseExplosion.rb:21:1862:21:1866 | self | UseUseExplosion.rb:21:1883:21:1887 | self | | UseUseExplosion.rb:21:1862:21:1866 | self | UseUseExplosion.rb:21:2283:21:2288 | self | -| UseUseExplosion.rb:21:1862:21:1871 | ... > ... | UseUseExplosion.rb:21:1861:21:1872 | [false] ( ... ) | -| UseUseExplosion.rb:21:1862:21:1871 | ... > ... | UseUseExplosion.rb:21:1861:21:1872 | [true] ( ... ) | +| UseUseExplosion.rb:21:1862:21:1871 | ... > ... | UseUseExplosion.rb:21:1861:21:1872 | ( ... ) | | UseUseExplosion.rb:21:1874:21:2276 | then ... | UseUseExplosion.rb:21:1858:21:2292 | if ... | | UseUseExplosion.rb:21:1879:21:2276 | if ... | UseUseExplosion.rb:21:1874:21:2276 | then ... | | UseUseExplosion.rb:21:1883:21:1887 | [post] self | UseUseExplosion.rb:21:1904:21:1908 | self | | UseUseExplosion.rb:21:1883:21:1887 | [post] self | UseUseExplosion.rb:21:2267:21:2272 | self | | UseUseExplosion.rb:21:1883:21:1887 | self | UseUseExplosion.rb:21:1904:21:1908 | self | | UseUseExplosion.rb:21:1883:21:1887 | self | UseUseExplosion.rb:21:2267:21:2272 | self | -| UseUseExplosion.rb:21:1883:21:1892 | ... > ... | UseUseExplosion.rb:21:1882:21:1893 | [false] ( ... ) | -| UseUseExplosion.rb:21:1883:21:1892 | ... > ... | UseUseExplosion.rb:21:1882:21:1893 | [true] ( ... ) | +| UseUseExplosion.rb:21:1883:21:1892 | ... > ... | UseUseExplosion.rb:21:1882:21:1893 | ( ... ) | | UseUseExplosion.rb:21:1895:21:2260 | then ... | UseUseExplosion.rb:21:1879:21:2276 | if ... | | UseUseExplosion.rb:21:1900:21:2260 | if ... | UseUseExplosion.rb:21:1895:21:2260 | then ... | | UseUseExplosion.rb:21:1904:21:1908 | [post] self | UseUseExplosion.rb:21:1925:21:1929 | self | | UseUseExplosion.rb:21:1904:21:1908 | [post] self | UseUseExplosion.rb:21:2251:21:2256 | self | | UseUseExplosion.rb:21:1904:21:1908 | self | UseUseExplosion.rb:21:1925:21:1929 | self | | UseUseExplosion.rb:21:1904:21:1908 | self | UseUseExplosion.rb:21:2251:21:2256 | self | -| UseUseExplosion.rb:21:1904:21:1913 | ... > ... | UseUseExplosion.rb:21:1903:21:1914 | [false] ( ... ) | -| UseUseExplosion.rb:21:1904:21:1913 | ... > ... | UseUseExplosion.rb:21:1903:21:1914 | [true] ( ... ) | +| UseUseExplosion.rb:21:1904:21:1913 | ... > ... | UseUseExplosion.rb:21:1903:21:1914 | ( ... ) | | UseUseExplosion.rb:21:1916:21:2244 | then ... | UseUseExplosion.rb:21:1900:21:2260 | if ... | | UseUseExplosion.rb:21:1921:21:2244 | if ... | UseUseExplosion.rb:21:1916:21:2244 | then ... | | UseUseExplosion.rb:21:1925:21:1929 | [post] self | UseUseExplosion.rb:21:1945:21:1949 | self | | UseUseExplosion.rb:21:1925:21:1929 | [post] self | UseUseExplosion.rb:21:2235:21:2240 | self | | UseUseExplosion.rb:21:1925:21:1929 | self | UseUseExplosion.rb:21:1945:21:1949 | self | | UseUseExplosion.rb:21:1925:21:1929 | self | UseUseExplosion.rb:21:2235:21:2240 | self | -| UseUseExplosion.rb:21:1925:21:1933 | ... > ... | UseUseExplosion.rb:21:1924:21:1934 | [false] ( ... ) | -| UseUseExplosion.rb:21:1925:21:1933 | ... > ... | UseUseExplosion.rb:21:1924:21:1934 | [true] ( ... ) | +| UseUseExplosion.rb:21:1925:21:1933 | ... > ... | UseUseExplosion.rb:21:1924:21:1934 | ( ... ) | | UseUseExplosion.rb:21:1936:21:2228 | then ... | UseUseExplosion.rb:21:1921:21:2244 | if ... | | UseUseExplosion.rb:21:1941:21:2228 | if ... | UseUseExplosion.rb:21:1936:21:2228 | then ... | | UseUseExplosion.rb:21:1945:21:1949 | [post] self | UseUseExplosion.rb:21:1965:21:1969 | self | | UseUseExplosion.rb:21:1945:21:1949 | [post] self | UseUseExplosion.rb:21:2219:21:2224 | self | | UseUseExplosion.rb:21:1945:21:1949 | self | UseUseExplosion.rb:21:1965:21:1969 | self | | UseUseExplosion.rb:21:1945:21:1949 | self | UseUseExplosion.rb:21:2219:21:2224 | self | -| UseUseExplosion.rb:21:1945:21:1953 | ... > ... | UseUseExplosion.rb:21:1944:21:1954 | [false] ( ... ) | -| UseUseExplosion.rb:21:1945:21:1953 | ... > ... | UseUseExplosion.rb:21:1944:21:1954 | [true] ( ... ) | +| UseUseExplosion.rb:21:1945:21:1953 | ... > ... | UseUseExplosion.rb:21:1944:21:1954 | ( ... ) | | UseUseExplosion.rb:21:1956:21:2212 | then ... | UseUseExplosion.rb:21:1941:21:2228 | if ... | | UseUseExplosion.rb:21:1961:21:2212 | if ... | UseUseExplosion.rb:21:1956:21:2212 | then ... | | UseUseExplosion.rb:21:1965:21:1969 | [post] self | UseUseExplosion.rb:21:1985:21:1989 | self | | UseUseExplosion.rb:21:1965:21:1969 | [post] self | UseUseExplosion.rb:21:2203:21:2208 | self | | UseUseExplosion.rb:21:1965:21:1969 | self | UseUseExplosion.rb:21:1985:21:1989 | self | | UseUseExplosion.rb:21:1965:21:1969 | self | UseUseExplosion.rb:21:2203:21:2208 | self | -| UseUseExplosion.rb:21:1965:21:1973 | ... > ... | UseUseExplosion.rb:21:1964:21:1974 | [false] ( ... ) | -| UseUseExplosion.rb:21:1965:21:1973 | ... > ... | UseUseExplosion.rb:21:1964:21:1974 | [true] ( ... ) | +| UseUseExplosion.rb:21:1965:21:1973 | ... > ... | UseUseExplosion.rb:21:1964:21:1974 | ( ... ) | | UseUseExplosion.rb:21:1976:21:2196 | then ... | UseUseExplosion.rb:21:1961:21:2212 | if ... | | UseUseExplosion.rb:21:1981:21:2196 | if ... | UseUseExplosion.rb:21:1976:21:2196 | then ... | | UseUseExplosion.rb:21:1985:21:1989 | [post] self | UseUseExplosion.rb:21:2005:21:2009 | self | | UseUseExplosion.rb:21:1985:21:1989 | [post] self | UseUseExplosion.rb:21:2187:21:2192 | self | | UseUseExplosion.rb:21:1985:21:1989 | self | UseUseExplosion.rb:21:2005:21:2009 | self | | UseUseExplosion.rb:21:1985:21:1989 | self | UseUseExplosion.rb:21:2187:21:2192 | self | -| UseUseExplosion.rb:21:1985:21:1993 | ... > ... | UseUseExplosion.rb:21:1984:21:1994 | [false] ( ... ) | -| UseUseExplosion.rb:21:1985:21:1993 | ... > ... | UseUseExplosion.rb:21:1984:21:1994 | [true] ( ... ) | +| UseUseExplosion.rb:21:1985:21:1993 | ... > ... | UseUseExplosion.rb:21:1984:21:1994 | ( ... ) | | UseUseExplosion.rb:21:1996:21:2180 | then ... | UseUseExplosion.rb:21:1981:21:2196 | if ... | | UseUseExplosion.rb:21:2001:21:2180 | if ... | UseUseExplosion.rb:21:1996:21:2180 | then ... | | UseUseExplosion.rb:21:2005:21:2009 | [post] self | UseUseExplosion.rb:21:2025:21:2029 | self | | UseUseExplosion.rb:21:2005:21:2009 | [post] self | UseUseExplosion.rb:21:2171:21:2176 | self | | UseUseExplosion.rb:21:2005:21:2009 | self | UseUseExplosion.rb:21:2025:21:2029 | self | | UseUseExplosion.rb:21:2005:21:2009 | self | UseUseExplosion.rb:21:2171:21:2176 | self | -| UseUseExplosion.rb:21:2005:21:2013 | ... > ... | UseUseExplosion.rb:21:2004:21:2014 | [false] ( ... ) | -| UseUseExplosion.rb:21:2005:21:2013 | ... > ... | UseUseExplosion.rb:21:2004:21:2014 | [true] ( ... ) | +| UseUseExplosion.rb:21:2005:21:2013 | ... > ... | UseUseExplosion.rb:21:2004:21:2014 | ( ... ) | | UseUseExplosion.rb:21:2016:21:2164 | then ... | UseUseExplosion.rb:21:2001:21:2180 | if ... | | UseUseExplosion.rb:21:2021:21:2164 | if ... | UseUseExplosion.rb:21:2016:21:2164 | then ... | | UseUseExplosion.rb:21:2025:21:2029 | [post] self | UseUseExplosion.rb:21:2045:21:2049 | self | | UseUseExplosion.rb:21:2025:21:2029 | [post] self | UseUseExplosion.rb:21:2155:21:2160 | self | | UseUseExplosion.rb:21:2025:21:2029 | self | UseUseExplosion.rb:21:2045:21:2049 | self | | UseUseExplosion.rb:21:2025:21:2029 | self | UseUseExplosion.rb:21:2155:21:2160 | self | -| UseUseExplosion.rb:21:2025:21:2033 | ... > ... | UseUseExplosion.rb:21:2024:21:2034 | [false] ( ... ) | -| UseUseExplosion.rb:21:2025:21:2033 | ... > ... | UseUseExplosion.rb:21:2024:21:2034 | [true] ( ... ) | +| UseUseExplosion.rb:21:2025:21:2033 | ... > ... | UseUseExplosion.rb:21:2024:21:2034 | ( ... ) | | UseUseExplosion.rb:21:2036:21:2148 | then ... | UseUseExplosion.rb:21:2021:21:2164 | if ... | | UseUseExplosion.rb:21:2041:21:2148 | if ... | UseUseExplosion.rb:21:2036:21:2148 | then ... | | UseUseExplosion.rb:21:2045:21:2049 | [post] self | UseUseExplosion.rb:21:2065:21:2069 | self | | UseUseExplosion.rb:21:2045:21:2049 | [post] self | UseUseExplosion.rb:21:2139:21:2144 | self | | UseUseExplosion.rb:21:2045:21:2049 | self | UseUseExplosion.rb:21:2065:21:2069 | self | | UseUseExplosion.rb:21:2045:21:2049 | self | UseUseExplosion.rb:21:2139:21:2144 | self | -| UseUseExplosion.rb:21:2045:21:2053 | ... > ... | UseUseExplosion.rb:21:2044:21:2054 | [false] ( ... ) | -| UseUseExplosion.rb:21:2045:21:2053 | ... > ... | UseUseExplosion.rb:21:2044:21:2054 | [true] ( ... ) | +| UseUseExplosion.rb:21:2045:21:2053 | ... > ... | UseUseExplosion.rb:21:2044:21:2054 | ( ... ) | | UseUseExplosion.rb:21:2056:21:2132 | then ... | UseUseExplosion.rb:21:2041:21:2148 | if ... | | UseUseExplosion.rb:21:2061:21:2132 | if ... | UseUseExplosion.rb:21:2056:21:2132 | then ... | | UseUseExplosion.rb:21:2065:21:2069 | [post] self | UseUseExplosion.rb:21:2085:21:2089 | self | | UseUseExplosion.rb:21:2065:21:2069 | [post] self | UseUseExplosion.rb:21:2123:21:2128 | self | | UseUseExplosion.rb:21:2065:21:2069 | self | UseUseExplosion.rb:21:2085:21:2089 | self | | UseUseExplosion.rb:21:2065:21:2069 | self | UseUseExplosion.rb:21:2123:21:2128 | self | -| UseUseExplosion.rb:21:2065:21:2073 | ... > ... | UseUseExplosion.rb:21:2064:21:2074 | [false] ( ... ) | -| UseUseExplosion.rb:21:2065:21:2073 | ... > ... | UseUseExplosion.rb:21:2064:21:2074 | [true] ( ... ) | +| UseUseExplosion.rb:21:2065:21:2073 | ... > ... | UseUseExplosion.rb:21:2064:21:2074 | ( ... ) | | UseUseExplosion.rb:21:2076:21:2116 | then ... | UseUseExplosion.rb:21:2061:21:2132 | if ... | | UseUseExplosion.rb:21:2081:21:2116 | if ... | UseUseExplosion.rb:21:2076:21:2116 | then ... | | UseUseExplosion.rb:21:2085:21:2089 | [post] self | UseUseExplosion.rb:21:2107:21:2112 | self | | UseUseExplosion.rb:21:2085:21:2089 | self | UseUseExplosion.rb:21:2107:21:2112 | self | -| UseUseExplosion.rb:21:2085:21:2093 | ... > ... | UseUseExplosion.rb:21:2084:21:2094 | [false] ( ... ) | -| UseUseExplosion.rb:21:2085:21:2093 | ... > ... | UseUseExplosion.rb:21:2084:21:2094 | [true] ( ... ) | +| UseUseExplosion.rb:21:2085:21:2093 | ... > ... | UseUseExplosion.rb:21:2084:21:2094 | ( ... ) | | UseUseExplosion.rb:21:2096:21:2099 | then ... | UseUseExplosion.rb:21:2081:21:2116 | if ... | | UseUseExplosion.rb:21:2102:21:2112 | else ... | UseUseExplosion.rb:21:2081:21:2116 | if ... | | UseUseExplosion.rb:21:2107:21:2112 | call to use | UseUseExplosion.rb:21:2102:21:2112 | else ... | @@ -2525,6 +2326,7 @@ | local_dataflow.rb:5:8:5:12 | ... = ... | local_dataflow.rb:5:7:5:13 | ( ... ) | | local_dataflow.rb:5:12:5:12 | a | local_dataflow.rb:5:8:5:12 | ... = ... | | local_dataflow.rb:5:12:5:12 | a | local_dataflow.rb:6:8:6:8 | a | +| local_dataflow.rb:6:3:6:14 | ... = ... | local_dataflow.rb:2:3:6:14 | ... | | local_dataflow.rb:6:7:6:14 | ( ... ) | local_dataflow.rb:6:3:6:14 | ... = ... | | local_dataflow.rb:6:8:6:13 | ... = ... | local_dataflow.rb:6:7:6:14 | ( ... ) | | local_dataflow.rb:6:10:6:11 | ... + ... | local_dataflow.rb:6:8:6:13 | ... = ... | @@ -2552,6 +2354,7 @@ | local_dataflow.rb:10:14:10:18 | array | local_dataflow.rb:15:10:15:14 | array | | local_dataflow.rb:11:1:11:2 | [post] self | local_dataflow.rb:12:3:12:5 | self | | local_dataflow.rb:11:1:11:2 | self | local_dataflow.rb:12:3:12:5 | self | +| local_dataflow.rb:12:3:12:5 | call to p | local_dataflow.rb:10:5:13:3 | ... | | local_dataflow.rb:15:1:17:3 | x | local_dataflow.rb:19:5:19:5 | x | | local_dataflow.rb:15:1:17:3 | __synth__0__1 | local_dataflow.rb:15:1:17:3 | ... = ... | | local_dataflow.rb:15:1:17:3 | __synth__0__1 | local_dataflow.rb:15:1:17:3 | __synth__0__1 | @@ -2589,9 +2392,11 @@ | local_dataflow.rb:30:14:30:20 | "class" | local_dataflow.rb:30:5:30:24 | C | | local_dataflow.rb:32:5:32:25 | bar | local_dataflow.rb:32:1:32:1 | x | | local_dataflow.rb:32:5:32:25 | bar | local_dataflow.rb:32:1:32:25 | ... = ... | +| local_dataflow.rb:32:14:32:21 | "method" | local_dataflow.rb:32:14:32:21 | ... | | local_dataflow.rb:34:7:34:7 | x | local_dataflow.rb:34:7:34:7 | x | | local_dataflow.rb:34:7:34:7 | x | local_dataflow.rb:35:6:35:6 | x | | local_dataflow.rb:36:13:36:13 | 7 | local_dataflow.rb:36:6:36:13 | return | +| local_dataflow.rb:38:3:38:13 | "reachable" | local_dataflow.rb:35:3:38:13 | ... | | local_dataflow.rb:41:7:41:7 | x | local_dataflow.rb:41:7:41:7 | x | | local_dataflow.rb:41:7:41:7 | x | local_dataflow.rb:42:6:42:6 | x | | local_dataflow.rb:43:13:43:13 | 7 | local_dataflow.rb:43:6:43:13 | return | @@ -2603,6 +2408,7 @@ | local_dataflow.rb:50:18:50:18 | [post] x | local_dataflow.rb:51:20:51:20 | x | | local_dataflow.rb:50:18:50:18 | x | local_dataflow.rb:51:20:51:20 | x | | local_dataflow.rb:51:9:51:15 | "break" | local_dataflow.rb:51:3:51:15 | break | +| local_dataflow.rb:52:3:52:10 | "normal" | local_dataflow.rb:50:3:52:10 | ... | | local_dataflow.rb:55:5:55:13 | synthetic splat argument | local_dataflow.rb:55:5:55:13 | call to [] | | local_dataflow.rb:60:1:90:3 | self (test_case) | local_dataflow.rb:78:12:78:20 | self | | local_dataflow.rb:60:1:90:3 | self in test_case | local_dataflow.rb:60:1:90:3 | self (test_case) | @@ -2695,6 +2501,7 @@ | local_dataflow.rb:87:25:87:25 | [post] x | local_dataflow.rb:87:29:87:29 | x | | local_dataflow.rb:87:25:87:25 | x | local_dataflow.rb:87:29:87:29 | x | | local_dataflow.rb:87:29:87:29 | x | local_dataflow.rb:87:15:87:48 | then ... | +| local_dataflow.rb:89:3:89:9 | call to sink | local_dataflow.rb:61:3:89:28 | ... | | local_dataflow.rb:92:1:109:3 | self (and_or) | local_dataflow.rb:93:7:93:15 | self | | local_dataflow.rb:92:1:109:3 | self in and_or | local_dataflow.rb:92:1:109:3 | self (and_or) | | local_dataflow.rb:93:3:93:3 | a | local_dataflow.rb:94:8:94:8 | a | @@ -2784,6 +2591,7 @@ | local_dataflow.rb:107:9:107:17 | [post] self | local_dataflow.rb:108:3:108:9 | self | | local_dataflow.rb:107:9:107:17 | call to source | local_dataflow.rb:107:5:107:7 | ... && ... | | local_dataflow.rb:107:9:107:17 | self | local_dataflow.rb:108:3:108:9 | self | +| local_dataflow.rb:108:3:108:9 | call to sink | local_dataflow.rb:93:3:108:28 | ... | | local_dataflow.rb:111:1:114:3 | self (object_dup) | local_dataflow.rb:112:3:112:21 | self | | local_dataflow.rb:111:1:114:3 | self in object_dup | local_dataflow.rb:111:1:114:3 | self (object_dup) | | local_dataflow.rb:112:3:112:21 | [post] self | local_dataflow.rb:112:8:112:16 | self | @@ -2792,6 +2600,7 @@ | local_dataflow.rb:112:8:112:16 | call to source | local_dataflow.rb:112:8:112:20 | call to dup | | local_dataflow.rb:112:8:112:16 | self | local_dataflow.rb:113:3:113:25 | self | | local_dataflow.rb:113:3:113:25 | [post] self | local_dataflow.rb:113:8:113:16 | self | +| local_dataflow.rb:113:3:113:25 | call to sink | local_dataflow.rb:112:3:113:44 | ... | | local_dataflow.rb:113:3:113:25 | self | local_dataflow.rb:113:8:113:16 | self | | local_dataflow.rb:113:8:113:16 | call to source | local_dataflow.rb:113:8:113:20 | call to dup | | local_dataflow.rb:113:8:113:20 | call to dup | local_dataflow.rb:113:8:113:24 | call to dup | @@ -2808,25 +2617,31 @@ | local_dataflow.rb:118:17:118:31 | self | local_dataflow.rb:118:23:118:29 | self | | local_dataflow.rb:118:20:118:20 | x | local_dataflow.rb:118:20:118:20 | x | | local_dataflow.rb:118:20:118:20 | x | local_dataflow.rb:118:28:118:28 | x | +| local_dataflow.rb:118:23:118:29 | call to sink | local_dataflow.rb:118:23:118:29 | ... | | local_dataflow.rb:119:3:119:31 | [post] self | local_dataflow.rb:119:8:119:16 | self | +| local_dataflow.rb:119:3:119:31 | call to sink | local_dataflow.rb:117:3:119:50 | ... | | local_dataflow.rb:119:3:119:31 | self | local_dataflow.rb:119:8:119:16 | self | | local_dataflow.rb:119:8:119:16 | call to source | local_dataflow.rb:119:8:119:23 | call to tap | | local_dataflow.rb:119:8:119:23 | call to tap | local_dataflow.rb:119:8:119:30 | call to tap | | local_dataflow.rb:122:1:124:3 | self (dup_tap) | local_dataflow.rb:123:3:123:50 | self | | local_dataflow.rb:122:1:124:3 | self in dup_tap | local_dataflow.rb:122:1:124:3 | self (dup_tap) | | local_dataflow.rb:123:3:123:50 | [post] self | local_dataflow.rb:123:8:123:16 | self | +| local_dataflow.rb:123:3:123:50 | call to sink | local_dataflow.rb:123:3:123:70 | ... | | local_dataflow.rb:123:3:123:50 | self | local_dataflow.rb:123:8:123:16 | self | | local_dataflow.rb:123:8:123:16 | call to source | local_dataflow.rb:123:8:123:20 | call to dup | | local_dataflow.rb:123:8:123:20 | call to dup | local_dataflow.rb:123:8:123:45 | call to tap | | local_dataflow.rb:123:8:123:45 | call to tap | local_dataflow.rb:123:8:123:49 | call to dup | | local_dataflow.rb:123:26:123:45 | self | local_dataflow.rb:123:32:123:43 | self | +| local_dataflow.rb:123:32:123:43 | call to puts | local_dataflow.rb:123:32:123:43 | ... | | local_dataflow.rb:126:1:128:3 | self (use) | local_dataflow.rb:127:3:127:8 | self | | local_dataflow.rb:126:1:128:3 | self in use | local_dataflow.rb:126:1:128:3 | self (use) | +| local_dataflow.rb:127:3:127:8 | call to rand | local_dataflow.rb:127:3:127:8 | ... | | local_dataflow.rb:130:1:150:3 | self (use_use_madness) | local_dataflow.rb:132:6:132:11 | self | | local_dataflow.rb:130:1:150:3 | self in use_use_madness | local_dataflow.rb:130:1:150:3 | self (use_use_madness) | | local_dataflow.rb:131:3:131:3 | x | local_dataflow.rb:132:10:132:10 | x | | local_dataflow.rb:131:7:131:8 | "" | local_dataflow.rb:131:3:131:3 | x | | local_dataflow.rb:131:7:131:8 | "" | local_dataflow.rb:131:3:131:8 | ... = ... | +| local_dataflow.rb:132:3:149:5 | if ... | local_dataflow.rb:131:3:149:5 | ... | | local_dataflow.rb:132:6:132:11 | [post] self | local_dataflow.rb:133:8:133:13 | self | | local_dataflow.rb:132:6:132:11 | self | local_dataflow.rb:133:8:133:13 | self | | local_dataflow.rb:132:10:132:10 | [post] x | local_dataflow.rb:133:12:133:12 | x | @@ -2836,8 +2651,7 @@ | local_dataflow.rb:133:8:133:13 | [input] SSA phi read(x) | local_dataflow.rb:134:11:134:11 | x | | local_dataflow.rb:133:8:133:13 | [post] self | local_dataflow.rb:133:8:133:13 | [input] SSA phi read(self) | | local_dataflow.rb:133:8:133:13 | [post] self | local_dataflow.rb:133:18:133:23 | self | -| local_dataflow.rb:133:8:133:13 | call to use | local_dataflow.rb:133:8:133:23 | [false] ... \|\| ... | -| local_dataflow.rb:133:8:133:13 | call to use | local_dataflow.rb:133:8:133:23 | [true] ... \|\| ... | +| local_dataflow.rb:133:8:133:13 | call to use | local_dataflow.rb:133:8:133:23 | ... \|\| ... | | local_dataflow.rb:133:8:133:13 | self | local_dataflow.rb:133:8:133:13 | [input] SSA phi read(self) | | local_dataflow.rb:133:8:133:13 | self | local_dataflow.rb:133:18:133:23 | self | | local_dataflow.rb:133:12:133:12 | [post] x | local_dataflow.rb:133:8:133:13 | [input] SSA phi read(x) | @@ -2848,8 +2662,7 @@ | local_dataflow.rb:133:18:133:23 | [input] SSA phi read(x) | local_dataflow.rb:134:11:134:11 | x | | local_dataflow.rb:133:18:133:23 | [post] self | local_dataflow.rb:133:18:133:23 | [input] SSA phi read(self) | | local_dataflow.rb:133:18:133:23 | [post] self | local_dataflow.rb:136:7:136:12 | self | -| local_dataflow.rb:133:18:133:23 | call to use | local_dataflow.rb:133:8:133:23 | [false] ... \|\| ... | -| local_dataflow.rb:133:18:133:23 | call to use | local_dataflow.rb:133:8:133:23 | [true] ... \|\| ... | +| local_dataflow.rb:133:18:133:23 | call to use | local_dataflow.rb:133:8:133:23 | ... \|\| ... | | local_dataflow.rb:133:18:133:23 | self | local_dataflow.rb:133:18:133:23 | [input] SSA phi read(self) | | local_dataflow.rb:133:18:133:23 | self | local_dataflow.rb:136:7:136:12 | self | | local_dataflow.rb:133:22:133:22 | [post] x | local_dataflow.rb:133:18:133:23 | [input] SSA phi read(x) | @@ -2882,10 +2695,9 @@ | local_dataflow.rb:137:14:137:14 | [post] x | local_dataflow.rb:137:25:137:25 | x | | local_dataflow.rb:137:14:137:14 | x | local_dataflow.rb:137:10:137:15 | [input] SSA phi read(x) | | local_dataflow.rb:137:14:137:14 | x | local_dataflow.rb:137:25:137:25 | x | -| local_dataflow.rb:137:20:137:26 | [false] ! ... | local_dataflow.rb:137:10:137:26 | [false] ... && ... | +| local_dataflow.rb:137:20:137:26 | ! ... | local_dataflow.rb:137:10:137:26 | ... && ... | | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(self) | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(self) | | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(x) | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(x) | -| local_dataflow.rb:137:20:137:26 | [true] ! ... | local_dataflow.rb:137:10:137:26 | [true] ... && ... | | local_dataflow.rb:137:21:137:26 | [post] self | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(self) | | local_dataflow.rb:137:21:137:26 | [post] self | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(self) | | local_dataflow.rb:137:21:137:26 | self | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(self) | @@ -2894,11 +2706,9 @@ | local_dataflow.rb:137:25:137:25 | [post] x | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(x) | | local_dataflow.rb:137:25:137:25 | x | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(x) | | local_dataflow.rb:137:25:137:25 | x | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(x) | -| local_dataflow.rb:141:8:141:14 | [false] ! ... | local_dataflow.rb:141:8:141:37 | [false] ... \|\| ... | -| local_dataflow.rb:141:8:141:14 | [false] ! ... | local_dataflow.rb:141:8:141:37 | [true] ... \|\| ... | +| local_dataflow.rb:141:8:141:14 | ! ... | local_dataflow.rb:141:8:141:37 | ... \|\| ... | | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(self) | local_dataflow.rb:141:38:142:9 | [input] SSA phi read(self) | | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(x) | local_dataflow.rb:141:38:142:9 | [input] SSA phi read(x) | -| local_dataflow.rb:141:8:141:14 | [true] ! ... | local_dataflow.rb:141:8:141:37 | [true] ... \|\| ... | | local_dataflow.rb:141:9:141:14 | [post] self | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(self) | | local_dataflow.rb:141:9:141:14 | [post] self | local_dataflow.rb:141:20:141:25 | self | | local_dataflow.rb:141:9:141:14 | self | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(self) | @@ -2907,28 +2717,24 @@ | local_dataflow.rb:141:13:141:13 | [post] x | local_dataflow.rb:141:24:141:24 | x | | local_dataflow.rb:141:13:141:13 | x | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(x) | | local_dataflow.rb:141:13:141:13 | x | local_dataflow.rb:141:24:141:24 | x | -| local_dataflow.rb:141:19:141:37 | [false] ( ... ) | local_dataflow.rb:141:8:141:37 | [false] ... \|\| ... | +| local_dataflow.rb:141:19:141:37 | ( ... ) | local_dataflow.rb:141:8:141:37 | ... \|\| ... | | local_dataflow.rb:141:19:141:37 | [input] SSA phi read(self) | local_dataflow.rb:141:38:142:9 | [input] SSA phi read(self) | | local_dataflow.rb:141:19:141:37 | [input] SSA phi read(x) | local_dataflow.rb:141:38:142:9 | [input] SSA phi read(x) | -| local_dataflow.rb:141:19:141:37 | [post] [false] ( ... ) | local_dataflow.rb:141:20:141:36 | [post] [false] ... && ... | -| local_dataflow.rb:141:19:141:37 | [post] [true] ( ... ) | local_dataflow.rb:141:20:141:36 | [post] [true] ... && ... | -| local_dataflow.rb:141:19:141:37 | [true] ( ... ) | local_dataflow.rb:141:8:141:37 | [true] ... \|\| ... | +| local_dataflow.rb:141:19:141:37 | [post] ( ... ) | local_dataflow.rb:141:20:141:36 | [post] ... && ... | | local_dataflow.rb:141:20:141:25 | [input] SSA phi read(self) | local_dataflow.rb:143:11:143:16 | self | | local_dataflow.rb:141:20:141:25 | [input] SSA phi read(x) | local_dataflow.rb:143:15:143:15 | x | | local_dataflow.rb:141:20:141:25 | [post] self | local_dataflow.rb:141:20:141:25 | [input] SSA phi read(self) | | local_dataflow.rb:141:20:141:25 | [post] self | local_dataflow.rb:141:31:141:36 | self | | local_dataflow.rb:141:20:141:25 | self | local_dataflow.rb:141:20:141:25 | [input] SSA phi read(self) | | local_dataflow.rb:141:20:141:25 | self | local_dataflow.rb:141:31:141:36 | self | -| local_dataflow.rb:141:20:141:36 | [false] ... && ... | local_dataflow.rb:141:19:141:37 | [false] ( ... ) | -| local_dataflow.rb:141:20:141:36 | [true] ... && ... | local_dataflow.rb:141:19:141:37 | [true] ( ... ) | +| local_dataflow.rb:141:20:141:36 | ... && ... | local_dataflow.rb:141:19:141:37 | ( ... ) | | local_dataflow.rb:141:24:141:24 | [post] x | local_dataflow.rb:141:20:141:25 | [input] SSA phi read(x) | | local_dataflow.rb:141:24:141:24 | [post] x | local_dataflow.rb:141:35:141:35 | x | | local_dataflow.rb:141:24:141:24 | x | local_dataflow.rb:141:20:141:25 | [input] SSA phi read(x) | | local_dataflow.rb:141:24:141:24 | x | local_dataflow.rb:141:35:141:35 | x | -| local_dataflow.rb:141:30:141:36 | [false] ! ... | local_dataflow.rb:141:20:141:36 | [false] ... && ... | +| local_dataflow.rb:141:30:141:36 | ! ... | local_dataflow.rb:141:20:141:36 | ... && ... | | local_dataflow.rb:141:30:141:36 | [input] SSA phi read(self) | local_dataflow.rb:143:11:143:16 | self | | local_dataflow.rb:141:30:141:36 | [input] SSA phi read(x) | local_dataflow.rb:143:15:143:15 | x | -| local_dataflow.rb:141:30:141:36 | [true] ! ... | local_dataflow.rb:141:20:141:36 | [true] ... && ... | | local_dataflow.rb:141:31:141:36 | [post] self | local_dataflow.rb:141:19:141:37 | [input] SSA phi read(self) | | local_dataflow.rb:141:31:141:36 | [post] self | local_dataflow.rb:141:30:141:36 | [input] SSA phi read(self) | | local_dataflow.rb:141:31:141:36 | self | local_dataflow.rb:141:19:141:37 | [input] SSA phi read(self) | @@ -2946,8 +2752,7 @@ | local_dataflow.rb:143:11:143:16 | [input] SSA phi read(x) | local_dataflow.rb:144:15:144:15 | x | | local_dataflow.rb:143:11:143:16 | [post] self | local_dataflow.rb:143:11:143:16 | [input] SSA phi read(self) | | local_dataflow.rb:143:11:143:16 | [post] self | local_dataflow.rb:143:21:143:26 | self | -| local_dataflow.rb:143:11:143:16 | call to use | local_dataflow.rb:143:11:143:26 | [false] ... \|\| ... | -| local_dataflow.rb:143:11:143:16 | call to use | local_dataflow.rb:143:11:143:26 | [true] ... \|\| ... | +| local_dataflow.rb:143:11:143:16 | call to use | local_dataflow.rb:143:11:143:26 | ... \|\| ... | | local_dataflow.rb:143:11:143:16 | self | local_dataflow.rb:143:11:143:16 | [input] SSA phi read(self) | | local_dataflow.rb:143:11:143:16 | self | local_dataflow.rb:143:21:143:26 | self | | local_dataflow.rb:143:11:143:26 | [input] SSA phi read(self) | local_dataflow.rb:147:5:147:10 | self | @@ -2960,8 +2765,7 @@ | local_dataflow.rb:143:21:143:26 | [input] SSA phi read(x) | local_dataflow.rb:144:15:144:15 | x | | local_dataflow.rb:143:21:143:26 | [post] self | local_dataflow.rb:143:11:143:26 | [input] SSA phi read(self) | | local_dataflow.rb:143:21:143:26 | [post] self | local_dataflow.rb:143:21:143:26 | [input] SSA phi read(self) | -| local_dataflow.rb:143:21:143:26 | call to use | local_dataflow.rb:143:11:143:26 | [false] ... \|\| ... | -| local_dataflow.rb:143:21:143:26 | call to use | local_dataflow.rb:143:11:143:26 | [true] ... \|\| ... | +| local_dataflow.rb:143:21:143:26 | call to use | local_dataflow.rb:143:11:143:26 | ... \|\| ... | | local_dataflow.rb:143:21:143:26 | self | local_dataflow.rb:143:11:143:26 | [input] SSA phi read(self) | | local_dataflow.rb:143:21:143:26 | self | local_dataflow.rb:143:21:143:26 | [input] SSA phi read(self) | | local_dataflow.rb:143:25:143:25 | [post] x | local_dataflow.rb:143:11:143:26 | [input] SSA phi read(x) | diff --git a/ruby/ql/test/library-tests/dataflow/local/Nodes.expected b/ruby/ql/test/library-tests/dataflow/local/Nodes.expected index 2ce5b9c2f237..797c9852de73 100644 --- a/ruby/ql/test/library-tests/dataflow/local/Nodes.expected +++ b/ruby/ql/test/library-tests/dataflow/local/Nodes.expected @@ -1234,8 +1234,7 @@ arg | local_dataflow.rb:9:12:9:12 | 2 | local_dataflow.rb:9:9:9:15 | call to [] | position 1 | | local_dataflow.rb:9:14:9:14 | 3 | local_dataflow.rb:9:9:9:15 | call to [] | position 2 | | local_dataflow.rb:10:5:13:3 | { ... } | local_dataflow.rb:10:5:13:3 | call to each | block | -| local_dataflow.rb:10:9:10:9 | defined? ... | local_dataflow.rb:10:9:10:9 | [false] ! ... | self | -| local_dataflow.rb:10:9:10:9 | defined? ... | local_dataflow.rb:10:9:10:9 | [true] ! ... | self | +| local_dataflow.rb:10:9:10:9 | defined? ... | local_dataflow.rb:10:9:10:9 | ! ... | self | | local_dataflow.rb:10:9:10:9 | x | local_dataflow.rb:10:9:10:9 | defined? ... | self | | local_dataflow.rb:10:14:10:18 | array | local_dataflow.rb:10:5:13:3 | call to each | self | | local_dataflow.rb:11:1:11:2 | self | local_dataflow.rb:11:1:11:2 | call to do | self | @@ -1243,13 +1242,11 @@ arg | local_dataflow.rb:12:3:12:5 | synthetic splat argument | local_dataflow.rb:12:3:12:5 | call to p | synthetic * | | local_dataflow.rb:12:5:12:5 | x | local_dataflow.rb:12:3:12:5 | call to p | position 0 | | local_dataflow.rb:15:1:17:3 | { ... } | local_dataflow.rb:15:1:17:3 | call to each | block | -| local_dataflow.rb:15:5:15:5 | defined? ... | local_dataflow.rb:15:5:15:5 | [false] ! ... | self | -| local_dataflow.rb:15:5:15:5 | defined? ... | local_dataflow.rb:15:5:15:5 | [true] ! ... | self | +| local_dataflow.rb:15:5:15:5 | defined? ... | local_dataflow.rb:15:5:15:5 | ! ... | self | | local_dataflow.rb:15:5:15:5 | x | local_dataflow.rb:15:5:15:5 | defined? ... | self | | local_dataflow.rb:15:10:15:14 | array | local_dataflow.rb:15:1:17:3 | call to each | self | | local_dataflow.rb:19:1:21:3 | { ... } | local_dataflow.rb:19:1:21:3 | call to each | block | -| local_dataflow.rb:19:5:19:5 | defined? ... | local_dataflow.rb:19:5:19:5 | [false] ! ... | self | -| local_dataflow.rb:19:5:19:5 | defined? ... | local_dataflow.rb:19:5:19:5 | [true] ! ... | self | +| local_dataflow.rb:19:5:19:5 | defined? ... | local_dataflow.rb:19:5:19:5 | ! ... | self | | local_dataflow.rb:19:5:19:5 | x | local_dataflow.rb:19:5:19:5 | defined? ... | self | | local_dataflow.rb:19:10:19:14 | array | local_dataflow.rb:19:1:21:3 | call to each | self | | local_dataflow.rb:20:6:20:6 | x | local_dataflow.rb:20:6:20:10 | ... > ... | self | @@ -1445,15 +1442,12 @@ arg | local_dataflow.rb:132:6:132:11 | self | local_dataflow.rb:132:6:132:11 | call to use | self | | local_dataflow.rb:132:6:132:11 | synthetic splat argument | local_dataflow.rb:132:6:132:11 | call to use | synthetic * | | local_dataflow.rb:132:10:132:10 | x | local_dataflow.rb:132:6:132:11 | call to use | position 0 | -| local_dataflow.rb:133:8:133:13 | call to use | local_dataflow.rb:133:8:133:23 | [false] ... \|\| ... | self | -| local_dataflow.rb:133:8:133:13 | call to use | local_dataflow.rb:133:8:133:23 | [true] ... \|\| ... | self | +| local_dataflow.rb:133:8:133:13 | call to use | local_dataflow.rb:133:8:133:23 | ... \|\| ... | self | | local_dataflow.rb:133:8:133:13 | self | local_dataflow.rb:133:8:133:13 | call to use | self | | local_dataflow.rb:133:8:133:13 | synthetic splat argument | local_dataflow.rb:133:8:133:13 | call to use | synthetic * | -| local_dataflow.rb:133:8:133:23 | synthetic splat argument | local_dataflow.rb:133:8:133:23 | [false] ... \|\| ... | synthetic * | -| local_dataflow.rb:133:8:133:23 | synthetic splat argument | local_dataflow.rb:133:8:133:23 | [true] ... \|\| ... | synthetic * | +| local_dataflow.rb:133:8:133:23 | synthetic splat argument | local_dataflow.rb:133:8:133:23 | ... \|\| ... | synthetic * | | local_dataflow.rb:133:12:133:12 | x | local_dataflow.rb:133:8:133:13 | call to use | position 0 | -| local_dataflow.rb:133:18:133:23 | call to use | local_dataflow.rb:133:8:133:23 | [false] ... \|\| ... | position 0 | -| local_dataflow.rb:133:18:133:23 | call to use | local_dataflow.rb:133:8:133:23 | [true] ... \|\| ... | position 0 | +| local_dataflow.rb:133:18:133:23 | call to use | local_dataflow.rb:133:8:133:23 | ... \|\| ... | position 0 | | local_dataflow.rb:133:18:133:23 | self | local_dataflow.rb:133:18:133:23 | call to use | self | | local_dataflow.rb:133:18:133:23 | synthetic splat argument | local_dataflow.rb:133:18:133:23 | call to use | synthetic * | | local_dataflow.rb:133:22:133:22 | x | local_dataflow.rb:133:18:133:23 | call to use | position 0 | @@ -1463,55 +1457,39 @@ arg | local_dataflow.rb:136:7:136:12 | self | local_dataflow.rb:136:7:136:12 | call to use | self | | local_dataflow.rb:136:7:136:12 | synthetic splat argument | local_dataflow.rb:136:7:136:12 | call to use | synthetic * | | local_dataflow.rb:136:11:136:11 | x | local_dataflow.rb:136:7:136:12 | call to use | position 0 | -| local_dataflow.rb:137:10:137:15 | call to use | local_dataflow.rb:137:10:137:26 | [false] ... && ... | self | -| local_dataflow.rb:137:10:137:15 | call to use | local_dataflow.rb:137:10:137:26 | [true] ... && ... | self | +| local_dataflow.rb:137:10:137:15 | call to use | local_dataflow.rb:137:10:137:26 | ... && ... | self | | local_dataflow.rb:137:10:137:15 | self | local_dataflow.rb:137:10:137:15 | call to use | self | | local_dataflow.rb:137:10:137:15 | synthetic splat argument | local_dataflow.rb:137:10:137:15 | call to use | synthetic * | -| local_dataflow.rb:137:10:137:26 | synthetic splat argument | local_dataflow.rb:137:10:137:26 | [false] ... && ... | synthetic * | -| local_dataflow.rb:137:10:137:26 | synthetic splat argument | local_dataflow.rb:137:10:137:26 | [true] ... && ... | synthetic * | +| local_dataflow.rb:137:10:137:26 | synthetic splat argument | local_dataflow.rb:137:10:137:26 | ... && ... | synthetic * | | local_dataflow.rb:137:14:137:14 | x | local_dataflow.rb:137:10:137:15 | call to use | position 0 | -| local_dataflow.rb:137:20:137:26 | [false] ! ... | local_dataflow.rb:137:10:137:26 | [false] ... && ... | position 0 | -| local_dataflow.rb:137:20:137:26 | [true] ! ... | local_dataflow.rb:137:10:137:26 | [true] ... && ... | position 0 | -| local_dataflow.rb:137:21:137:26 | call to use | local_dataflow.rb:137:20:137:26 | [false] ! ... | self | -| local_dataflow.rb:137:21:137:26 | call to use | local_dataflow.rb:137:20:137:26 | [true] ! ... | self | +| local_dataflow.rb:137:20:137:26 | ! ... | local_dataflow.rb:137:10:137:26 | ... && ... | position 0 | +| local_dataflow.rb:137:21:137:26 | call to use | local_dataflow.rb:137:20:137:26 | ! ... | self | | local_dataflow.rb:137:21:137:26 | self | local_dataflow.rb:137:21:137:26 | call to use | self | | local_dataflow.rb:137:21:137:26 | synthetic splat argument | local_dataflow.rb:137:21:137:26 | call to use | synthetic * | | local_dataflow.rb:137:25:137:25 | x | local_dataflow.rb:137:21:137:26 | call to use | position 0 | -| local_dataflow.rb:141:8:141:14 | [false] ! ... | local_dataflow.rb:141:8:141:37 | [false] ... \|\| ... | self | -| local_dataflow.rb:141:8:141:14 | [false] ! ... | local_dataflow.rb:141:8:141:37 | [true] ... \|\| ... | self | -| local_dataflow.rb:141:8:141:14 | [true] ! ... | local_dataflow.rb:141:8:141:37 | [true] ... \|\| ... | self | -| local_dataflow.rb:141:8:141:37 | synthetic splat argument | local_dataflow.rb:141:8:141:37 | [false] ... \|\| ... | synthetic * | -| local_dataflow.rb:141:8:141:37 | synthetic splat argument | local_dataflow.rb:141:8:141:37 | [true] ... \|\| ... | synthetic * | -| local_dataflow.rb:141:9:141:14 | call to use | local_dataflow.rb:141:8:141:14 | [false] ! ... | self | -| local_dataflow.rb:141:9:141:14 | call to use | local_dataflow.rb:141:8:141:14 | [true] ! ... | self | +| local_dataflow.rb:141:8:141:14 | ! ... | local_dataflow.rb:141:8:141:37 | ... \|\| ... | self | +| local_dataflow.rb:141:8:141:37 | synthetic splat argument | local_dataflow.rb:141:8:141:37 | ... \|\| ... | synthetic * | +| local_dataflow.rb:141:9:141:14 | call to use | local_dataflow.rb:141:8:141:14 | ! ... | self | | local_dataflow.rb:141:9:141:14 | self | local_dataflow.rb:141:9:141:14 | call to use | self | | local_dataflow.rb:141:9:141:14 | synthetic splat argument | local_dataflow.rb:141:9:141:14 | call to use | synthetic * | | local_dataflow.rb:141:13:141:13 | x | local_dataflow.rb:141:9:141:14 | call to use | position 0 | -| local_dataflow.rb:141:19:141:37 | [false] ( ... ) | local_dataflow.rb:141:8:141:37 | [false] ... \|\| ... | position 0 | -| local_dataflow.rb:141:19:141:37 | [true] ( ... ) | local_dataflow.rb:141:8:141:37 | [true] ... \|\| ... | position 0 | -| local_dataflow.rb:141:20:141:25 | call to use | local_dataflow.rb:141:20:141:36 | [false] ... && ... | self | -| local_dataflow.rb:141:20:141:25 | call to use | local_dataflow.rb:141:20:141:36 | [true] ... && ... | self | +| local_dataflow.rb:141:19:141:37 | ( ... ) | local_dataflow.rb:141:8:141:37 | ... \|\| ... | position 0 | +| local_dataflow.rb:141:20:141:25 | call to use | local_dataflow.rb:141:20:141:36 | ... && ... | self | | local_dataflow.rb:141:20:141:25 | self | local_dataflow.rb:141:20:141:25 | call to use | self | | local_dataflow.rb:141:20:141:25 | synthetic splat argument | local_dataflow.rb:141:20:141:25 | call to use | synthetic * | -| local_dataflow.rb:141:20:141:36 | synthetic splat argument | local_dataflow.rb:141:20:141:36 | [false] ... && ... | synthetic * | -| local_dataflow.rb:141:20:141:36 | synthetic splat argument | local_dataflow.rb:141:20:141:36 | [true] ... && ... | synthetic * | +| local_dataflow.rb:141:20:141:36 | synthetic splat argument | local_dataflow.rb:141:20:141:36 | ... && ... | synthetic * | | local_dataflow.rb:141:24:141:24 | x | local_dataflow.rb:141:20:141:25 | call to use | position 0 | -| local_dataflow.rb:141:30:141:36 | [false] ! ... | local_dataflow.rb:141:20:141:36 | [false] ... && ... | position 0 | -| local_dataflow.rb:141:30:141:36 | [true] ! ... | local_dataflow.rb:141:20:141:36 | [true] ... && ... | position 0 | -| local_dataflow.rb:141:31:141:36 | call to use | local_dataflow.rb:141:30:141:36 | [false] ! ... | self | -| local_dataflow.rb:141:31:141:36 | call to use | local_dataflow.rb:141:30:141:36 | [true] ! ... | self | +| local_dataflow.rb:141:30:141:36 | ! ... | local_dataflow.rb:141:20:141:36 | ... && ... | position 0 | +| local_dataflow.rb:141:31:141:36 | call to use | local_dataflow.rb:141:30:141:36 | ! ... | self | | local_dataflow.rb:141:31:141:36 | self | local_dataflow.rb:141:31:141:36 | call to use | self | | local_dataflow.rb:141:31:141:36 | synthetic splat argument | local_dataflow.rb:141:31:141:36 | call to use | synthetic * | | local_dataflow.rb:141:35:141:35 | x | local_dataflow.rb:141:31:141:36 | call to use | position 0 | -| local_dataflow.rb:143:11:143:16 | call to use | local_dataflow.rb:143:11:143:26 | [false] ... \|\| ... | self | -| local_dataflow.rb:143:11:143:16 | call to use | local_dataflow.rb:143:11:143:26 | [true] ... \|\| ... | self | +| local_dataflow.rb:143:11:143:16 | call to use | local_dataflow.rb:143:11:143:26 | ... \|\| ... | self | | local_dataflow.rb:143:11:143:16 | self | local_dataflow.rb:143:11:143:16 | call to use | self | | local_dataflow.rb:143:11:143:16 | synthetic splat argument | local_dataflow.rb:143:11:143:16 | call to use | synthetic * | -| local_dataflow.rb:143:11:143:26 | synthetic splat argument | local_dataflow.rb:143:11:143:26 | [false] ... \|\| ... | synthetic * | -| local_dataflow.rb:143:11:143:26 | synthetic splat argument | local_dataflow.rb:143:11:143:26 | [true] ... \|\| ... | synthetic * | +| local_dataflow.rb:143:11:143:26 | synthetic splat argument | local_dataflow.rb:143:11:143:26 | ... \|\| ... | synthetic * | | local_dataflow.rb:143:15:143:15 | x | local_dataflow.rb:143:11:143:16 | call to use | position 0 | -| local_dataflow.rb:143:21:143:26 | call to use | local_dataflow.rb:143:11:143:26 | [false] ... \|\| ... | position 0 | -| local_dataflow.rb:143:21:143:26 | call to use | local_dataflow.rb:143:11:143:26 | [true] ... \|\| ... | position 0 | +| local_dataflow.rb:143:21:143:26 | call to use | local_dataflow.rb:143:11:143:26 | ... \|\| ... | position 0 | | local_dataflow.rb:143:21:143:26 | self | local_dataflow.rb:143:21:143:26 | call to use | self | | local_dataflow.rb:143:21:143:26 | synthetic splat argument | local_dataflow.rb:143:21:143:26 | call to use | synthetic * | | local_dataflow.rb:143:25:143:25 | x | local_dataflow.rb:143:21:143:26 | call to use | position 0 | diff --git a/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected b/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected index 353edd203f95..a66dbb71ff7b 100644 --- a/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected +++ b/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected @@ -208,8 +208,7 @@ | UseUseExplosion.rb:20:13:20:17 | [post] self | UseUseExplosion.rb:20:3691:20:3696 | self | | UseUseExplosion.rb:20:13:20:17 | self | UseUseExplosion.rb:20:35:20:39 | self | | UseUseExplosion.rb:20:13:20:17 | self | UseUseExplosion.rb:20:3691:20:3696 | self | -| UseUseExplosion.rb:20:13:20:23 | ... > ... | UseUseExplosion.rb:20:12:20:24 | [false] ( ... ) | -| UseUseExplosion.rb:20:13:20:23 | ... > ... | UseUseExplosion.rb:20:12:20:24 | [true] ( ... ) | +| UseUseExplosion.rb:20:13:20:23 | ... > ... | UseUseExplosion.rb:20:12:20:24 | ( ... ) | | UseUseExplosion.rb:20:21:20:23 | 100 | UseUseExplosion.rb:20:13:20:23 | ... > ... | | UseUseExplosion.rb:20:26:20:3684 | then ... | UseUseExplosion.rb:20:9:20:3700 | if ... | | UseUseExplosion.rb:20:31:20:3684 | if ... | UseUseExplosion.rb:20:26:20:3684 | then ... | @@ -218,8 +217,7 @@ | UseUseExplosion.rb:20:35:20:39 | [post] self | UseUseExplosion.rb:20:3675:20:3680 | self | | UseUseExplosion.rb:20:35:20:39 | self | UseUseExplosion.rb:20:56:20:60 | self | | UseUseExplosion.rb:20:35:20:39 | self | UseUseExplosion.rb:20:3675:20:3680 | self | -| UseUseExplosion.rb:20:35:20:44 | ... > ... | UseUseExplosion.rb:20:34:20:45 | [false] ( ... ) | -| UseUseExplosion.rb:20:35:20:44 | ... > ... | UseUseExplosion.rb:20:34:20:45 | [true] ( ... ) | +| UseUseExplosion.rb:20:35:20:44 | ... > ... | UseUseExplosion.rb:20:34:20:45 | ( ... ) | | UseUseExplosion.rb:20:43:20:44 | 99 | UseUseExplosion.rb:20:35:20:44 | ... > ... | | UseUseExplosion.rb:20:47:20:3668 | then ... | UseUseExplosion.rb:20:31:20:3684 | if ... | | UseUseExplosion.rb:20:52:20:3668 | if ... | UseUseExplosion.rb:20:47:20:3668 | then ... | @@ -228,8 +226,7 @@ | UseUseExplosion.rb:20:56:20:60 | [post] self | UseUseExplosion.rb:20:3659:20:3664 | self | | UseUseExplosion.rb:20:56:20:60 | self | UseUseExplosion.rb:20:77:20:81 | self | | UseUseExplosion.rb:20:56:20:60 | self | UseUseExplosion.rb:20:3659:20:3664 | self | -| UseUseExplosion.rb:20:56:20:65 | ... > ... | UseUseExplosion.rb:20:55:20:66 | [false] ( ... ) | -| UseUseExplosion.rb:20:56:20:65 | ... > ... | UseUseExplosion.rb:20:55:20:66 | [true] ( ... ) | +| UseUseExplosion.rb:20:56:20:65 | ... > ... | UseUseExplosion.rb:20:55:20:66 | ( ... ) | | UseUseExplosion.rb:20:64:20:65 | 98 | UseUseExplosion.rb:20:56:20:65 | ... > ... | | UseUseExplosion.rb:20:68:20:3652 | then ... | UseUseExplosion.rb:20:52:20:3668 | if ... | | UseUseExplosion.rb:20:73:20:3652 | if ... | UseUseExplosion.rb:20:68:20:3652 | then ... | @@ -238,8 +235,7 @@ | UseUseExplosion.rb:20:77:20:81 | [post] self | UseUseExplosion.rb:20:3643:20:3648 | self | | UseUseExplosion.rb:20:77:20:81 | self | UseUseExplosion.rb:20:98:20:102 | self | | UseUseExplosion.rb:20:77:20:81 | self | UseUseExplosion.rb:20:3643:20:3648 | self | -| UseUseExplosion.rb:20:77:20:86 | ... > ... | UseUseExplosion.rb:20:76:20:87 | [false] ( ... ) | -| UseUseExplosion.rb:20:77:20:86 | ... > ... | UseUseExplosion.rb:20:76:20:87 | [true] ( ... ) | +| UseUseExplosion.rb:20:77:20:86 | ... > ... | UseUseExplosion.rb:20:76:20:87 | ( ... ) | | UseUseExplosion.rb:20:85:20:86 | 97 | UseUseExplosion.rb:20:77:20:86 | ... > ... | | UseUseExplosion.rb:20:89:20:3636 | then ... | UseUseExplosion.rb:20:73:20:3652 | if ... | | UseUseExplosion.rb:20:94:20:3636 | if ... | UseUseExplosion.rb:20:89:20:3636 | then ... | @@ -248,8 +244,7 @@ | UseUseExplosion.rb:20:98:20:102 | [post] self | UseUseExplosion.rb:20:3627:20:3632 | self | | UseUseExplosion.rb:20:98:20:102 | self | UseUseExplosion.rb:20:119:20:123 | self | | UseUseExplosion.rb:20:98:20:102 | self | UseUseExplosion.rb:20:3627:20:3632 | self | -| UseUseExplosion.rb:20:98:20:107 | ... > ... | UseUseExplosion.rb:20:97:20:108 | [false] ( ... ) | -| UseUseExplosion.rb:20:98:20:107 | ... > ... | UseUseExplosion.rb:20:97:20:108 | [true] ( ... ) | +| UseUseExplosion.rb:20:98:20:107 | ... > ... | UseUseExplosion.rb:20:97:20:108 | ( ... ) | | UseUseExplosion.rb:20:106:20:107 | 96 | UseUseExplosion.rb:20:98:20:107 | ... > ... | | UseUseExplosion.rb:20:110:20:3620 | then ... | UseUseExplosion.rb:20:94:20:3636 | if ... | | UseUseExplosion.rb:20:115:20:3620 | if ... | UseUseExplosion.rb:20:110:20:3620 | then ... | @@ -258,8 +253,7 @@ | UseUseExplosion.rb:20:119:20:123 | [post] self | UseUseExplosion.rb:20:3611:20:3616 | self | | UseUseExplosion.rb:20:119:20:123 | self | UseUseExplosion.rb:20:140:20:144 | self | | UseUseExplosion.rb:20:119:20:123 | self | UseUseExplosion.rb:20:3611:20:3616 | self | -| UseUseExplosion.rb:20:119:20:128 | ... > ... | UseUseExplosion.rb:20:118:20:129 | [false] ( ... ) | -| UseUseExplosion.rb:20:119:20:128 | ... > ... | UseUseExplosion.rb:20:118:20:129 | [true] ( ... ) | +| UseUseExplosion.rb:20:119:20:128 | ... > ... | UseUseExplosion.rb:20:118:20:129 | ( ... ) | | UseUseExplosion.rb:20:127:20:128 | 95 | UseUseExplosion.rb:20:119:20:128 | ... > ... | | UseUseExplosion.rb:20:131:20:3604 | then ... | UseUseExplosion.rb:20:115:20:3620 | if ... | | UseUseExplosion.rb:20:136:20:3604 | if ... | UseUseExplosion.rb:20:131:20:3604 | then ... | @@ -268,8 +262,7 @@ | UseUseExplosion.rb:20:140:20:144 | [post] self | UseUseExplosion.rb:20:3595:20:3600 | self | | UseUseExplosion.rb:20:140:20:144 | self | UseUseExplosion.rb:20:161:20:165 | self | | UseUseExplosion.rb:20:140:20:144 | self | UseUseExplosion.rb:20:3595:20:3600 | self | -| UseUseExplosion.rb:20:140:20:149 | ... > ... | UseUseExplosion.rb:20:139:20:150 | [false] ( ... ) | -| UseUseExplosion.rb:20:140:20:149 | ... > ... | UseUseExplosion.rb:20:139:20:150 | [true] ( ... ) | +| UseUseExplosion.rb:20:140:20:149 | ... > ... | UseUseExplosion.rb:20:139:20:150 | ( ... ) | | UseUseExplosion.rb:20:148:20:149 | 94 | UseUseExplosion.rb:20:140:20:149 | ... > ... | | UseUseExplosion.rb:20:152:20:3588 | then ... | UseUseExplosion.rb:20:136:20:3604 | if ... | | UseUseExplosion.rb:20:157:20:3588 | if ... | UseUseExplosion.rb:20:152:20:3588 | then ... | @@ -278,8 +271,7 @@ | UseUseExplosion.rb:20:161:20:165 | [post] self | UseUseExplosion.rb:20:3579:20:3584 | self | | UseUseExplosion.rb:20:161:20:165 | self | UseUseExplosion.rb:20:182:20:186 | self | | UseUseExplosion.rb:20:161:20:165 | self | UseUseExplosion.rb:20:3579:20:3584 | self | -| UseUseExplosion.rb:20:161:20:170 | ... > ... | UseUseExplosion.rb:20:160:20:171 | [false] ( ... ) | -| UseUseExplosion.rb:20:161:20:170 | ... > ... | UseUseExplosion.rb:20:160:20:171 | [true] ( ... ) | +| UseUseExplosion.rb:20:161:20:170 | ... > ... | UseUseExplosion.rb:20:160:20:171 | ( ... ) | | UseUseExplosion.rb:20:169:20:170 | 93 | UseUseExplosion.rb:20:161:20:170 | ... > ... | | UseUseExplosion.rb:20:173:20:3572 | then ... | UseUseExplosion.rb:20:157:20:3588 | if ... | | UseUseExplosion.rb:20:178:20:3572 | if ... | UseUseExplosion.rb:20:173:20:3572 | then ... | @@ -288,8 +280,7 @@ | UseUseExplosion.rb:20:182:20:186 | [post] self | UseUseExplosion.rb:20:3563:20:3568 | self | | UseUseExplosion.rb:20:182:20:186 | self | UseUseExplosion.rb:20:203:20:207 | self | | UseUseExplosion.rb:20:182:20:186 | self | UseUseExplosion.rb:20:3563:20:3568 | self | -| UseUseExplosion.rb:20:182:20:191 | ... > ... | UseUseExplosion.rb:20:181:20:192 | [false] ( ... ) | -| UseUseExplosion.rb:20:182:20:191 | ... > ... | UseUseExplosion.rb:20:181:20:192 | [true] ( ... ) | +| UseUseExplosion.rb:20:182:20:191 | ... > ... | UseUseExplosion.rb:20:181:20:192 | ( ... ) | | UseUseExplosion.rb:20:190:20:191 | 92 | UseUseExplosion.rb:20:182:20:191 | ... > ... | | UseUseExplosion.rb:20:194:20:3556 | then ... | UseUseExplosion.rb:20:178:20:3572 | if ... | | UseUseExplosion.rb:20:199:20:3556 | if ... | UseUseExplosion.rb:20:194:20:3556 | then ... | @@ -298,8 +289,7 @@ | UseUseExplosion.rb:20:203:20:207 | [post] self | UseUseExplosion.rb:20:3547:20:3552 | self | | UseUseExplosion.rb:20:203:20:207 | self | UseUseExplosion.rb:20:224:20:228 | self | | UseUseExplosion.rb:20:203:20:207 | self | UseUseExplosion.rb:20:3547:20:3552 | self | -| UseUseExplosion.rb:20:203:20:212 | ... > ... | UseUseExplosion.rb:20:202:20:213 | [false] ( ... ) | -| UseUseExplosion.rb:20:203:20:212 | ... > ... | UseUseExplosion.rb:20:202:20:213 | [true] ( ... ) | +| UseUseExplosion.rb:20:203:20:212 | ... > ... | UseUseExplosion.rb:20:202:20:213 | ( ... ) | | UseUseExplosion.rb:20:211:20:212 | 91 | UseUseExplosion.rb:20:203:20:212 | ... > ... | | UseUseExplosion.rb:20:215:20:3540 | then ... | UseUseExplosion.rb:20:199:20:3556 | if ... | | UseUseExplosion.rb:20:220:20:3540 | if ... | UseUseExplosion.rb:20:215:20:3540 | then ... | @@ -308,8 +298,7 @@ | UseUseExplosion.rb:20:224:20:228 | [post] self | UseUseExplosion.rb:20:3531:20:3536 | self | | UseUseExplosion.rb:20:224:20:228 | self | UseUseExplosion.rb:20:245:20:249 | self | | UseUseExplosion.rb:20:224:20:228 | self | UseUseExplosion.rb:20:3531:20:3536 | self | -| UseUseExplosion.rb:20:224:20:233 | ... > ... | UseUseExplosion.rb:20:223:20:234 | [false] ( ... ) | -| UseUseExplosion.rb:20:224:20:233 | ... > ... | UseUseExplosion.rb:20:223:20:234 | [true] ( ... ) | +| UseUseExplosion.rb:20:224:20:233 | ... > ... | UseUseExplosion.rb:20:223:20:234 | ( ... ) | | UseUseExplosion.rb:20:232:20:233 | 90 | UseUseExplosion.rb:20:224:20:233 | ... > ... | | UseUseExplosion.rb:20:236:20:3524 | then ... | UseUseExplosion.rb:20:220:20:3540 | if ... | | UseUseExplosion.rb:20:241:20:3524 | if ... | UseUseExplosion.rb:20:236:20:3524 | then ... | @@ -318,8 +307,7 @@ | UseUseExplosion.rb:20:245:20:249 | [post] self | UseUseExplosion.rb:20:3515:20:3520 | self | | UseUseExplosion.rb:20:245:20:249 | self | UseUseExplosion.rb:20:266:20:270 | self | | UseUseExplosion.rb:20:245:20:249 | self | UseUseExplosion.rb:20:3515:20:3520 | self | -| UseUseExplosion.rb:20:245:20:254 | ... > ... | UseUseExplosion.rb:20:244:20:255 | [false] ( ... ) | -| UseUseExplosion.rb:20:245:20:254 | ... > ... | UseUseExplosion.rb:20:244:20:255 | [true] ( ... ) | +| UseUseExplosion.rb:20:245:20:254 | ... > ... | UseUseExplosion.rb:20:244:20:255 | ( ... ) | | UseUseExplosion.rb:20:253:20:254 | 89 | UseUseExplosion.rb:20:245:20:254 | ... > ... | | UseUseExplosion.rb:20:257:20:3508 | then ... | UseUseExplosion.rb:20:241:20:3524 | if ... | | UseUseExplosion.rb:20:262:20:3508 | if ... | UseUseExplosion.rb:20:257:20:3508 | then ... | @@ -328,8 +316,7 @@ | UseUseExplosion.rb:20:266:20:270 | [post] self | UseUseExplosion.rb:20:3499:20:3504 | self | | UseUseExplosion.rb:20:266:20:270 | self | UseUseExplosion.rb:20:287:20:291 | self | | UseUseExplosion.rb:20:266:20:270 | self | UseUseExplosion.rb:20:3499:20:3504 | self | -| UseUseExplosion.rb:20:266:20:275 | ... > ... | UseUseExplosion.rb:20:265:20:276 | [false] ( ... ) | -| UseUseExplosion.rb:20:266:20:275 | ... > ... | UseUseExplosion.rb:20:265:20:276 | [true] ( ... ) | +| UseUseExplosion.rb:20:266:20:275 | ... > ... | UseUseExplosion.rb:20:265:20:276 | ( ... ) | | UseUseExplosion.rb:20:274:20:275 | 88 | UseUseExplosion.rb:20:266:20:275 | ... > ... | | UseUseExplosion.rb:20:278:20:3492 | then ... | UseUseExplosion.rb:20:262:20:3508 | if ... | | UseUseExplosion.rb:20:283:20:3492 | if ... | UseUseExplosion.rb:20:278:20:3492 | then ... | @@ -338,8 +325,7 @@ | UseUseExplosion.rb:20:287:20:291 | [post] self | UseUseExplosion.rb:20:3483:20:3488 | self | | UseUseExplosion.rb:20:287:20:291 | self | UseUseExplosion.rb:20:308:20:312 | self | | UseUseExplosion.rb:20:287:20:291 | self | UseUseExplosion.rb:20:3483:20:3488 | self | -| UseUseExplosion.rb:20:287:20:296 | ... > ... | UseUseExplosion.rb:20:286:20:297 | [false] ( ... ) | -| UseUseExplosion.rb:20:287:20:296 | ... > ... | UseUseExplosion.rb:20:286:20:297 | [true] ( ... ) | +| UseUseExplosion.rb:20:287:20:296 | ... > ... | UseUseExplosion.rb:20:286:20:297 | ( ... ) | | UseUseExplosion.rb:20:295:20:296 | 87 | UseUseExplosion.rb:20:287:20:296 | ... > ... | | UseUseExplosion.rb:20:299:20:3476 | then ... | UseUseExplosion.rb:20:283:20:3492 | if ... | | UseUseExplosion.rb:20:304:20:3476 | if ... | UseUseExplosion.rb:20:299:20:3476 | then ... | @@ -348,8 +334,7 @@ | UseUseExplosion.rb:20:308:20:312 | [post] self | UseUseExplosion.rb:20:3467:20:3472 | self | | UseUseExplosion.rb:20:308:20:312 | self | UseUseExplosion.rb:20:329:20:333 | self | | UseUseExplosion.rb:20:308:20:312 | self | UseUseExplosion.rb:20:3467:20:3472 | self | -| UseUseExplosion.rb:20:308:20:317 | ... > ... | UseUseExplosion.rb:20:307:20:318 | [false] ( ... ) | -| UseUseExplosion.rb:20:308:20:317 | ... > ... | UseUseExplosion.rb:20:307:20:318 | [true] ( ... ) | +| UseUseExplosion.rb:20:308:20:317 | ... > ... | UseUseExplosion.rb:20:307:20:318 | ( ... ) | | UseUseExplosion.rb:20:316:20:317 | 86 | UseUseExplosion.rb:20:308:20:317 | ... > ... | | UseUseExplosion.rb:20:320:20:3460 | then ... | UseUseExplosion.rb:20:304:20:3476 | if ... | | UseUseExplosion.rb:20:325:20:3460 | if ... | UseUseExplosion.rb:20:320:20:3460 | then ... | @@ -358,8 +343,7 @@ | UseUseExplosion.rb:20:329:20:333 | [post] self | UseUseExplosion.rb:20:3451:20:3456 | self | | UseUseExplosion.rb:20:329:20:333 | self | UseUseExplosion.rb:20:350:20:354 | self | | UseUseExplosion.rb:20:329:20:333 | self | UseUseExplosion.rb:20:3451:20:3456 | self | -| UseUseExplosion.rb:20:329:20:338 | ... > ... | UseUseExplosion.rb:20:328:20:339 | [false] ( ... ) | -| UseUseExplosion.rb:20:329:20:338 | ... > ... | UseUseExplosion.rb:20:328:20:339 | [true] ( ... ) | +| UseUseExplosion.rb:20:329:20:338 | ... > ... | UseUseExplosion.rb:20:328:20:339 | ( ... ) | | UseUseExplosion.rb:20:337:20:338 | 85 | UseUseExplosion.rb:20:329:20:338 | ... > ... | | UseUseExplosion.rb:20:341:20:3444 | then ... | UseUseExplosion.rb:20:325:20:3460 | if ... | | UseUseExplosion.rb:20:346:20:3444 | if ... | UseUseExplosion.rb:20:341:20:3444 | then ... | @@ -368,8 +352,7 @@ | UseUseExplosion.rb:20:350:20:354 | [post] self | UseUseExplosion.rb:20:3435:20:3440 | self | | UseUseExplosion.rb:20:350:20:354 | self | UseUseExplosion.rb:20:371:20:375 | self | | UseUseExplosion.rb:20:350:20:354 | self | UseUseExplosion.rb:20:3435:20:3440 | self | -| UseUseExplosion.rb:20:350:20:359 | ... > ... | UseUseExplosion.rb:20:349:20:360 | [false] ( ... ) | -| UseUseExplosion.rb:20:350:20:359 | ... > ... | UseUseExplosion.rb:20:349:20:360 | [true] ( ... ) | +| UseUseExplosion.rb:20:350:20:359 | ... > ... | UseUseExplosion.rb:20:349:20:360 | ( ... ) | | UseUseExplosion.rb:20:358:20:359 | 84 | UseUseExplosion.rb:20:350:20:359 | ... > ... | | UseUseExplosion.rb:20:362:20:3428 | then ... | UseUseExplosion.rb:20:346:20:3444 | if ... | | UseUseExplosion.rb:20:367:20:3428 | if ... | UseUseExplosion.rb:20:362:20:3428 | then ... | @@ -378,8 +361,7 @@ | UseUseExplosion.rb:20:371:20:375 | [post] self | UseUseExplosion.rb:20:3419:20:3424 | self | | UseUseExplosion.rb:20:371:20:375 | self | UseUseExplosion.rb:20:392:20:396 | self | | UseUseExplosion.rb:20:371:20:375 | self | UseUseExplosion.rb:20:3419:20:3424 | self | -| UseUseExplosion.rb:20:371:20:380 | ... > ... | UseUseExplosion.rb:20:370:20:381 | [false] ( ... ) | -| UseUseExplosion.rb:20:371:20:380 | ... > ... | UseUseExplosion.rb:20:370:20:381 | [true] ( ... ) | +| UseUseExplosion.rb:20:371:20:380 | ... > ... | UseUseExplosion.rb:20:370:20:381 | ( ... ) | | UseUseExplosion.rb:20:379:20:380 | 83 | UseUseExplosion.rb:20:371:20:380 | ... > ... | | UseUseExplosion.rb:20:383:20:3412 | then ... | UseUseExplosion.rb:20:367:20:3428 | if ... | | UseUseExplosion.rb:20:388:20:3412 | if ... | UseUseExplosion.rb:20:383:20:3412 | then ... | @@ -388,8 +370,7 @@ | UseUseExplosion.rb:20:392:20:396 | [post] self | UseUseExplosion.rb:20:3403:20:3408 | self | | UseUseExplosion.rb:20:392:20:396 | self | UseUseExplosion.rb:20:413:20:417 | self | | UseUseExplosion.rb:20:392:20:396 | self | UseUseExplosion.rb:20:3403:20:3408 | self | -| UseUseExplosion.rb:20:392:20:401 | ... > ... | UseUseExplosion.rb:20:391:20:402 | [false] ( ... ) | -| UseUseExplosion.rb:20:392:20:401 | ... > ... | UseUseExplosion.rb:20:391:20:402 | [true] ( ... ) | +| UseUseExplosion.rb:20:392:20:401 | ... > ... | UseUseExplosion.rb:20:391:20:402 | ( ... ) | | UseUseExplosion.rb:20:400:20:401 | 82 | UseUseExplosion.rb:20:392:20:401 | ... > ... | | UseUseExplosion.rb:20:404:20:3396 | then ... | UseUseExplosion.rb:20:388:20:3412 | if ... | | UseUseExplosion.rb:20:409:20:3396 | if ... | UseUseExplosion.rb:20:404:20:3396 | then ... | @@ -398,8 +379,7 @@ | UseUseExplosion.rb:20:413:20:417 | [post] self | UseUseExplosion.rb:20:3387:20:3392 | self | | UseUseExplosion.rb:20:413:20:417 | self | UseUseExplosion.rb:20:434:20:438 | self | | UseUseExplosion.rb:20:413:20:417 | self | UseUseExplosion.rb:20:3387:20:3392 | self | -| UseUseExplosion.rb:20:413:20:422 | ... > ... | UseUseExplosion.rb:20:412:20:423 | [false] ( ... ) | -| UseUseExplosion.rb:20:413:20:422 | ... > ... | UseUseExplosion.rb:20:412:20:423 | [true] ( ... ) | +| UseUseExplosion.rb:20:413:20:422 | ... > ... | UseUseExplosion.rb:20:412:20:423 | ( ... ) | | UseUseExplosion.rb:20:421:20:422 | 81 | UseUseExplosion.rb:20:413:20:422 | ... > ... | | UseUseExplosion.rb:20:425:20:3380 | then ... | UseUseExplosion.rb:20:409:20:3396 | if ... | | UseUseExplosion.rb:20:430:20:3380 | if ... | UseUseExplosion.rb:20:425:20:3380 | then ... | @@ -408,8 +388,7 @@ | UseUseExplosion.rb:20:434:20:438 | [post] self | UseUseExplosion.rb:20:3371:20:3376 | self | | UseUseExplosion.rb:20:434:20:438 | self | UseUseExplosion.rb:20:455:20:459 | self | | UseUseExplosion.rb:20:434:20:438 | self | UseUseExplosion.rb:20:3371:20:3376 | self | -| UseUseExplosion.rb:20:434:20:443 | ... > ... | UseUseExplosion.rb:20:433:20:444 | [false] ( ... ) | -| UseUseExplosion.rb:20:434:20:443 | ... > ... | UseUseExplosion.rb:20:433:20:444 | [true] ( ... ) | +| UseUseExplosion.rb:20:434:20:443 | ... > ... | UseUseExplosion.rb:20:433:20:444 | ( ... ) | | UseUseExplosion.rb:20:442:20:443 | 80 | UseUseExplosion.rb:20:434:20:443 | ... > ... | | UseUseExplosion.rb:20:446:20:3364 | then ... | UseUseExplosion.rb:20:430:20:3380 | if ... | | UseUseExplosion.rb:20:451:20:3364 | if ... | UseUseExplosion.rb:20:446:20:3364 | then ... | @@ -418,8 +397,7 @@ | UseUseExplosion.rb:20:455:20:459 | [post] self | UseUseExplosion.rb:20:3355:20:3360 | self | | UseUseExplosion.rb:20:455:20:459 | self | UseUseExplosion.rb:20:476:20:480 | self | | UseUseExplosion.rb:20:455:20:459 | self | UseUseExplosion.rb:20:3355:20:3360 | self | -| UseUseExplosion.rb:20:455:20:464 | ... > ... | UseUseExplosion.rb:20:454:20:465 | [false] ( ... ) | -| UseUseExplosion.rb:20:455:20:464 | ... > ... | UseUseExplosion.rb:20:454:20:465 | [true] ( ... ) | +| UseUseExplosion.rb:20:455:20:464 | ... > ... | UseUseExplosion.rb:20:454:20:465 | ( ... ) | | UseUseExplosion.rb:20:463:20:464 | 79 | UseUseExplosion.rb:20:455:20:464 | ... > ... | | UseUseExplosion.rb:20:467:20:3348 | then ... | UseUseExplosion.rb:20:451:20:3364 | if ... | | UseUseExplosion.rb:20:472:20:3348 | if ... | UseUseExplosion.rb:20:467:20:3348 | then ... | @@ -428,8 +406,7 @@ | UseUseExplosion.rb:20:476:20:480 | [post] self | UseUseExplosion.rb:20:3339:20:3344 | self | | UseUseExplosion.rb:20:476:20:480 | self | UseUseExplosion.rb:20:497:20:501 | self | | UseUseExplosion.rb:20:476:20:480 | self | UseUseExplosion.rb:20:3339:20:3344 | self | -| UseUseExplosion.rb:20:476:20:485 | ... > ... | UseUseExplosion.rb:20:475:20:486 | [false] ( ... ) | -| UseUseExplosion.rb:20:476:20:485 | ... > ... | UseUseExplosion.rb:20:475:20:486 | [true] ( ... ) | +| UseUseExplosion.rb:20:476:20:485 | ... > ... | UseUseExplosion.rb:20:475:20:486 | ( ... ) | | UseUseExplosion.rb:20:484:20:485 | 78 | UseUseExplosion.rb:20:476:20:485 | ... > ... | | UseUseExplosion.rb:20:488:20:3332 | then ... | UseUseExplosion.rb:20:472:20:3348 | if ... | | UseUseExplosion.rb:20:493:20:3332 | if ... | UseUseExplosion.rb:20:488:20:3332 | then ... | @@ -438,8 +415,7 @@ | UseUseExplosion.rb:20:497:20:501 | [post] self | UseUseExplosion.rb:20:3323:20:3328 | self | | UseUseExplosion.rb:20:497:20:501 | self | UseUseExplosion.rb:20:518:20:522 | self | | UseUseExplosion.rb:20:497:20:501 | self | UseUseExplosion.rb:20:3323:20:3328 | self | -| UseUseExplosion.rb:20:497:20:506 | ... > ... | UseUseExplosion.rb:20:496:20:507 | [false] ( ... ) | -| UseUseExplosion.rb:20:497:20:506 | ... > ... | UseUseExplosion.rb:20:496:20:507 | [true] ( ... ) | +| UseUseExplosion.rb:20:497:20:506 | ... > ... | UseUseExplosion.rb:20:496:20:507 | ( ... ) | | UseUseExplosion.rb:20:505:20:506 | 77 | UseUseExplosion.rb:20:497:20:506 | ... > ... | | UseUseExplosion.rb:20:509:20:3316 | then ... | UseUseExplosion.rb:20:493:20:3332 | if ... | | UseUseExplosion.rb:20:514:20:3316 | if ... | UseUseExplosion.rb:20:509:20:3316 | then ... | @@ -448,8 +424,7 @@ | UseUseExplosion.rb:20:518:20:522 | [post] self | UseUseExplosion.rb:20:3307:20:3312 | self | | UseUseExplosion.rb:20:518:20:522 | self | UseUseExplosion.rb:20:539:20:543 | self | | UseUseExplosion.rb:20:518:20:522 | self | UseUseExplosion.rb:20:3307:20:3312 | self | -| UseUseExplosion.rb:20:518:20:527 | ... > ... | UseUseExplosion.rb:20:517:20:528 | [false] ( ... ) | -| UseUseExplosion.rb:20:518:20:527 | ... > ... | UseUseExplosion.rb:20:517:20:528 | [true] ( ... ) | +| UseUseExplosion.rb:20:518:20:527 | ... > ... | UseUseExplosion.rb:20:517:20:528 | ( ... ) | | UseUseExplosion.rb:20:526:20:527 | 76 | UseUseExplosion.rb:20:518:20:527 | ... > ... | | UseUseExplosion.rb:20:530:20:3300 | then ... | UseUseExplosion.rb:20:514:20:3316 | if ... | | UseUseExplosion.rb:20:535:20:3300 | if ... | UseUseExplosion.rb:20:530:20:3300 | then ... | @@ -458,8 +433,7 @@ | UseUseExplosion.rb:20:539:20:543 | [post] self | UseUseExplosion.rb:20:3291:20:3296 | self | | UseUseExplosion.rb:20:539:20:543 | self | UseUseExplosion.rb:20:560:20:564 | self | | UseUseExplosion.rb:20:539:20:543 | self | UseUseExplosion.rb:20:3291:20:3296 | self | -| UseUseExplosion.rb:20:539:20:548 | ... > ... | UseUseExplosion.rb:20:538:20:549 | [false] ( ... ) | -| UseUseExplosion.rb:20:539:20:548 | ... > ... | UseUseExplosion.rb:20:538:20:549 | [true] ( ... ) | +| UseUseExplosion.rb:20:539:20:548 | ... > ... | UseUseExplosion.rb:20:538:20:549 | ( ... ) | | UseUseExplosion.rb:20:547:20:548 | 75 | UseUseExplosion.rb:20:539:20:548 | ... > ... | | UseUseExplosion.rb:20:551:20:3284 | then ... | UseUseExplosion.rb:20:535:20:3300 | if ... | | UseUseExplosion.rb:20:556:20:3284 | if ... | UseUseExplosion.rb:20:551:20:3284 | then ... | @@ -468,8 +442,7 @@ | UseUseExplosion.rb:20:560:20:564 | [post] self | UseUseExplosion.rb:20:3275:20:3280 | self | | UseUseExplosion.rb:20:560:20:564 | self | UseUseExplosion.rb:20:581:20:585 | self | | UseUseExplosion.rb:20:560:20:564 | self | UseUseExplosion.rb:20:3275:20:3280 | self | -| UseUseExplosion.rb:20:560:20:569 | ... > ... | UseUseExplosion.rb:20:559:20:570 | [false] ( ... ) | -| UseUseExplosion.rb:20:560:20:569 | ... > ... | UseUseExplosion.rb:20:559:20:570 | [true] ( ... ) | +| UseUseExplosion.rb:20:560:20:569 | ... > ... | UseUseExplosion.rb:20:559:20:570 | ( ... ) | | UseUseExplosion.rb:20:568:20:569 | 74 | UseUseExplosion.rb:20:560:20:569 | ... > ... | | UseUseExplosion.rb:20:572:20:3268 | then ... | UseUseExplosion.rb:20:556:20:3284 | if ... | | UseUseExplosion.rb:20:577:20:3268 | if ... | UseUseExplosion.rb:20:572:20:3268 | then ... | @@ -478,8 +451,7 @@ | UseUseExplosion.rb:20:581:20:585 | [post] self | UseUseExplosion.rb:20:3259:20:3264 | self | | UseUseExplosion.rb:20:581:20:585 | self | UseUseExplosion.rb:20:602:20:606 | self | | UseUseExplosion.rb:20:581:20:585 | self | UseUseExplosion.rb:20:3259:20:3264 | self | -| UseUseExplosion.rb:20:581:20:590 | ... > ... | UseUseExplosion.rb:20:580:20:591 | [false] ( ... ) | -| UseUseExplosion.rb:20:581:20:590 | ... > ... | UseUseExplosion.rb:20:580:20:591 | [true] ( ... ) | +| UseUseExplosion.rb:20:581:20:590 | ... > ... | UseUseExplosion.rb:20:580:20:591 | ( ... ) | | UseUseExplosion.rb:20:589:20:590 | 73 | UseUseExplosion.rb:20:581:20:590 | ... > ... | | UseUseExplosion.rb:20:593:20:3252 | then ... | UseUseExplosion.rb:20:577:20:3268 | if ... | | UseUseExplosion.rb:20:598:20:3252 | if ... | UseUseExplosion.rb:20:593:20:3252 | then ... | @@ -488,8 +460,7 @@ | UseUseExplosion.rb:20:602:20:606 | [post] self | UseUseExplosion.rb:20:3243:20:3248 | self | | UseUseExplosion.rb:20:602:20:606 | self | UseUseExplosion.rb:20:623:20:627 | self | | UseUseExplosion.rb:20:602:20:606 | self | UseUseExplosion.rb:20:3243:20:3248 | self | -| UseUseExplosion.rb:20:602:20:611 | ... > ... | UseUseExplosion.rb:20:601:20:612 | [false] ( ... ) | -| UseUseExplosion.rb:20:602:20:611 | ... > ... | UseUseExplosion.rb:20:601:20:612 | [true] ( ... ) | +| UseUseExplosion.rb:20:602:20:611 | ... > ... | UseUseExplosion.rb:20:601:20:612 | ( ... ) | | UseUseExplosion.rb:20:610:20:611 | 72 | UseUseExplosion.rb:20:602:20:611 | ... > ... | | UseUseExplosion.rb:20:614:20:3236 | then ... | UseUseExplosion.rb:20:598:20:3252 | if ... | | UseUseExplosion.rb:20:619:20:3236 | if ... | UseUseExplosion.rb:20:614:20:3236 | then ... | @@ -498,8 +469,7 @@ | UseUseExplosion.rb:20:623:20:627 | [post] self | UseUseExplosion.rb:20:3227:20:3232 | self | | UseUseExplosion.rb:20:623:20:627 | self | UseUseExplosion.rb:20:644:20:648 | self | | UseUseExplosion.rb:20:623:20:627 | self | UseUseExplosion.rb:20:3227:20:3232 | self | -| UseUseExplosion.rb:20:623:20:632 | ... > ... | UseUseExplosion.rb:20:622:20:633 | [false] ( ... ) | -| UseUseExplosion.rb:20:623:20:632 | ... > ... | UseUseExplosion.rb:20:622:20:633 | [true] ( ... ) | +| UseUseExplosion.rb:20:623:20:632 | ... > ... | UseUseExplosion.rb:20:622:20:633 | ( ... ) | | UseUseExplosion.rb:20:631:20:632 | 71 | UseUseExplosion.rb:20:623:20:632 | ... > ... | | UseUseExplosion.rb:20:635:20:3220 | then ... | UseUseExplosion.rb:20:619:20:3236 | if ... | | UseUseExplosion.rb:20:640:20:3220 | if ... | UseUseExplosion.rb:20:635:20:3220 | then ... | @@ -508,8 +478,7 @@ | UseUseExplosion.rb:20:644:20:648 | [post] self | UseUseExplosion.rb:20:3211:20:3216 | self | | UseUseExplosion.rb:20:644:20:648 | self | UseUseExplosion.rb:20:665:20:669 | self | | UseUseExplosion.rb:20:644:20:648 | self | UseUseExplosion.rb:20:3211:20:3216 | self | -| UseUseExplosion.rb:20:644:20:653 | ... > ... | UseUseExplosion.rb:20:643:20:654 | [false] ( ... ) | -| UseUseExplosion.rb:20:644:20:653 | ... > ... | UseUseExplosion.rb:20:643:20:654 | [true] ( ... ) | +| UseUseExplosion.rb:20:644:20:653 | ... > ... | UseUseExplosion.rb:20:643:20:654 | ( ... ) | | UseUseExplosion.rb:20:652:20:653 | 70 | UseUseExplosion.rb:20:644:20:653 | ... > ... | | UseUseExplosion.rb:20:656:20:3204 | then ... | UseUseExplosion.rb:20:640:20:3220 | if ... | | UseUseExplosion.rb:20:661:20:3204 | if ... | UseUseExplosion.rb:20:656:20:3204 | then ... | @@ -518,8 +487,7 @@ | UseUseExplosion.rb:20:665:20:669 | [post] self | UseUseExplosion.rb:20:3195:20:3200 | self | | UseUseExplosion.rb:20:665:20:669 | self | UseUseExplosion.rb:20:686:20:690 | self | | UseUseExplosion.rb:20:665:20:669 | self | UseUseExplosion.rb:20:3195:20:3200 | self | -| UseUseExplosion.rb:20:665:20:674 | ... > ... | UseUseExplosion.rb:20:664:20:675 | [false] ( ... ) | -| UseUseExplosion.rb:20:665:20:674 | ... > ... | UseUseExplosion.rb:20:664:20:675 | [true] ( ... ) | +| UseUseExplosion.rb:20:665:20:674 | ... > ... | UseUseExplosion.rb:20:664:20:675 | ( ... ) | | UseUseExplosion.rb:20:673:20:674 | 69 | UseUseExplosion.rb:20:665:20:674 | ... > ... | | UseUseExplosion.rb:20:677:20:3188 | then ... | UseUseExplosion.rb:20:661:20:3204 | if ... | | UseUseExplosion.rb:20:682:20:3188 | if ... | UseUseExplosion.rb:20:677:20:3188 | then ... | @@ -528,8 +496,7 @@ | UseUseExplosion.rb:20:686:20:690 | [post] self | UseUseExplosion.rb:20:3179:20:3184 | self | | UseUseExplosion.rb:20:686:20:690 | self | UseUseExplosion.rb:20:707:20:711 | self | | UseUseExplosion.rb:20:686:20:690 | self | UseUseExplosion.rb:20:3179:20:3184 | self | -| UseUseExplosion.rb:20:686:20:695 | ... > ... | UseUseExplosion.rb:20:685:20:696 | [false] ( ... ) | -| UseUseExplosion.rb:20:686:20:695 | ... > ... | UseUseExplosion.rb:20:685:20:696 | [true] ( ... ) | +| UseUseExplosion.rb:20:686:20:695 | ... > ... | UseUseExplosion.rb:20:685:20:696 | ( ... ) | | UseUseExplosion.rb:20:694:20:695 | 68 | UseUseExplosion.rb:20:686:20:695 | ... > ... | | UseUseExplosion.rb:20:698:20:3172 | then ... | UseUseExplosion.rb:20:682:20:3188 | if ... | | UseUseExplosion.rb:20:703:20:3172 | if ... | UseUseExplosion.rb:20:698:20:3172 | then ... | @@ -538,8 +505,7 @@ | UseUseExplosion.rb:20:707:20:711 | [post] self | UseUseExplosion.rb:20:3163:20:3168 | self | | UseUseExplosion.rb:20:707:20:711 | self | UseUseExplosion.rb:20:728:20:732 | self | | UseUseExplosion.rb:20:707:20:711 | self | UseUseExplosion.rb:20:3163:20:3168 | self | -| UseUseExplosion.rb:20:707:20:716 | ... > ... | UseUseExplosion.rb:20:706:20:717 | [false] ( ... ) | -| UseUseExplosion.rb:20:707:20:716 | ... > ... | UseUseExplosion.rb:20:706:20:717 | [true] ( ... ) | +| UseUseExplosion.rb:20:707:20:716 | ... > ... | UseUseExplosion.rb:20:706:20:717 | ( ... ) | | UseUseExplosion.rb:20:715:20:716 | 67 | UseUseExplosion.rb:20:707:20:716 | ... > ... | | UseUseExplosion.rb:20:719:20:3156 | then ... | UseUseExplosion.rb:20:703:20:3172 | if ... | | UseUseExplosion.rb:20:724:20:3156 | if ... | UseUseExplosion.rb:20:719:20:3156 | then ... | @@ -548,8 +514,7 @@ | UseUseExplosion.rb:20:728:20:732 | [post] self | UseUseExplosion.rb:20:3147:20:3152 | self | | UseUseExplosion.rb:20:728:20:732 | self | UseUseExplosion.rb:20:749:20:753 | self | | UseUseExplosion.rb:20:728:20:732 | self | UseUseExplosion.rb:20:3147:20:3152 | self | -| UseUseExplosion.rb:20:728:20:737 | ... > ... | UseUseExplosion.rb:20:727:20:738 | [false] ( ... ) | -| UseUseExplosion.rb:20:728:20:737 | ... > ... | UseUseExplosion.rb:20:727:20:738 | [true] ( ... ) | +| UseUseExplosion.rb:20:728:20:737 | ... > ... | UseUseExplosion.rb:20:727:20:738 | ( ... ) | | UseUseExplosion.rb:20:736:20:737 | 66 | UseUseExplosion.rb:20:728:20:737 | ... > ... | | UseUseExplosion.rb:20:740:20:3140 | then ... | UseUseExplosion.rb:20:724:20:3156 | if ... | | UseUseExplosion.rb:20:745:20:3140 | if ... | UseUseExplosion.rb:20:740:20:3140 | then ... | @@ -558,8 +523,7 @@ | UseUseExplosion.rb:20:749:20:753 | [post] self | UseUseExplosion.rb:20:3131:20:3136 | self | | UseUseExplosion.rb:20:749:20:753 | self | UseUseExplosion.rb:20:770:20:774 | self | | UseUseExplosion.rb:20:749:20:753 | self | UseUseExplosion.rb:20:3131:20:3136 | self | -| UseUseExplosion.rb:20:749:20:758 | ... > ... | UseUseExplosion.rb:20:748:20:759 | [false] ( ... ) | -| UseUseExplosion.rb:20:749:20:758 | ... > ... | UseUseExplosion.rb:20:748:20:759 | [true] ( ... ) | +| UseUseExplosion.rb:20:749:20:758 | ... > ... | UseUseExplosion.rb:20:748:20:759 | ( ... ) | | UseUseExplosion.rb:20:757:20:758 | 65 | UseUseExplosion.rb:20:749:20:758 | ... > ... | | UseUseExplosion.rb:20:761:20:3124 | then ... | UseUseExplosion.rb:20:745:20:3140 | if ... | | UseUseExplosion.rb:20:766:20:3124 | if ... | UseUseExplosion.rb:20:761:20:3124 | then ... | @@ -568,8 +532,7 @@ | UseUseExplosion.rb:20:770:20:774 | [post] self | UseUseExplosion.rb:20:3115:20:3120 | self | | UseUseExplosion.rb:20:770:20:774 | self | UseUseExplosion.rb:20:791:20:795 | self | | UseUseExplosion.rb:20:770:20:774 | self | UseUseExplosion.rb:20:3115:20:3120 | self | -| UseUseExplosion.rb:20:770:20:779 | ... > ... | UseUseExplosion.rb:20:769:20:780 | [false] ( ... ) | -| UseUseExplosion.rb:20:770:20:779 | ... > ... | UseUseExplosion.rb:20:769:20:780 | [true] ( ... ) | +| UseUseExplosion.rb:20:770:20:779 | ... > ... | UseUseExplosion.rb:20:769:20:780 | ( ... ) | | UseUseExplosion.rb:20:778:20:779 | 64 | UseUseExplosion.rb:20:770:20:779 | ... > ... | | UseUseExplosion.rb:20:782:20:3108 | then ... | UseUseExplosion.rb:20:766:20:3124 | if ... | | UseUseExplosion.rb:20:787:20:3108 | if ... | UseUseExplosion.rb:20:782:20:3108 | then ... | @@ -578,8 +541,7 @@ | UseUseExplosion.rb:20:791:20:795 | [post] self | UseUseExplosion.rb:20:3099:20:3104 | self | | UseUseExplosion.rb:20:791:20:795 | self | UseUseExplosion.rb:20:812:20:816 | self | | UseUseExplosion.rb:20:791:20:795 | self | UseUseExplosion.rb:20:3099:20:3104 | self | -| UseUseExplosion.rb:20:791:20:800 | ... > ... | UseUseExplosion.rb:20:790:20:801 | [false] ( ... ) | -| UseUseExplosion.rb:20:791:20:800 | ... > ... | UseUseExplosion.rb:20:790:20:801 | [true] ( ... ) | +| UseUseExplosion.rb:20:791:20:800 | ... > ... | UseUseExplosion.rb:20:790:20:801 | ( ... ) | | UseUseExplosion.rb:20:799:20:800 | 63 | UseUseExplosion.rb:20:791:20:800 | ... > ... | | UseUseExplosion.rb:20:803:20:3092 | then ... | UseUseExplosion.rb:20:787:20:3108 | if ... | | UseUseExplosion.rb:20:808:20:3092 | if ... | UseUseExplosion.rb:20:803:20:3092 | then ... | @@ -588,8 +550,7 @@ | UseUseExplosion.rb:20:812:20:816 | [post] self | UseUseExplosion.rb:20:3083:20:3088 | self | | UseUseExplosion.rb:20:812:20:816 | self | UseUseExplosion.rb:20:833:20:837 | self | | UseUseExplosion.rb:20:812:20:816 | self | UseUseExplosion.rb:20:3083:20:3088 | self | -| UseUseExplosion.rb:20:812:20:821 | ... > ... | UseUseExplosion.rb:20:811:20:822 | [false] ( ... ) | -| UseUseExplosion.rb:20:812:20:821 | ... > ... | UseUseExplosion.rb:20:811:20:822 | [true] ( ... ) | +| UseUseExplosion.rb:20:812:20:821 | ... > ... | UseUseExplosion.rb:20:811:20:822 | ( ... ) | | UseUseExplosion.rb:20:820:20:821 | 62 | UseUseExplosion.rb:20:812:20:821 | ... > ... | | UseUseExplosion.rb:20:824:20:3076 | then ... | UseUseExplosion.rb:20:808:20:3092 | if ... | | UseUseExplosion.rb:20:829:20:3076 | if ... | UseUseExplosion.rb:20:824:20:3076 | then ... | @@ -598,8 +559,7 @@ | UseUseExplosion.rb:20:833:20:837 | [post] self | UseUseExplosion.rb:20:3067:20:3072 | self | | UseUseExplosion.rb:20:833:20:837 | self | UseUseExplosion.rb:20:854:20:858 | self | | UseUseExplosion.rb:20:833:20:837 | self | UseUseExplosion.rb:20:3067:20:3072 | self | -| UseUseExplosion.rb:20:833:20:842 | ... > ... | UseUseExplosion.rb:20:832:20:843 | [false] ( ... ) | -| UseUseExplosion.rb:20:833:20:842 | ... > ... | UseUseExplosion.rb:20:832:20:843 | [true] ( ... ) | +| UseUseExplosion.rb:20:833:20:842 | ... > ... | UseUseExplosion.rb:20:832:20:843 | ( ... ) | | UseUseExplosion.rb:20:841:20:842 | 61 | UseUseExplosion.rb:20:833:20:842 | ... > ... | | UseUseExplosion.rb:20:845:20:3060 | then ... | UseUseExplosion.rb:20:829:20:3076 | if ... | | UseUseExplosion.rb:20:850:20:3060 | if ... | UseUseExplosion.rb:20:845:20:3060 | then ... | @@ -608,8 +568,7 @@ | UseUseExplosion.rb:20:854:20:858 | [post] self | UseUseExplosion.rb:20:3051:20:3056 | self | | UseUseExplosion.rb:20:854:20:858 | self | UseUseExplosion.rb:20:875:20:879 | self | | UseUseExplosion.rb:20:854:20:858 | self | UseUseExplosion.rb:20:3051:20:3056 | self | -| UseUseExplosion.rb:20:854:20:863 | ... > ... | UseUseExplosion.rb:20:853:20:864 | [false] ( ... ) | -| UseUseExplosion.rb:20:854:20:863 | ... > ... | UseUseExplosion.rb:20:853:20:864 | [true] ( ... ) | +| UseUseExplosion.rb:20:854:20:863 | ... > ... | UseUseExplosion.rb:20:853:20:864 | ( ... ) | | UseUseExplosion.rb:20:862:20:863 | 60 | UseUseExplosion.rb:20:854:20:863 | ... > ... | | UseUseExplosion.rb:20:866:20:3044 | then ... | UseUseExplosion.rb:20:850:20:3060 | if ... | | UseUseExplosion.rb:20:871:20:3044 | if ... | UseUseExplosion.rb:20:866:20:3044 | then ... | @@ -618,8 +577,7 @@ | UseUseExplosion.rb:20:875:20:879 | [post] self | UseUseExplosion.rb:20:3035:20:3040 | self | | UseUseExplosion.rb:20:875:20:879 | self | UseUseExplosion.rb:20:896:20:900 | self | | UseUseExplosion.rb:20:875:20:879 | self | UseUseExplosion.rb:20:3035:20:3040 | self | -| UseUseExplosion.rb:20:875:20:884 | ... > ... | UseUseExplosion.rb:20:874:20:885 | [false] ( ... ) | -| UseUseExplosion.rb:20:875:20:884 | ... > ... | UseUseExplosion.rb:20:874:20:885 | [true] ( ... ) | +| UseUseExplosion.rb:20:875:20:884 | ... > ... | UseUseExplosion.rb:20:874:20:885 | ( ... ) | | UseUseExplosion.rb:20:883:20:884 | 59 | UseUseExplosion.rb:20:875:20:884 | ... > ... | | UseUseExplosion.rb:20:887:20:3028 | then ... | UseUseExplosion.rb:20:871:20:3044 | if ... | | UseUseExplosion.rb:20:892:20:3028 | if ... | UseUseExplosion.rb:20:887:20:3028 | then ... | @@ -628,8 +586,7 @@ | UseUseExplosion.rb:20:896:20:900 | [post] self | UseUseExplosion.rb:20:3019:20:3024 | self | | UseUseExplosion.rb:20:896:20:900 | self | UseUseExplosion.rb:20:917:20:921 | self | | UseUseExplosion.rb:20:896:20:900 | self | UseUseExplosion.rb:20:3019:20:3024 | self | -| UseUseExplosion.rb:20:896:20:905 | ... > ... | UseUseExplosion.rb:20:895:20:906 | [false] ( ... ) | -| UseUseExplosion.rb:20:896:20:905 | ... > ... | UseUseExplosion.rb:20:895:20:906 | [true] ( ... ) | +| UseUseExplosion.rb:20:896:20:905 | ... > ... | UseUseExplosion.rb:20:895:20:906 | ( ... ) | | UseUseExplosion.rb:20:904:20:905 | 58 | UseUseExplosion.rb:20:896:20:905 | ... > ... | | UseUseExplosion.rb:20:908:20:3012 | then ... | UseUseExplosion.rb:20:892:20:3028 | if ... | | UseUseExplosion.rb:20:913:20:3012 | if ... | UseUseExplosion.rb:20:908:20:3012 | then ... | @@ -638,8 +595,7 @@ | UseUseExplosion.rb:20:917:20:921 | [post] self | UseUseExplosion.rb:20:3003:20:3008 | self | | UseUseExplosion.rb:20:917:20:921 | self | UseUseExplosion.rb:20:938:20:942 | self | | UseUseExplosion.rb:20:917:20:921 | self | UseUseExplosion.rb:20:3003:20:3008 | self | -| UseUseExplosion.rb:20:917:20:926 | ... > ... | UseUseExplosion.rb:20:916:20:927 | [false] ( ... ) | -| UseUseExplosion.rb:20:917:20:926 | ... > ... | UseUseExplosion.rb:20:916:20:927 | [true] ( ... ) | +| UseUseExplosion.rb:20:917:20:926 | ... > ... | UseUseExplosion.rb:20:916:20:927 | ( ... ) | | UseUseExplosion.rb:20:925:20:926 | 57 | UseUseExplosion.rb:20:917:20:926 | ... > ... | | UseUseExplosion.rb:20:929:20:2996 | then ... | UseUseExplosion.rb:20:913:20:3012 | if ... | | UseUseExplosion.rb:20:934:20:2996 | if ... | UseUseExplosion.rb:20:929:20:2996 | then ... | @@ -648,8 +604,7 @@ | UseUseExplosion.rb:20:938:20:942 | [post] self | UseUseExplosion.rb:20:2987:20:2992 | self | | UseUseExplosion.rb:20:938:20:942 | self | UseUseExplosion.rb:20:959:20:963 | self | | UseUseExplosion.rb:20:938:20:942 | self | UseUseExplosion.rb:20:2987:20:2992 | self | -| UseUseExplosion.rb:20:938:20:947 | ... > ... | UseUseExplosion.rb:20:937:20:948 | [false] ( ... ) | -| UseUseExplosion.rb:20:938:20:947 | ... > ... | UseUseExplosion.rb:20:937:20:948 | [true] ( ... ) | +| UseUseExplosion.rb:20:938:20:947 | ... > ... | UseUseExplosion.rb:20:937:20:948 | ( ... ) | | UseUseExplosion.rb:20:946:20:947 | 56 | UseUseExplosion.rb:20:938:20:947 | ... > ... | | UseUseExplosion.rb:20:950:20:2980 | then ... | UseUseExplosion.rb:20:934:20:2996 | if ... | | UseUseExplosion.rb:20:955:20:2980 | if ... | UseUseExplosion.rb:20:950:20:2980 | then ... | @@ -658,8 +613,7 @@ | UseUseExplosion.rb:20:959:20:963 | [post] self | UseUseExplosion.rb:20:2971:20:2976 | self | | UseUseExplosion.rb:20:959:20:963 | self | UseUseExplosion.rb:20:980:20:984 | self | | UseUseExplosion.rb:20:959:20:963 | self | UseUseExplosion.rb:20:2971:20:2976 | self | -| UseUseExplosion.rb:20:959:20:968 | ... > ... | UseUseExplosion.rb:20:958:20:969 | [false] ( ... ) | -| UseUseExplosion.rb:20:959:20:968 | ... > ... | UseUseExplosion.rb:20:958:20:969 | [true] ( ... ) | +| UseUseExplosion.rb:20:959:20:968 | ... > ... | UseUseExplosion.rb:20:958:20:969 | ( ... ) | | UseUseExplosion.rb:20:967:20:968 | 55 | UseUseExplosion.rb:20:959:20:968 | ... > ... | | UseUseExplosion.rb:20:971:20:2964 | then ... | UseUseExplosion.rb:20:955:20:2980 | if ... | | UseUseExplosion.rb:20:976:20:2964 | if ... | UseUseExplosion.rb:20:971:20:2964 | then ... | @@ -668,8 +622,7 @@ | UseUseExplosion.rb:20:980:20:984 | [post] self | UseUseExplosion.rb:20:2955:20:2960 | self | | UseUseExplosion.rb:20:980:20:984 | self | UseUseExplosion.rb:20:1001:20:1005 | self | | UseUseExplosion.rb:20:980:20:984 | self | UseUseExplosion.rb:20:2955:20:2960 | self | -| UseUseExplosion.rb:20:980:20:989 | ... > ... | UseUseExplosion.rb:20:979:20:990 | [false] ( ... ) | -| UseUseExplosion.rb:20:980:20:989 | ... > ... | UseUseExplosion.rb:20:979:20:990 | [true] ( ... ) | +| UseUseExplosion.rb:20:980:20:989 | ... > ... | UseUseExplosion.rb:20:979:20:990 | ( ... ) | | UseUseExplosion.rb:20:988:20:989 | 54 | UseUseExplosion.rb:20:980:20:989 | ... > ... | | UseUseExplosion.rb:20:992:20:2948 | then ... | UseUseExplosion.rb:20:976:20:2964 | if ... | | UseUseExplosion.rb:20:997:20:2948 | if ... | UseUseExplosion.rb:20:992:20:2948 | then ... | @@ -678,8 +631,7 @@ | UseUseExplosion.rb:20:1001:20:1005 | [post] self | UseUseExplosion.rb:20:2939:20:2944 | self | | UseUseExplosion.rb:20:1001:20:1005 | self | UseUseExplosion.rb:20:1022:20:1026 | self | | UseUseExplosion.rb:20:1001:20:1005 | self | UseUseExplosion.rb:20:2939:20:2944 | self | -| UseUseExplosion.rb:20:1001:20:1010 | ... > ... | UseUseExplosion.rb:20:1000:20:1011 | [false] ( ... ) | -| UseUseExplosion.rb:20:1001:20:1010 | ... > ... | UseUseExplosion.rb:20:1000:20:1011 | [true] ( ... ) | +| UseUseExplosion.rb:20:1001:20:1010 | ... > ... | UseUseExplosion.rb:20:1000:20:1011 | ( ... ) | | UseUseExplosion.rb:20:1009:20:1010 | 53 | UseUseExplosion.rb:20:1001:20:1010 | ... > ... | | UseUseExplosion.rb:20:1013:20:2932 | then ... | UseUseExplosion.rb:20:997:20:2948 | if ... | | UseUseExplosion.rb:20:1018:20:2932 | if ... | UseUseExplosion.rb:20:1013:20:2932 | then ... | @@ -688,8 +640,7 @@ | UseUseExplosion.rb:20:1022:20:1026 | [post] self | UseUseExplosion.rb:20:2923:20:2928 | self | | UseUseExplosion.rb:20:1022:20:1026 | self | UseUseExplosion.rb:20:1043:20:1047 | self | | UseUseExplosion.rb:20:1022:20:1026 | self | UseUseExplosion.rb:20:2923:20:2928 | self | -| UseUseExplosion.rb:20:1022:20:1031 | ... > ... | UseUseExplosion.rb:20:1021:20:1032 | [false] ( ... ) | -| UseUseExplosion.rb:20:1022:20:1031 | ... > ... | UseUseExplosion.rb:20:1021:20:1032 | [true] ( ... ) | +| UseUseExplosion.rb:20:1022:20:1031 | ... > ... | UseUseExplosion.rb:20:1021:20:1032 | ( ... ) | | UseUseExplosion.rb:20:1030:20:1031 | 52 | UseUseExplosion.rb:20:1022:20:1031 | ... > ... | | UseUseExplosion.rb:20:1034:20:2916 | then ... | UseUseExplosion.rb:20:1018:20:2932 | if ... | | UseUseExplosion.rb:20:1039:20:2916 | if ... | UseUseExplosion.rb:20:1034:20:2916 | then ... | @@ -698,8 +649,7 @@ | UseUseExplosion.rb:20:1043:20:1047 | [post] self | UseUseExplosion.rb:20:2907:20:2912 | self | | UseUseExplosion.rb:20:1043:20:1047 | self | UseUseExplosion.rb:20:1064:20:1068 | self | | UseUseExplosion.rb:20:1043:20:1047 | self | UseUseExplosion.rb:20:2907:20:2912 | self | -| UseUseExplosion.rb:20:1043:20:1052 | ... > ... | UseUseExplosion.rb:20:1042:20:1053 | [false] ( ... ) | -| UseUseExplosion.rb:20:1043:20:1052 | ... > ... | UseUseExplosion.rb:20:1042:20:1053 | [true] ( ... ) | +| UseUseExplosion.rb:20:1043:20:1052 | ... > ... | UseUseExplosion.rb:20:1042:20:1053 | ( ... ) | | UseUseExplosion.rb:20:1051:20:1052 | 51 | UseUseExplosion.rb:20:1043:20:1052 | ... > ... | | UseUseExplosion.rb:20:1055:20:2900 | then ... | UseUseExplosion.rb:20:1039:20:2916 | if ... | | UseUseExplosion.rb:20:1060:20:2900 | if ... | UseUseExplosion.rb:20:1055:20:2900 | then ... | @@ -708,8 +658,7 @@ | UseUseExplosion.rb:20:1064:20:1068 | [post] self | UseUseExplosion.rb:20:2891:20:2896 | self | | UseUseExplosion.rb:20:1064:20:1068 | self | UseUseExplosion.rb:20:1085:20:1089 | self | | UseUseExplosion.rb:20:1064:20:1068 | self | UseUseExplosion.rb:20:2891:20:2896 | self | -| UseUseExplosion.rb:20:1064:20:1073 | ... > ... | UseUseExplosion.rb:20:1063:20:1074 | [false] ( ... ) | -| UseUseExplosion.rb:20:1064:20:1073 | ... > ... | UseUseExplosion.rb:20:1063:20:1074 | [true] ( ... ) | +| UseUseExplosion.rb:20:1064:20:1073 | ... > ... | UseUseExplosion.rb:20:1063:20:1074 | ( ... ) | | UseUseExplosion.rb:20:1072:20:1073 | 50 | UseUseExplosion.rb:20:1064:20:1073 | ... > ... | | UseUseExplosion.rb:20:1076:20:2884 | then ... | UseUseExplosion.rb:20:1060:20:2900 | if ... | | UseUseExplosion.rb:20:1081:20:2884 | if ... | UseUseExplosion.rb:20:1076:20:2884 | then ... | @@ -718,8 +667,7 @@ | UseUseExplosion.rb:20:1085:20:1089 | [post] self | UseUseExplosion.rb:20:2875:20:2880 | self | | UseUseExplosion.rb:20:1085:20:1089 | self | UseUseExplosion.rb:20:1106:20:1110 | self | | UseUseExplosion.rb:20:1085:20:1089 | self | UseUseExplosion.rb:20:2875:20:2880 | self | -| UseUseExplosion.rb:20:1085:20:1094 | ... > ... | UseUseExplosion.rb:20:1084:20:1095 | [false] ( ... ) | -| UseUseExplosion.rb:20:1085:20:1094 | ... > ... | UseUseExplosion.rb:20:1084:20:1095 | [true] ( ... ) | +| UseUseExplosion.rb:20:1085:20:1094 | ... > ... | UseUseExplosion.rb:20:1084:20:1095 | ( ... ) | | UseUseExplosion.rb:20:1093:20:1094 | 49 | UseUseExplosion.rb:20:1085:20:1094 | ... > ... | | UseUseExplosion.rb:20:1097:20:2868 | then ... | UseUseExplosion.rb:20:1081:20:2884 | if ... | | UseUseExplosion.rb:20:1102:20:2868 | if ... | UseUseExplosion.rb:20:1097:20:2868 | then ... | @@ -728,8 +676,7 @@ | UseUseExplosion.rb:20:1106:20:1110 | [post] self | UseUseExplosion.rb:20:2859:20:2864 | self | | UseUseExplosion.rb:20:1106:20:1110 | self | UseUseExplosion.rb:20:1127:20:1131 | self | | UseUseExplosion.rb:20:1106:20:1110 | self | UseUseExplosion.rb:20:2859:20:2864 | self | -| UseUseExplosion.rb:20:1106:20:1115 | ... > ... | UseUseExplosion.rb:20:1105:20:1116 | [false] ( ... ) | -| UseUseExplosion.rb:20:1106:20:1115 | ... > ... | UseUseExplosion.rb:20:1105:20:1116 | [true] ( ... ) | +| UseUseExplosion.rb:20:1106:20:1115 | ... > ... | UseUseExplosion.rb:20:1105:20:1116 | ( ... ) | | UseUseExplosion.rb:20:1114:20:1115 | 48 | UseUseExplosion.rb:20:1106:20:1115 | ... > ... | | UseUseExplosion.rb:20:1118:20:2852 | then ... | UseUseExplosion.rb:20:1102:20:2868 | if ... | | UseUseExplosion.rb:20:1123:20:2852 | if ... | UseUseExplosion.rb:20:1118:20:2852 | then ... | @@ -738,8 +685,7 @@ | UseUseExplosion.rb:20:1127:20:1131 | [post] self | UseUseExplosion.rb:20:2843:20:2848 | self | | UseUseExplosion.rb:20:1127:20:1131 | self | UseUseExplosion.rb:20:1148:20:1152 | self | | UseUseExplosion.rb:20:1127:20:1131 | self | UseUseExplosion.rb:20:2843:20:2848 | self | -| UseUseExplosion.rb:20:1127:20:1136 | ... > ... | UseUseExplosion.rb:20:1126:20:1137 | [false] ( ... ) | -| UseUseExplosion.rb:20:1127:20:1136 | ... > ... | UseUseExplosion.rb:20:1126:20:1137 | [true] ( ... ) | +| UseUseExplosion.rb:20:1127:20:1136 | ... > ... | UseUseExplosion.rb:20:1126:20:1137 | ( ... ) | | UseUseExplosion.rb:20:1135:20:1136 | 47 | UseUseExplosion.rb:20:1127:20:1136 | ... > ... | | UseUseExplosion.rb:20:1139:20:2836 | then ... | UseUseExplosion.rb:20:1123:20:2852 | if ... | | UseUseExplosion.rb:20:1144:20:2836 | if ... | UseUseExplosion.rb:20:1139:20:2836 | then ... | @@ -748,8 +694,7 @@ | UseUseExplosion.rb:20:1148:20:1152 | [post] self | UseUseExplosion.rb:20:2827:20:2832 | self | | UseUseExplosion.rb:20:1148:20:1152 | self | UseUseExplosion.rb:20:1169:20:1173 | self | | UseUseExplosion.rb:20:1148:20:1152 | self | UseUseExplosion.rb:20:2827:20:2832 | self | -| UseUseExplosion.rb:20:1148:20:1157 | ... > ... | UseUseExplosion.rb:20:1147:20:1158 | [false] ( ... ) | -| UseUseExplosion.rb:20:1148:20:1157 | ... > ... | UseUseExplosion.rb:20:1147:20:1158 | [true] ( ... ) | +| UseUseExplosion.rb:20:1148:20:1157 | ... > ... | UseUseExplosion.rb:20:1147:20:1158 | ( ... ) | | UseUseExplosion.rb:20:1156:20:1157 | 46 | UseUseExplosion.rb:20:1148:20:1157 | ... > ... | | UseUseExplosion.rb:20:1160:20:2820 | then ... | UseUseExplosion.rb:20:1144:20:2836 | if ... | | UseUseExplosion.rb:20:1165:20:2820 | if ... | UseUseExplosion.rb:20:1160:20:2820 | then ... | @@ -758,8 +703,7 @@ | UseUseExplosion.rb:20:1169:20:1173 | [post] self | UseUseExplosion.rb:20:2811:20:2816 | self | | UseUseExplosion.rb:20:1169:20:1173 | self | UseUseExplosion.rb:20:1190:20:1194 | self | | UseUseExplosion.rb:20:1169:20:1173 | self | UseUseExplosion.rb:20:2811:20:2816 | self | -| UseUseExplosion.rb:20:1169:20:1178 | ... > ... | UseUseExplosion.rb:20:1168:20:1179 | [false] ( ... ) | -| UseUseExplosion.rb:20:1169:20:1178 | ... > ... | UseUseExplosion.rb:20:1168:20:1179 | [true] ( ... ) | +| UseUseExplosion.rb:20:1169:20:1178 | ... > ... | UseUseExplosion.rb:20:1168:20:1179 | ( ... ) | | UseUseExplosion.rb:20:1177:20:1178 | 45 | UseUseExplosion.rb:20:1169:20:1178 | ... > ... | | UseUseExplosion.rb:20:1181:20:2804 | then ... | UseUseExplosion.rb:20:1165:20:2820 | if ... | | UseUseExplosion.rb:20:1186:20:2804 | if ... | UseUseExplosion.rb:20:1181:20:2804 | then ... | @@ -768,8 +712,7 @@ | UseUseExplosion.rb:20:1190:20:1194 | [post] self | UseUseExplosion.rb:20:2795:20:2800 | self | | UseUseExplosion.rb:20:1190:20:1194 | self | UseUseExplosion.rb:20:1211:20:1215 | self | | UseUseExplosion.rb:20:1190:20:1194 | self | UseUseExplosion.rb:20:2795:20:2800 | self | -| UseUseExplosion.rb:20:1190:20:1199 | ... > ... | UseUseExplosion.rb:20:1189:20:1200 | [false] ( ... ) | -| UseUseExplosion.rb:20:1190:20:1199 | ... > ... | UseUseExplosion.rb:20:1189:20:1200 | [true] ( ... ) | +| UseUseExplosion.rb:20:1190:20:1199 | ... > ... | UseUseExplosion.rb:20:1189:20:1200 | ( ... ) | | UseUseExplosion.rb:20:1198:20:1199 | 44 | UseUseExplosion.rb:20:1190:20:1199 | ... > ... | | UseUseExplosion.rb:20:1202:20:2788 | then ... | UseUseExplosion.rb:20:1186:20:2804 | if ... | | UseUseExplosion.rb:20:1207:20:2788 | if ... | UseUseExplosion.rb:20:1202:20:2788 | then ... | @@ -778,8 +721,7 @@ | UseUseExplosion.rb:20:1211:20:1215 | [post] self | UseUseExplosion.rb:20:2779:20:2784 | self | | UseUseExplosion.rb:20:1211:20:1215 | self | UseUseExplosion.rb:20:1232:20:1236 | self | | UseUseExplosion.rb:20:1211:20:1215 | self | UseUseExplosion.rb:20:2779:20:2784 | self | -| UseUseExplosion.rb:20:1211:20:1220 | ... > ... | UseUseExplosion.rb:20:1210:20:1221 | [false] ( ... ) | -| UseUseExplosion.rb:20:1211:20:1220 | ... > ... | UseUseExplosion.rb:20:1210:20:1221 | [true] ( ... ) | +| UseUseExplosion.rb:20:1211:20:1220 | ... > ... | UseUseExplosion.rb:20:1210:20:1221 | ( ... ) | | UseUseExplosion.rb:20:1219:20:1220 | 43 | UseUseExplosion.rb:20:1211:20:1220 | ... > ... | | UseUseExplosion.rb:20:1223:20:2772 | then ... | UseUseExplosion.rb:20:1207:20:2788 | if ... | | UseUseExplosion.rb:20:1228:20:2772 | if ... | UseUseExplosion.rb:20:1223:20:2772 | then ... | @@ -788,8 +730,7 @@ | UseUseExplosion.rb:20:1232:20:1236 | [post] self | UseUseExplosion.rb:20:2763:20:2768 | self | | UseUseExplosion.rb:20:1232:20:1236 | self | UseUseExplosion.rb:20:1253:20:1257 | self | | UseUseExplosion.rb:20:1232:20:1236 | self | UseUseExplosion.rb:20:2763:20:2768 | self | -| UseUseExplosion.rb:20:1232:20:1241 | ... > ... | UseUseExplosion.rb:20:1231:20:1242 | [false] ( ... ) | -| UseUseExplosion.rb:20:1232:20:1241 | ... > ... | UseUseExplosion.rb:20:1231:20:1242 | [true] ( ... ) | +| UseUseExplosion.rb:20:1232:20:1241 | ... > ... | UseUseExplosion.rb:20:1231:20:1242 | ( ... ) | | UseUseExplosion.rb:20:1240:20:1241 | 42 | UseUseExplosion.rb:20:1232:20:1241 | ... > ... | | UseUseExplosion.rb:20:1244:20:2756 | then ... | UseUseExplosion.rb:20:1228:20:2772 | if ... | | UseUseExplosion.rb:20:1249:20:2756 | if ... | UseUseExplosion.rb:20:1244:20:2756 | then ... | @@ -798,8 +739,7 @@ | UseUseExplosion.rb:20:1253:20:1257 | [post] self | UseUseExplosion.rb:20:2747:20:2752 | self | | UseUseExplosion.rb:20:1253:20:1257 | self | UseUseExplosion.rb:20:1274:20:1278 | self | | UseUseExplosion.rb:20:1253:20:1257 | self | UseUseExplosion.rb:20:2747:20:2752 | self | -| UseUseExplosion.rb:20:1253:20:1262 | ... > ... | UseUseExplosion.rb:20:1252:20:1263 | [false] ( ... ) | -| UseUseExplosion.rb:20:1253:20:1262 | ... > ... | UseUseExplosion.rb:20:1252:20:1263 | [true] ( ... ) | +| UseUseExplosion.rb:20:1253:20:1262 | ... > ... | UseUseExplosion.rb:20:1252:20:1263 | ( ... ) | | UseUseExplosion.rb:20:1261:20:1262 | 41 | UseUseExplosion.rb:20:1253:20:1262 | ... > ... | | UseUseExplosion.rb:20:1265:20:2740 | then ... | UseUseExplosion.rb:20:1249:20:2756 | if ... | | UseUseExplosion.rb:20:1270:20:2740 | if ... | UseUseExplosion.rb:20:1265:20:2740 | then ... | @@ -808,8 +748,7 @@ | UseUseExplosion.rb:20:1274:20:1278 | [post] self | UseUseExplosion.rb:20:2731:20:2736 | self | | UseUseExplosion.rb:20:1274:20:1278 | self | UseUseExplosion.rb:20:1295:20:1299 | self | | UseUseExplosion.rb:20:1274:20:1278 | self | UseUseExplosion.rb:20:2731:20:2736 | self | -| UseUseExplosion.rb:20:1274:20:1283 | ... > ... | UseUseExplosion.rb:20:1273:20:1284 | [false] ( ... ) | -| UseUseExplosion.rb:20:1274:20:1283 | ... > ... | UseUseExplosion.rb:20:1273:20:1284 | [true] ( ... ) | +| UseUseExplosion.rb:20:1274:20:1283 | ... > ... | UseUseExplosion.rb:20:1273:20:1284 | ( ... ) | | UseUseExplosion.rb:20:1282:20:1283 | 40 | UseUseExplosion.rb:20:1274:20:1283 | ... > ... | | UseUseExplosion.rb:20:1286:20:2724 | then ... | UseUseExplosion.rb:20:1270:20:2740 | if ... | | UseUseExplosion.rb:20:1291:20:2724 | if ... | UseUseExplosion.rb:20:1286:20:2724 | then ... | @@ -818,8 +757,7 @@ | UseUseExplosion.rb:20:1295:20:1299 | [post] self | UseUseExplosion.rb:20:2715:20:2720 | self | | UseUseExplosion.rb:20:1295:20:1299 | self | UseUseExplosion.rb:20:1316:20:1320 | self | | UseUseExplosion.rb:20:1295:20:1299 | self | UseUseExplosion.rb:20:2715:20:2720 | self | -| UseUseExplosion.rb:20:1295:20:1304 | ... > ... | UseUseExplosion.rb:20:1294:20:1305 | [false] ( ... ) | -| UseUseExplosion.rb:20:1295:20:1304 | ... > ... | UseUseExplosion.rb:20:1294:20:1305 | [true] ( ... ) | +| UseUseExplosion.rb:20:1295:20:1304 | ... > ... | UseUseExplosion.rb:20:1294:20:1305 | ( ... ) | | UseUseExplosion.rb:20:1303:20:1304 | 39 | UseUseExplosion.rb:20:1295:20:1304 | ... > ... | | UseUseExplosion.rb:20:1307:20:2708 | then ... | UseUseExplosion.rb:20:1291:20:2724 | if ... | | UseUseExplosion.rb:20:1312:20:2708 | if ... | UseUseExplosion.rb:20:1307:20:2708 | then ... | @@ -828,8 +766,7 @@ | UseUseExplosion.rb:20:1316:20:1320 | [post] self | UseUseExplosion.rb:20:2699:20:2704 | self | | UseUseExplosion.rb:20:1316:20:1320 | self | UseUseExplosion.rb:20:1337:20:1341 | self | | UseUseExplosion.rb:20:1316:20:1320 | self | UseUseExplosion.rb:20:2699:20:2704 | self | -| UseUseExplosion.rb:20:1316:20:1325 | ... > ... | UseUseExplosion.rb:20:1315:20:1326 | [false] ( ... ) | -| UseUseExplosion.rb:20:1316:20:1325 | ... > ... | UseUseExplosion.rb:20:1315:20:1326 | [true] ( ... ) | +| UseUseExplosion.rb:20:1316:20:1325 | ... > ... | UseUseExplosion.rb:20:1315:20:1326 | ( ... ) | | UseUseExplosion.rb:20:1324:20:1325 | 38 | UseUseExplosion.rb:20:1316:20:1325 | ... > ... | | UseUseExplosion.rb:20:1328:20:2692 | then ... | UseUseExplosion.rb:20:1312:20:2708 | if ... | | UseUseExplosion.rb:20:1333:20:2692 | if ... | UseUseExplosion.rb:20:1328:20:2692 | then ... | @@ -838,8 +775,7 @@ | UseUseExplosion.rb:20:1337:20:1341 | [post] self | UseUseExplosion.rb:20:2683:20:2688 | self | | UseUseExplosion.rb:20:1337:20:1341 | self | UseUseExplosion.rb:20:1358:20:1362 | self | | UseUseExplosion.rb:20:1337:20:1341 | self | UseUseExplosion.rb:20:2683:20:2688 | self | -| UseUseExplosion.rb:20:1337:20:1346 | ... > ... | UseUseExplosion.rb:20:1336:20:1347 | [false] ( ... ) | -| UseUseExplosion.rb:20:1337:20:1346 | ... > ... | UseUseExplosion.rb:20:1336:20:1347 | [true] ( ... ) | +| UseUseExplosion.rb:20:1337:20:1346 | ... > ... | UseUseExplosion.rb:20:1336:20:1347 | ( ... ) | | UseUseExplosion.rb:20:1345:20:1346 | 37 | UseUseExplosion.rb:20:1337:20:1346 | ... > ... | | UseUseExplosion.rb:20:1349:20:2676 | then ... | UseUseExplosion.rb:20:1333:20:2692 | if ... | | UseUseExplosion.rb:20:1354:20:2676 | if ... | UseUseExplosion.rb:20:1349:20:2676 | then ... | @@ -848,8 +784,7 @@ | UseUseExplosion.rb:20:1358:20:1362 | [post] self | UseUseExplosion.rb:20:2667:20:2672 | self | | UseUseExplosion.rb:20:1358:20:1362 | self | UseUseExplosion.rb:20:1379:20:1383 | self | | UseUseExplosion.rb:20:1358:20:1362 | self | UseUseExplosion.rb:20:2667:20:2672 | self | -| UseUseExplosion.rb:20:1358:20:1367 | ... > ... | UseUseExplosion.rb:20:1357:20:1368 | [false] ( ... ) | -| UseUseExplosion.rb:20:1358:20:1367 | ... > ... | UseUseExplosion.rb:20:1357:20:1368 | [true] ( ... ) | +| UseUseExplosion.rb:20:1358:20:1367 | ... > ... | UseUseExplosion.rb:20:1357:20:1368 | ( ... ) | | UseUseExplosion.rb:20:1366:20:1367 | 36 | UseUseExplosion.rb:20:1358:20:1367 | ... > ... | | UseUseExplosion.rb:20:1370:20:2660 | then ... | UseUseExplosion.rb:20:1354:20:2676 | if ... | | UseUseExplosion.rb:20:1375:20:2660 | if ... | UseUseExplosion.rb:20:1370:20:2660 | then ... | @@ -858,8 +793,7 @@ | UseUseExplosion.rb:20:1379:20:1383 | [post] self | UseUseExplosion.rb:20:2651:20:2656 | self | | UseUseExplosion.rb:20:1379:20:1383 | self | UseUseExplosion.rb:20:1400:20:1404 | self | | UseUseExplosion.rb:20:1379:20:1383 | self | UseUseExplosion.rb:20:2651:20:2656 | self | -| UseUseExplosion.rb:20:1379:20:1388 | ... > ... | UseUseExplosion.rb:20:1378:20:1389 | [false] ( ... ) | -| UseUseExplosion.rb:20:1379:20:1388 | ... > ... | UseUseExplosion.rb:20:1378:20:1389 | [true] ( ... ) | +| UseUseExplosion.rb:20:1379:20:1388 | ... > ... | UseUseExplosion.rb:20:1378:20:1389 | ( ... ) | | UseUseExplosion.rb:20:1387:20:1388 | 35 | UseUseExplosion.rb:20:1379:20:1388 | ... > ... | | UseUseExplosion.rb:20:1391:20:2644 | then ... | UseUseExplosion.rb:20:1375:20:2660 | if ... | | UseUseExplosion.rb:20:1396:20:2644 | if ... | UseUseExplosion.rb:20:1391:20:2644 | then ... | @@ -868,8 +802,7 @@ | UseUseExplosion.rb:20:1400:20:1404 | [post] self | UseUseExplosion.rb:20:2635:20:2640 | self | | UseUseExplosion.rb:20:1400:20:1404 | self | UseUseExplosion.rb:20:1421:20:1425 | self | | UseUseExplosion.rb:20:1400:20:1404 | self | UseUseExplosion.rb:20:2635:20:2640 | self | -| UseUseExplosion.rb:20:1400:20:1409 | ... > ... | UseUseExplosion.rb:20:1399:20:1410 | [false] ( ... ) | -| UseUseExplosion.rb:20:1400:20:1409 | ... > ... | UseUseExplosion.rb:20:1399:20:1410 | [true] ( ... ) | +| UseUseExplosion.rb:20:1400:20:1409 | ... > ... | UseUseExplosion.rb:20:1399:20:1410 | ( ... ) | | UseUseExplosion.rb:20:1408:20:1409 | 34 | UseUseExplosion.rb:20:1400:20:1409 | ... > ... | | UseUseExplosion.rb:20:1412:20:2628 | then ... | UseUseExplosion.rb:20:1396:20:2644 | if ... | | UseUseExplosion.rb:20:1417:20:2628 | if ... | UseUseExplosion.rb:20:1412:20:2628 | then ... | @@ -878,8 +811,7 @@ | UseUseExplosion.rb:20:1421:20:1425 | [post] self | UseUseExplosion.rb:20:2619:20:2624 | self | | UseUseExplosion.rb:20:1421:20:1425 | self | UseUseExplosion.rb:20:1442:20:1446 | self | | UseUseExplosion.rb:20:1421:20:1425 | self | UseUseExplosion.rb:20:2619:20:2624 | self | -| UseUseExplosion.rb:20:1421:20:1430 | ... > ... | UseUseExplosion.rb:20:1420:20:1431 | [false] ( ... ) | -| UseUseExplosion.rb:20:1421:20:1430 | ... > ... | UseUseExplosion.rb:20:1420:20:1431 | [true] ( ... ) | +| UseUseExplosion.rb:20:1421:20:1430 | ... > ... | UseUseExplosion.rb:20:1420:20:1431 | ( ... ) | | UseUseExplosion.rb:20:1429:20:1430 | 33 | UseUseExplosion.rb:20:1421:20:1430 | ... > ... | | UseUseExplosion.rb:20:1433:20:2612 | then ... | UseUseExplosion.rb:20:1417:20:2628 | if ... | | UseUseExplosion.rb:20:1438:20:2612 | if ... | UseUseExplosion.rb:20:1433:20:2612 | then ... | @@ -888,8 +820,7 @@ | UseUseExplosion.rb:20:1442:20:1446 | [post] self | UseUseExplosion.rb:20:2603:20:2608 | self | | UseUseExplosion.rb:20:1442:20:1446 | self | UseUseExplosion.rb:20:1463:20:1467 | self | | UseUseExplosion.rb:20:1442:20:1446 | self | UseUseExplosion.rb:20:2603:20:2608 | self | -| UseUseExplosion.rb:20:1442:20:1451 | ... > ... | UseUseExplosion.rb:20:1441:20:1452 | [false] ( ... ) | -| UseUseExplosion.rb:20:1442:20:1451 | ... > ... | UseUseExplosion.rb:20:1441:20:1452 | [true] ( ... ) | +| UseUseExplosion.rb:20:1442:20:1451 | ... > ... | UseUseExplosion.rb:20:1441:20:1452 | ( ... ) | | UseUseExplosion.rb:20:1450:20:1451 | 32 | UseUseExplosion.rb:20:1442:20:1451 | ... > ... | | UseUseExplosion.rb:20:1454:20:2596 | then ... | UseUseExplosion.rb:20:1438:20:2612 | if ... | | UseUseExplosion.rb:20:1459:20:2596 | if ... | UseUseExplosion.rb:20:1454:20:2596 | then ... | @@ -898,8 +829,7 @@ | UseUseExplosion.rb:20:1463:20:1467 | [post] self | UseUseExplosion.rb:20:2587:20:2592 | self | | UseUseExplosion.rb:20:1463:20:1467 | self | UseUseExplosion.rb:20:1484:20:1488 | self | | UseUseExplosion.rb:20:1463:20:1467 | self | UseUseExplosion.rb:20:2587:20:2592 | self | -| UseUseExplosion.rb:20:1463:20:1472 | ... > ... | UseUseExplosion.rb:20:1462:20:1473 | [false] ( ... ) | -| UseUseExplosion.rb:20:1463:20:1472 | ... > ... | UseUseExplosion.rb:20:1462:20:1473 | [true] ( ... ) | +| UseUseExplosion.rb:20:1463:20:1472 | ... > ... | UseUseExplosion.rb:20:1462:20:1473 | ( ... ) | | UseUseExplosion.rb:20:1471:20:1472 | 31 | UseUseExplosion.rb:20:1463:20:1472 | ... > ... | | UseUseExplosion.rb:20:1475:20:2580 | then ... | UseUseExplosion.rb:20:1459:20:2596 | if ... | | UseUseExplosion.rb:20:1480:20:2580 | if ... | UseUseExplosion.rb:20:1475:20:2580 | then ... | @@ -908,8 +838,7 @@ | UseUseExplosion.rb:20:1484:20:1488 | [post] self | UseUseExplosion.rb:20:2571:20:2576 | self | | UseUseExplosion.rb:20:1484:20:1488 | self | UseUseExplosion.rb:20:1505:20:1509 | self | | UseUseExplosion.rb:20:1484:20:1488 | self | UseUseExplosion.rb:20:2571:20:2576 | self | -| UseUseExplosion.rb:20:1484:20:1493 | ... > ... | UseUseExplosion.rb:20:1483:20:1494 | [false] ( ... ) | -| UseUseExplosion.rb:20:1484:20:1493 | ... > ... | UseUseExplosion.rb:20:1483:20:1494 | [true] ( ... ) | +| UseUseExplosion.rb:20:1484:20:1493 | ... > ... | UseUseExplosion.rb:20:1483:20:1494 | ( ... ) | | UseUseExplosion.rb:20:1492:20:1493 | 30 | UseUseExplosion.rb:20:1484:20:1493 | ... > ... | | UseUseExplosion.rb:20:1496:20:2564 | then ... | UseUseExplosion.rb:20:1480:20:2580 | if ... | | UseUseExplosion.rb:20:1501:20:2564 | if ... | UseUseExplosion.rb:20:1496:20:2564 | then ... | @@ -918,8 +847,7 @@ | UseUseExplosion.rb:20:1505:20:1509 | [post] self | UseUseExplosion.rb:20:2555:20:2560 | self | | UseUseExplosion.rb:20:1505:20:1509 | self | UseUseExplosion.rb:20:1526:20:1530 | self | | UseUseExplosion.rb:20:1505:20:1509 | self | UseUseExplosion.rb:20:2555:20:2560 | self | -| UseUseExplosion.rb:20:1505:20:1514 | ... > ... | UseUseExplosion.rb:20:1504:20:1515 | [false] ( ... ) | -| UseUseExplosion.rb:20:1505:20:1514 | ... > ... | UseUseExplosion.rb:20:1504:20:1515 | [true] ( ... ) | +| UseUseExplosion.rb:20:1505:20:1514 | ... > ... | UseUseExplosion.rb:20:1504:20:1515 | ( ... ) | | UseUseExplosion.rb:20:1513:20:1514 | 29 | UseUseExplosion.rb:20:1505:20:1514 | ... > ... | | UseUseExplosion.rb:20:1517:20:2548 | then ... | UseUseExplosion.rb:20:1501:20:2564 | if ... | | UseUseExplosion.rb:20:1522:20:2548 | if ... | UseUseExplosion.rb:20:1517:20:2548 | then ... | @@ -928,8 +856,7 @@ | UseUseExplosion.rb:20:1526:20:1530 | [post] self | UseUseExplosion.rb:20:2539:20:2544 | self | | UseUseExplosion.rb:20:1526:20:1530 | self | UseUseExplosion.rb:20:1547:20:1551 | self | | UseUseExplosion.rb:20:1526:20:1530 | self | UseUseExplosion.rb:20:2539:20:2544 | self | -| UseUseExplosion.rb:20:1526:20:1535 | ... > ... | UseUseExplosion.rb:20:1525:20:1536 | [false] ( ... ) | -| UseUseExplosion.rb:20:1526:20:1535 | ... > ... | UseUseExplosion.rb:20:1525:20:1536 | [true] ( ... ) | +| UseUseExplosion.rb:20:1526:20:1535 | ... > ... | UseUseExplosion.rb:20:1525:20:1536 | ( ... ) | | UseUseExplosion.rb:20:1534:20:1535 | 28 | UseUseExplosion.rb:20:1526:20:1535 | ... > ... | | UseUseExplosion.rb:20:1538:20:2532 | then ... | UseUseExplosion.rb:20:1522:20:2548 | if ... | | UseUseExplosion.rb:20:1543:20:2532 | if ... | UseUseExplosion.rb:20:1538:20:2532 | then ... | @@ -938,8 +865,7 @@ | UseUseExplosion.rb:20:1547:20:1551 | [post] self | UseUseExplosion.rb:20:2523:20:2528 | self | | UseUseExplosion.rb:20:1547:20:1551 | self | UseUseExplosion.rb:20:1568:20:1572 | self | | UseUseExplosion.rb:20:1547:20:1551 | self | UseUseExplosion.rb:20:2523:20:2528 | self | -| UseUseExplosion.rb:20:1547:20:1556 | ... > ... | UseUseExplosion.rb:20:1546:20:1557 | [false] ( ... ) | -| UseUseExplosion.rb:20:1547:20:1556 | ... > ... | UseUseExplosion.rb:20:1546:20:1557 | [true] ( ... ) | +| UseUseExplosion.rb:20:1547:20:1556 | ... > ... | UseUseExplosion.rb:20:1546:20:1557 | ( ... ) | | UseUseExplosion.rb:20:1555:20:1556 | 27 | UseUseExplosion.rb:20:1547:20:1556 | ... > ... | | UseUseExplosion.rb:20:1559:20:2516 | then ... | UseUseExplosion.rb:20:1543:20:2532 | if ... | | UseUseExplosion.rb:20:1564:20:2516 | if ... | UseUseExplosion.rb:20:1559:20:2516 | then ... | @@ -948,8 +874,7 @@ | UseUseExplosion.rb:20:1568:20:1572 | [post] self | UseUseExplosion.rb:20:2507:20:2512 | self | | UseUseExplosion.rb:20:1568:20:1572 | self | UseUseExplosion.rb:20:1589:20:1593 | self | | UseUseExplosion.rb:20:1568:20:1572 | self | UseUseExplosion.rb:20:2507:20:2512 | self | -| UseUseExplosion.rb:20:1568:20:1577 | ... > ... | UseUseExplosion.rb:20:1567:20:1578 | [false] ( ... ) | -| UseUseExplosion.rb:20:1568:20:1577 | ... > ... | UseUseExplosion.rb:20:1567:20:1578 | [true] ( ... ) | +| UseUseExplosion.rb:20:1568:20:1577 | ... > ... | UseUseExplosion.rb:20:1567:20:1578 | ( ... ) | | UseUseExplosion.rb:20:1576:20:1577 | 26 | UseUseExplosion.rb:20:1568:20:1577 | ... > ... | | UseUseExplosion.rb:20:1580:20:2500 | then ... | UseUseExplosion.rb:20:1564:20:2516 | if ... | | UseUseExplosion.rb:20:1585:20:2500 | if ... | UseUseExplosion.rb:20:1580:20:2500 | then ... | @@ -958,8 +883,7 @@ | UseUseExplosion.rb:20:1589:20:1593 | [post] self | UseUseExplosion.rb:20:2491:20:2496 | self | | UseUseExplosion.rb:20:1589:20:1593 | self | UseUseExplosion.rb:20:1610:20:1614 | self | | UseUseExplosion.rb:20:1589:20:1593 | self | UseUseExplosion.rb:20:2491:20:2496 | self | -| UseUseExplosion.rb:20:1589:20:1598 | ... > ... | UseUseExplosion.rb:20:1588:20:1599 | [false] ( ... ) | -| UseUseExplosion.rb:20:1589:20:1598 | ... > ... | UseUseExplosion.rb:20:1588:20:1599 | [true] ( ... ) | +| UseUseExplosion.rb:20:1589:20:1598 | ... > ... | UseUseExplosion.rb:20:1588:20:1599 | ( ... ) | | UseUseExplosion.rb:20:1597:20:1598 | 25 | UseUseExplosion.rb:20:1589:20:1598 | ... > ... | | UseUseExplosion.rb:20:1601:20:2484 | then ... | UseUseExplosion.rb:20:1585:20:2500 | if ... | | UseUseExplosion.rb:20:1606:20:2484 | if ... | UseUseExplosion.rb:20:1601:20:2484 | then ... | @@ -968,8 +892,7 @@ | UseUseExplosion.rb:20:1610:20:1614 | [post] self | UseUseExplosion.rb:20:2475:20:2480 | self | | UseUseExplosion.rb:20:1610:20:1614 | self | UseUseExplosion.rb:20:1631:20:1635 | self | | UseUseExplosion.rb:20:1610:20:1614 | self | UseUseExplosion.rb:20:2475:20:2480 | self | -| UseUseExplosion.rb:20:1610:20:1619 | ... > ... | UseUseExplosion.rb:20:1609:20:1620 | [false] ( ... ) | -| UseUseExplosion.rb:20:1610:20:1619 | ... > ... | UseUseExplosion.rb:20:1609:20:1620 | [true] ( ... ) | +| UseUseExplosion.rb:20:1610:20:1619 | ... > ... | UseUseExplosion.rb:20:1609:20:1620 | ( ... ) | | UseUseExplosion.rb:20:1618:20:1619 | 24 | UseUseExplosion.rb:20:1610:20:1619 | ... > ... | | UseUseExplosion.rb:20:1622:20:2468 | then ... | UseUseExplosion.rb:20:1606:20:2484 | if ... | | UseUseExplosion.rb:20:1627:20:2468 | if ... | UseUseExplosion.rb:20:1622:20:2468 | then ... | @@ -978,8 +901,7 @@ | UseUseExplosion.rb:20:1631:20:1635 | [post] self | UseUseExplosion.rb:20:2459:20:2464 | self | | UseUseExplosion.rb:20:1631:20:1635 | self | UseUseExplosion.rb:20:1652:20:1656 | self | | UseUseExplosion.rb:20:1631:20:1635 | self | UseUseExplosion.rb:20:2459:20:2464 | self | -| UseUseExplosion.rb:20:1631:20:1640 | ... > ... | UseUseExplosion.rb:20:1630:20:1641 | [false] ( ... ) | -| UseUseExplosion.rb:20:1631:20:1640 | ... > ... | UseUseExplosion.rb:20:1630:20:1641 | [true] ( ... ) | +| UseUseExplosion.rb:20:1631:20:1640 | ... > ... | UseUseExplosion.rb:20:1630:20:1641 | ( ... ) | | UseUseExplosion.rb:20:1639:20:1640 | 23 | UseUseExplosion.rb:20:1631:20:1640 | ... > ... | | UseUseExplosion.rb:20:1643:20:2452 | then ... | UseUseExplosion.rb:20:1627:20:2468 | if ... | | UseUseExplosion.rb:20:1648:20:2452 | if ... | UseUseExplosion.rb:20:1643:20:2452 | then ... | @@ -988,8 +910,7 @@ | UseUseExplosion.rb:20:1652:20:1656 | [post] self | UseUseExplosion.rb:20:2443:20:2448 | self | | UseUseExplosion.rb:20:1652:20:1656 | self | UseUseExplosion.rb:20:1673:20:1677 | self | | UseUseExplosion.rb:20:1652:20:1656 | self | UseUseExplosion.rb:20:2443:20:2448 | self | -| UseUseExplosion.rb:20:1652:20:1661 | ... > ... | UseUseExplosion.rb:20:1651:20:1662 | [false] ( ... ) | -| UseUseExplosion.rb:20:1652:20:1661 | ... > ... | UseUseExplosion.rb:20:1651:20:1662 | [true] ( ... ) | +| UseUseExplosion.rb:20:1652:20:1661 | ... > ... | UseUseExplosion.rb:20:1651:20:1662 | ( ... ) | | UseUseExplosion.rb:20:1660:20:1661 | 22 | UseUseExplosion.rb:20:1652:20:1661 | ... > ... | | UseUseExplosion.rb:20:1664:20:2436 | then ... | UseUseExplosion.rb:20:1648:20:2452 | if ... | | UseUseExplosion.rb:20:1669:20:2436 | if ... | UseUseExplosion.rb:20:1664:20:2436 | then ... | @@ -998,8 +919,7 @@ | UseUseExplosion.rb:20:1673:20:1677 | [post] self | UseUseExplosion.rb:20:2427:20:2432 | self | | UseUseExplosion.rb:20:1673:20:1677 | self | UseUseExplosion.rb:20:1694:20:1698 | self | | UseUseExplosion.rb:20:1673:20:1677 | self | UseUseExplosion.rb:20:2427:20:2432 | self | -| UseUseExplosion.rb:20:1673:20:1682 | ... > ... | UseUseExplosion.rb:20:1672:20:1683 | [false] ( ... ) | -| UseUseExplosion.rb:20:1673:20:1682 | ... > ... | UseUseExplosion.rb:20:1672:20:1683 | [true] ( ... ) | +| UseUseExplosion.rb:20:1673:20:1682 | ... > ... | UseUseExplosion.rb:20:1672:20:1683 | ( ... ) | | UseUseExplosion.rb:20:1681:20:1682 | 21 | UseUseExplosion.rb:20:1673:20:1682 | ... > ... | | UseUseExplosion.rb:20:1685:20:2420 | then ... | UseUseExplosion.rb:20:1669:20:2436 | if ... | | UseUseExplosion.rb:20:1690:20:2420 | if ... | UseUseExplosion.rb:20:1685:20:2420 | then ... | @@ -1008,8 +928,7 @@ | UseUseExplosion.rb:20:1694:20:1698 | [post] self | UseUseExplosion.rb:20:2411:20:2416 | self | | UseUseExplosion.rb:20:1694:20:1698 | self | UseUseExplosion.rb:20:1715:20:1719 | self | | UseUseExplosion.rb:20:1694:20:1698 | self | UseUseExplosion.rb:20:2411:20:2416 | self | -| UseUseExplosion.rb:20:1694:20:1703 | ... > ... | UseUseExplosion.rb:20:1693:20:1704 | [false] ( ... ) | -| UseUseExplosion.rb:20:1694:20:1703 | ... > ... | UseUseExplosion.rb:20:1693:20:1704 | [true] ( ... ) | +| UseUseExplosion.rb:20:1694:20:1703 | ... > ... | UseUseExplosion.rb:20:1693:20:1704 | ( ... ) | | UseUseExplosion.rb:20:1702:20:1703 | 20 | UseUseExplosion.rb:20:1694:20:1703 | ... > ... | | UseUseExplosion.rb:20:1706:20:2404 | then ... | UseUseExplosion.rb:20:1690:20:2420 | if ... | | UseUseExplosion.rb:20:1711:20:2404 | if ... | UseUseExplosion.rb:20:1706:20:2404 | then ... | @@ -1018,8 +937,7 @@ | UseUseExplosion.rb:20:1715:20:1719 | [post] self | UseUseExplosion.rb:20:2395:20:2400 | self | | UseUseExplosion.rb:20:1715:20:1719 | self | UseUseExplosion.rb:20:1736:20:1740 | self | | UseUseExplosion.rb:20:1715:20:1719 | self | UseUseExplosion.rb:20:2395:20:2400 | self | -| UseUseExplosion.rb:20:1715:20:1724 | ... > ... | UseUseExplosion.rb:20:1714:20:1725 | [false] ( ... ) | -| UseUseExplosion.rb:20:1715:20:1724 | ... > ... | UseUseExplosion.rb:20:1714:20:1725 | [true] ( ... ) | +| UseUseExplosion.rb:20:1715:20:1724 | ... > ... | UseUseExplosion.rb:20:1714:20:1725 | ( ... ) | | UseUseExplosion.rb:20:1723:20:1724 | 19 | UseUseExplosion.rb:20:1715:20:1724 | ... > ... | | UseUseExplosion.rb:20:1727:20:2388 | then ... | UseUseExplosion.rb:20:1711:20:2404 | if ... | | UseUseExplosion.rb:20:1732:20:2388 | if ... | UseUseExplosion.rb:20:1727:20:2388 | then ... | @@ -1028,8 +946,7 @@ | UseUseExplosion.rb:20:1736:20:1740 | [post] self | UseUseExplosion.rb:20:2379:20:2384 | self | | UseUseExplosion.rb:20:1736:20:1740 | self | UseUseExplosion.rb:20:1757:20:1761 | self | | UseUseExplosion.rb:20:1736:20:1740 | self | UseUseExplosion.rb:20:2379:20:2384 | self | -| UseUseExplosion.rb:20:1736:20:1745 | ... > ... | UseUseExplosion.rb:20:1735:20:1746 | [false] ( ... ) | -| UseUseExplosion.rb:20:1736:20:1745 | ... > ... | UseUseExplosion.rb:20:1735:20:1746 | [true] ( ... ) | +| UseUseExplosion.rb:20:1736:20:1745 | ... > ... | UseUseExplosion.rb:20:1735:20:1746 | ( ... ) | | UseUseExplosion.rb:20:1744:20:1745 | 18 | UseUseExplosion.rb:20:1736:20:1745 | ... > ... | | UseUseExplosion.rb:20:1748:20:2372 | then ... | UseUseExplosion.rb:20:1732:20:2388 | if ... | | UseUseExplosion.rb:20:1753:20:2372 | if ... | UseUseExplosion.rb:20:1748:20:2372 | then ... | @@ -1038,8 +955,7 @@ | UseUseExplosion.rb:20:1757:20:1761 | [post] self | UseUseExplosion.rb:20:2363:20:2368 | self | | UseUseExplosion.rb:20:1757:20:1761 | self | UseUseExplosion.rb:20:1778:20:1782 | self | | UseUseExplosion.rb:20:1757:20:1761 | self | UseUseExplosion.rb:20:2363:20:2368 | self | -| UseUseExplosion.rb:20:1757:20:1766 | ... > ... | UseUseExplosion.rb:20:1756:20:1767 | [false] ( ... ) | -| UseUseExplosion.rb:20:1757:20:1766 | ... > ... | UseUseExplosion.rb:20:1756:20:1767 | [true] ( ... ) | +| UseUseExplosion.rb:20:1757:20:1766 | ... > ... | UseUseExplosion.rb:20:1756:20:1767 | ( ... ) | | UseUseExplosion.rb:20:1765:20:1766 | 17 | UseUseExplosion.rb:20:1757:20:1766 | ... > ... | | UseUseExplosion.rb:20:1769:20:2356 | then ... | UseUseExplosion.rb:20:1753:20:2372 | if ... | | UseUseExplosion.rb:20:1774:20:2356 | if ... | UseUseExplosion.rb:20:1769:20:2356 | then ... | @@ -1048,8 +964,7 @@ | UseUseExplosion.rb:20:1778:20:1782 | [post] self | UseUseExplosion.rb:20:2347:20:2352 | self | | UseUseExplosion.rb:20:1778:20:1782 | self | UseUseExplosion.rb:20:1799:20:1803 | self | | UseUseExplosion.rb:20:1778:20:1782 | self | UseUseExplosion.rb:20:2347:20:2352 | self | -| UseUseExplosion.rb:20:1778:20:1787 | ... > ... | UseUseExplosion.rb:20:1777:20:1788 | [false] ( ... ) | -| UseUseExplosion.rb:20:1778:20:1787 | ... > ... | UseUseExplosion.rb:20:1777:20:1788 | [true] ( ... ) | +| UseUseExplosion.rb:20:1778:20:1787 | ... > ... | UseUseExplosion.rb:20:1777:20:1788 | ( ... ) | | UseUseExplosion.rb:20:1786:20:1787 | 16 | UseUseExplosion.rb:20:1778:20:1787 | ... > ... | | UseUseExplosion.rb:20:1790:20:2340 | then ... | UseUseExplosion.rb:20:1774:20:2356 | if ... | | UseUseExplosion.rb:20:1795:20:2340 | if ... | UseUseExplosion.rb:20:1790:20:2340 | then ... | @@ -1058,8 +973,7 @@ | UseUseExplosion.rb:20:1799:20:1803 | [post] self | UseUseExplosion.rb:20:2331:20:2336 | self | | UseUseExplosion.rb:20:1799:20:1803 | self | UseUseExplosion.rb:20:1820:20:1824 | self | | UseUseExplosion.rb:20:1799:20:1803 | self | UseUseExplosion.rb:20:2331:20:2336 | self | -| UseUseExplosion.rb:20:1799:20:1808 | ... > ... | UseUseExplosion.rb:20:1798:20:1809 | [false] ( ... ) | -| UseUseExplosion.rb:20:1799:20:1808 | ... > ... | UseUseExplosion.rb:20:1798:20:1809 | [true] ( ... ) | +| UseUseExplosion.rb:20:1799:20:1808 | ... > ... | UseUseExplosion.rb:20:1798:20:1809 | ( ... ) | | UseUseExplosion.rb:20:1807:20:1808 | 15 | UseUseExplosion.rb:20:1799:20:1808 | ... > ... | | UseUseExplosion.rb:20:1811:20:2324 | then ... | UseUseExplosion.rb:20:1795:20:2340 | if ... | | UseUseExplosion.rb:20:1816:20:2324 | if ... | UseUseExplosion.rb:20:1811:20:2324 | then ... | @@ -1068,8 +982,7 @@ | UseUseExplosion.rb:20:1820:20:1824 | [post] self | UseUseExplosion.rb:20:2315:20:2320 | self | | UseUseExplosion.rb:20:1820:20:1824 | self | UseUseExplosion.rb:20:1841:20:1845 | self | | UseUseExplosion.rb:20:1820:20:1824 | self | UseUseExplosion.rb:20:2315:20:2320 | self | -| UseUseExplosion.rb:20:1820:20:1829 | ... > ... | UseUseExplosion.rb:20:1819:20:1830 | [false] ( ... ) | -| UseUseExplosion.rb:20:1820:20:1829 | ... > ... | UseUseExplosion.rb:20:1819:20:1830 | [true] ( ... ) | +| UseUseExplosion.rb:20:1820:20:1829 | ... > ... | UseUseExplosion.rb:20:1819:20:1830 | ( ... ) | | UseUseExplosion.rb:20:1828:20:1829 | 14 | UseUseExplosion.rb:20:1820:20:1829 | ... > ... | | UseUseExplosion.rb:20:1832:20:2308 | then ... | UseUseExplosion.rb:20:1816:20:2324 | if ... | | UseUseExplosion.rb:20:1837:20:2308 | if ... | UseUseExplosion.rb:20:1832:20:2308 | then ... | @@ -1078,8 +991,7 @@ | UseUseExplosion.rb:20:1841:20:1845 | [post] self | UseUseExplosion.rb:20:2299:20:2304 | self | | UseUseExplosion.rb:20:1841:20:1845 | self | UseUseExplosion.rb:20:1862:20:1866 | self | | UseUseExplosion.rb:20:1841:20:1845 | self | UseUseExplosion.rb:20:2299:20:2304 | self | -| UseUseExplosion.rb:20:1841:20:1850 | ... > ... | UseUseExplosion.rb:20:1840:20:1851 | [false] ( ... ) | -| UseUseExplosion.rb:20:1841:20:1850 | ... > ... | UseUseExplosion.rb:20:1840:20:1851 | [true] ( ... ) | +| UseUseExplosion.rb:20:1841:20:1850 | ... > ... | UseUseExplosion.rb:20:1840:20:1851 | ( ... ) | | UseUseExplosion.rb:20:1849:20:1850 | 13 | UseUseExplosion.rb:20:1841:20:1850 | ... > ... | | UseUseExplosion.rb:20:1853:20:2292 | then ... | UseUseExplosion.rb:20:1837:20:2308 | if ... | | UseUseExplosion.rb:20:1858:20:2292 | if ... | UseUseExplosion.rb:20:1853:20:2292 | then ... | @@ -1088,8 +1000,7 @@ | UseUseExplosion.rb:20:1862:20:1866 | [post] self | UseUseExplosion.rb:20:2283:20:2288 | self | | UseUseExplosion.rb:20:1862:20:1866 | self | UseUseExplosion.rb:20:1883:20:1887 | self | | UseUseExplosion.rb:20:1862:20:1866 | self | UseUseExplosion.rb:20:2283:20:2288 | self | -| UseUseExplosion.rb:20:1862:20:1871 | ... > ... | UseUseExplosion.rb:20:1861:20:1872 | [false] ( ... ) | -| UseUseExplosion.rb:20:1862:20:1871 | ... > ... | UseUseExplosion.rb:20:1861:20:1872 | [true] ( ... ) | +| UseUseExplosion.rb:20:1862:20:1871 | ... > ... | UseUseExplosion.rb:20:1861:20:1872 | ( ... ) | | UseUseExplosion.rb:20:1870:20:1871 | 12 | UseUseExplosion.rb:20:1862:20:1871 | ... > ... | | UseUseExplosion.rb:20:1874:20:2276 | then ... | UseUseExplosion.rb:20:1858:20:2292 | if ... | | UseUseExplosion.rb:20:1879:20:2276 | if ... | UseUseExplosion.rb:20:1874:20:2276 | then ... | @@ -1098,8 +1009,7 @@ | UseUseExplosion.rb:20:1883:20:1887 | [post] self | UseUseExplosion.rb:20:2267:20:2272 | self | | UseUseExplosion.rb:20:1883:20:1887 | self | UseUseExplosion.rb:20:1904:20:1908 | self | | UseUseExplosion.rb:20:1883:20:1887 | self | UseUseExplosion.rb:20:2267:20:2272 | self | -| UseUseExplosion.rb:20:1883:20:1892 | ... > ... | UseUseExplosion.rb:20:1882:20:1893 | [false] ( ... ) | -| UseUseExplosion.rb:20:1883:20:1892 | ... > ... | UseUseExplosion.rb:20:1882:20:1893 | [true] ( ... ) | +| UseUseExplosion.rb:20:1883:20:1892 | ... > ... | UseUseExplosion.rb:20:1882:20:1893 | ( ... ) | | UseUseExplosion.rb:20:1891:20:1892 | 11 | UseUseExplosion.rb:20:1883:20:1892 | ... > ... | | UseUseExplosion.rb:20:1895:20:2260 | then ... | UseUseExplosion.rb:20:1879:20:2276 | if ... | | UseUseExplosion.rb:20:1900:20:2260 | if ... | UseUseExplosion.rb:20:1895:20:2260 | then ... | @@ -1108,8 +1018,7 @@ | UseUseExplosion.rb:20:1904:20:1908 | [post] self | UseUseExplosion.rb:20:2251:20:2256 | self | | UseUseExplosion.rb:20:1904:20:1908 | self | UseUseExplosion.rb:20:1925:20:1929 | self | | UseUseExplosion.rb:20:1904:20:1908 | self | UseUseExplosion.rb:20:2251:20:2256 | self | -| UseUseExplosion.rb:20:1904:20:1913 | ... > ... | UseUseExplosion.rb:20:1903:20:1914 | [false] ( ... ) | -| UseUseExplosion.rb:20:1904:20:1913 | ... > ... | UseUseExplosion.rb:20:1903:20:1914 | [true] ( ... ) | +| UseUseExplosion.rb:20:1904:20:1913 | ... > ... | UseUseExplosion.rb:20:1903:20:1914 | ( ... ) | | UseUseExplosion.rb:20:1912:20:1913 | 10 | UseUseExplosion.rb:20:1904:20:1913 | ... > ... | | UseUseExplosion.rb:20:1916:20:2244 | then ... | UseUseExplosion.rb:20:1900:20:2260 | if ... | | UseUseExplosion.rb:20:1921:20:2244 | if ... | UseUseExplosion.rb:20:1916:20:2244 | then ... | @@ -1118,8 +1027,7 @@ | UseUseExplosion.rb:20:1925:20:1929 | [post] self | UseUseExplosion.rb:20:2235:20:2240 | self | | UseUseExplosion.rb:20:1925:20:1929 | self | UseUseExplosion.rb:20:1945:20:1949 | self | | UseUseExplosion.rb:20:1925:20:1929 | self | UseUseExplosion.rb:20:2235:20:2240 | self | -| UseUseExplosion.rb:20:1925:20:1933 | ... > ... | UseUseExplosion.rb:20:1924:20:1934 | [false] ( ... ) | -| UseUseExplosion.rb:20:1925:20:1933 | ... > ... | UseUseExplosion.rb:20:1924:20:1934 | [true] ( ... ) | +| UseUseExplosion.rb:20:1925:20:1933 | ... > ... | UseUseExplosion.rb:20:1924:20:1934 | ( ... ) | | UseUseExplosion.rb:20:1933:20:1933 | 9 | UseUseExplosion.rb:20:1925:20:1933 | ... > ... | | UseUseExplosion.rb:20:1936:20:2228 | then ... | UseUseExplosion.rb:20:1921:20:2244 | if ... | | UseUseExplosion.rb:20:1941:20:2228 | if ... | UseUseExplosion.rb:20:1936:20:2228 | then ... | @@ -1128,8 +1036,7 @@ | UseUseExplosion.rb:20:1945:20:1949 | [post] self | UseUseExplosion.rb:20:2219:20:2224 | self | | UseUseExplosion.rb:20:1945:20:1949 | self | UseUseExplosion.rb:20:1965:20:1969 | self | | UseUseExplosion.rb:20:1945:20:1949 | self | UseUseExplosion.rb:20:2219:20:2224 | self | -| UseUseExplosion.rb:20:1945:20:1953 | ... > ... | UseUseExplosion.rb:20:1944:20:1954 | [false] ( ... ) | -| UseUseExplosion.rb:20:1945:20:1953 | ... > ... | UseUseExplosion.rb:20:1944:20:1954 | [true] ( ... ) | +| UseUseExplosion.rb:20:1945:20:1953 | ... > ... | UseUseExplosion.rb:20:1944:20:1954 | ( ... ) | | UseUseExplosion.rb:20:1953:20:1953 | 8 | UseUseExplosion.rb:20:1945:20:1953 | ... > ... | | UseUseExplosion.rb:20:1956:20:2212 | then ... | UseUseExplosion.rb:20:1941:20:2228 | if ... | | UseUseExplosion.rb:20:1961:20:2212 | if ... | UseUseExplosion.rb:20:1956:20:2212 | then ... | @@ -1138,8 +1045,7 @@ | UseUseExplosion.rb:20:1965:20:1969 | [post] self | UseUseExplosion.rb:20:2203:20:2208 | self | | UseUseExplosion.rb:20:1965:20:1969 | self | UseUseExplosion.rb:20:1985:20:1989 | self | | UseUseExplosion.rb:20:1965:20:1969 | self | UseUseExplosion.rb:20:2203:20:2208 | self | -| UseUseExplosion.rb:20:1965:20:1973 | ... > ... | UseUseExplosion.rb:20:1964:20:1974 | [false] ( ... ) | -| UseUseExplosion.rb:20:1965:20:1973 | ... > ... | UseUseExplosion.rb:20:1964:20:1974 | [true] ( ... ) | +| UseUseExplosion.rb:20:1965:20:1973 | ... > ... | UseUseExplosion.rb:20:1964:20:1974 | ( ... ) | | UseUseExplosion.rb:20:1973:20:1973 | 7 | UseUseExplosion.rb:20:1965:20:1973 | ... > ... | | UseUseExplosion.rb:20:1976:20:2196 | then ... | UseUseExplosion.rb:20:1961:20:2212 | if ... | | UseUseExplosion.rb:20:1981:20:2196 | if ... | UseUseExplosion.rb:20:1976:20:2196 | then ... | @@ -1148,8 +1054,7 @@ | UseUseExplosion.rb:20:1985:20:1989 | [post] self | UseUseExplosion.rb:20:2187:20:2192 | self | | UseUseExplosion.rb:20:1985:20:1989 | self | UseUseExplosion.rb:20:2005:20:2009 | self | | UseUseExplosion.rb:20:1985:20:1989 | self | UseUseExplosion.rb:20:2187:20:2192 | self | -| UseUseExplosion.rb:20:1985:20:1993 | ... > ... | UseUseExplosion.rb:20:1984:20:1994 | [false] ( ... ) | -| UseUseExplosion.rb:20:1985:20:1993 | ... > ... | UseUseExplosion.rb:20:1984:20:1994 | [true] ( ... ) | +| UseUseExplosion.rb:20:1985:20:1993 | ... > ... | UseUseExplosion.rb:20:1984:20:1994 | ( ... ) | | UseUseExplosion.rb:20:1993:20:1993 | 6 | UseUseExplosion.rb:20:1985:20:1993 | ... > ... | | UseUseExplosion.rb:20:1996:20:2180 | then ... | UseUseExplosion.rb:20:1981:20:2196 | if ... | | UseUseExplosion.rb:20:2001:20:2180 | if ... | UseUseExplosion.rb:20:1996:20:2180 | then ... | @@ -1158,8 +1063,7 @@ | UseUseExplosion.rb:20:2005:20:2009 | [post] self | UseUseExplosion.rb:20:2171:20:2176 | self | | UseUseExplosion.rb:20:2005:20:2009 | self | UseUseExplosion.rb:20:2025:20:2029 | self | | UseUseExplosion.rb:20:2005:20:2009 | self | UseUseExplosion.rb:20:2171:20:2176 | self | -| UseUseExplosion.rb:20:2005:20:2013 | ... > ... | UseUseExplosion.rb:20:2004:20:2014 | [false] ( ... ) | -| UseUseExplosion.rb:20:2005:20:2013 | ... > ... | UseUseExplosion.rb:20:2004:20:2014 | [true] ( ... ) | +| UseUseExplosion.rb:20:2005:20:2013 | ... > ... | UseUseExplosion.rb:20:2004:20:2014 | ( ... ) | | UseUseExplosion.rb:20:2013:20:2013 | 5 | UseUseExplosion.rb:20:2005:20:2013 | ... > ... | | UseUseExplosion.rb:20:2016:20:2164 | then ... | UseUseExplosion.rb:20:2001:20:2180 | if ... | | UseUseExplosion.rb:20:2021:20:2164 | if ... | UseUseExplosion.rb:20:2016:20:2164 | then ... | @@ -1168,8 +1072,7 @@ | UseUseExplosion.rb:20:2025:20:2029 | [post] self | UseUseExplosion.rb:20:2155:20:2160 | self | | UseUseExplosion.rb:20:2025:20:2029 | self | UseUseExplosion.rb:20:2045:20:2049 | self | | UseUseExplosion.rb:20:2025:20:2029 | self | UseUseExplosion.rb:20:2155:20:2160 | self | -| UseUseExplosion.rb:20:2025:20:2033 | ... > ... | UseUseExplosion.rb:20:2024:20:2034 | [false] ( ... ) | -| UseUseExplosion.rb:20:2025:20:2033 | ... > ... | UseUseExplosion.rb:20:2024:20:2034 | [true] ( ... ) | +| UseUseExplosion.rb:20:2025:20:2033 | ... > ... | UseUseExplosion.rb:20:2024:20:2034 | ( ... ) | | UseUseExplosion.rb:20:2033:20:2033 | 4 | UseUseExplosion.rb:20:2025:20:2033 | ... > ... | | UseUseExplosion.rb:20:2036:20:2148 | then ... | UseUseExplosion.rb:20:2021:20:2164 | if ... | | UseUseExplosion.rb:20:2041:20:2148 | if ... | UseUseExplosion.rb:20:2036:20:2148 | then ... | @@ -1178,8 +1081,7 @@ | UseUseExplosion.rb:20:2045:20:2049 | [post] self | UseUseExplosion.rb:20:2139:20:2144 | self | | UseUseExplosion.rb:20:2045:20:2049 | self | UseUseExplosion.rb:20:2065:20:2069 | self | | UseUseExplosion.rb:20:2045:20:2049 | self | UseUseExplosion.rb:20:2139:20:2144 | self | -| UseUseExplosion.rb:20:2045:20:2053 | ... > ... | UseUseExplosion.rb:20:2044:20:2054 | [false] ( ... ) | -| UseUseExplosion.rb:20:2045:20:2053 | ... > ... | UseUseExplosion.rb:20:2044:20:2054 | [true] ( ... ) | +| UseUseExplosion.rb:20:2045:20:2053 | ... > ... | UseUseExplosion.rb:20:2044:20:2054 | ( ... ) | | UseUseExplosion.rb:20:2053:20:2053 | 3 | UseUseExplosion.rb:20:2045:20:2053 | ... > ... | | UseUseExplosion.rb:20:2056:20:2132 | then ... | UseUseExplosion.rb:20:2041:20:2148 | if ... | | UseUseExplosion.rb:20:2061:20:2132 | if ... | UseUseExplosion.rb:20:2056:20:2132 | then ... | @@ -1188,8 +1090,7 @@ | UseUseExplosion.rb:20:2065:20:2069 | [post] self | UseUseExplosion.rb:20:2123:20:2128 | self | | UseUseExplosion.rb:20:2065:20:2069 | self | UseUseExplosion.rb:20:2085:20:2089 | self | | UseUseExplosion.rb:20:2065:20:2069 | self | UseUseExplosion.rb:20:2123:20:2128 | self | -| UseUseExplosion.rb:20:2065:20:2073 | ... > ... | UseUseExplosion.rb:20:2064:20:2074 | [false] ( ... ) | -| UseUseExplosion.rb:20:2065:20:2073 | ... > ... | UseUseExplosion.rb:20:2064:20:2074 | [true] ( ... ) | +| UseUseExplosion.rb:20:2065:20:2073 | ... > ... | UseUseExplosion.rb:20:2064:20:2074 | ( ... ) | | UseUseExplosion.rb:20:2073:20:2073 | 2 | UseUseExplosion.rb:20:2065:20:2073 | ... > ... | | UseUseExplosion.rb:20:2076:20:2116 | then ... | UseUseExplosion.rb:20:2061:20:2132 | if ... | | UseUseExplosion.rb:20:2081:20:2116 | if ... | UseUseExplosion.rb:20:2076:20:2116 | then ... | @@ -1198,8 +1099,7 @@ | UseUseExplosion.rb:20:2085:20:2089 | [post] self | UseUseExplosion.rb:20:2107:20:2112 | self | | UseUseExplosion.rb:20:2085:20:2089 | self | UseUseExplosion.rb:20:2096:20:2099 | [input] SSA phi read(self) | | UseUseExplosion.rb:20:2085:20:2089 | self | UseUseExplosion.rb:20:2107:20:2112 | self | -| UseUseExplosion.rb:20:2085:20:2093 | ... > ... | UseUseExplosion.rb:20:2084:20:2094 | [false] ( ... ) | -| UseUseExplosion.rb:20:2085:20:2093 | ... > ... | UseUseExplosion.rb:20:2084:20:2094 | [true] ( ... ) | +| UseUseExplosion.rb:20:2085:20:2093 | ... > ... | UseUseExplosion.rb:20:2084:20:2094 | ( ... ) | | UseUseExplosion.rb:20:2093:20:2093 | 1 | UseUseExplosion.rb:20:2085:20:2093 | ... > ... | | UseUseExplosion.rb:20:2096:20:2099 | [input] SSA phi read(self) | UseUseExplosion.rb:21:13:21:17 | self | | UseUseExplosion.rb:20:2096:20:2099 | [input] SSA phi read(x) | UseUseExplosion.rb:20:9:20:3700 | SSA phi read(x) | @@ -1704,13 +1604,13 @@ | UseUseExplosion.rb:20:3691:20:3696 | call to use | UseUseExplosion.rb:20:3686:20:3696 | else ... | | UseUseExplosion.rb:20:3691:20:3696 | self | UseUseExplosion.rb:21:13:21:17 | self | | UseUseExplosion.rb:20:3695:20:3695 | x | UseUseExplosion.rb:20:9:20:3700 | SSA phi read(x) | +| UseUseExplosion.rb:21:9:21:3700 | if ... | UseUseExplosion.rb:19:9:21:3700 | ... | | UseUseExplosion.rb:21:13:21:17 | @prop | UseUseExplosion.rb:21:13:21:23 | ... > ... | | UseUseExplosion.rb:21:13:21:17 | [post] self | UseUseExplosion.rb:21:35:21:39 | self | | UseUseExplosion.rb:21:13:21:17 | [post] self | UseUseExplosion.rb:21:3691:21:3696 | self | | UseUseExplosion.rb:21:13:21:17 | self | UseUseExplosion.rb:21:35:21:39 | self | | UseUseExplosion.rb:21:13:21:17 | self | UseUseExplosion.rb:21:3691:21:3696 | self | -| UseUseExplosion.rb:21:13:21:23 | ... > ... | UseUseExplosion.rb:21:12:21:24 | [false] ( ... ) | -| UseUseExplosion.rb:21:13:21:23 | ... > ... | UseUseExplosion.rb:21:12:21:24 | [true] ( ... ) | +| UseUseExplosion.rb:21:13:21:23 | ... > ... | UseUseExplosion.rb:21:12:21:24 | ( ... ) | | UseUseExplosion.rb:21:21:21:23 | 100 | UseUseExplosion.rb:21:13:21:23 | ... > ... | | UseUseExplosion.rb:21:26:21:3684 | then ... | UseUseExplosion.rb:21:9:21:3700 | if ... | | UseUseExplosion.rb:21:31:21:3684 | if ... | UseUseExplosion.rb:21:26:21:3684 | then ... | @@ -1719,8 +1619,7 @@ | UseUseExplosion.rb:21:35:21:39 | [post] self | UseUseExplosion.rb:21:3675:21:3680 | self | | UseUseExplosion.rb:21:35:21:39 | self | UseUseExplosion.rb:21:56:21:60 | self | | UseUseExplosion.rb:21:35:21:39 | self | UseUseExplosion.rb:21:3675:21:3680 | self | -| UseUseExplosion.rb:21:35:21:44 | ... > ... | UseUseExplosion.rb:21:34:21:45 | [false] ( ... ) | -| UseUseExplosion.rb:21:35:21:44 | ... > ... | UseUseExplosion.rb:21:34:21:45 | [true] ( ... ) | +| UseUseExplosion.rb:21:35:21:44 | ... > ... | UseUseExplosion.rb:21:34:21:45 | ( ... ) | | UseUseExplosion.rb:21:43:21:44 | 99 | UseUseExplosion.rb:21:35:21:44 | ... > ... | | UseUseExplosion.rb:21:47:21:3668 | then ... | UseUseExplosion.rb:21:31:21:3684 | if ... | | UseUseExplosion.rb:21:52:21:3668 | if ... | UseUseExplosion.rb:21:47:21:3668 | then ... | @@ -1729,8 +1628,7 @@ | UseUseExplosion.rb:21:56:21:60 | [post] self | UseUseExplosion.rb:21:3659:21:3664 | self | | UseUseExplosion.rb:21:56:21:60 | self | UseUseExplosion.rb:21:77:21:81 | self | | UseUseExplosion.rb:21:56:21:60 | self | UseUseExplosion.rb:21:3659:21:3664 | self | -| UseUseExplosion.rb:21:56:21:65 | ... > ... | UseUseExplosion.rb:21:55:21:66 | [false] ( ... ) | -| UseUseExplosion.rb:21:56:21:65 | ... > ... | UseUseExplosion.rb:21:55:21:66 | [true] ( ... ) | +| UseUseExplosion.rb:21:56:21:65 | ... > ... | UseUseExplosion.rb:21:55:21:66 | ( ... ) | | UseUseExplosion.rb:21:64:21:65 | 98 | UseUseExplosion.rb:21:56:21:65 | ... > ... | | UseUseExplosion.rb:21:68:21:3652 | then ... | UseUseExplosion.rb:21:52:21:3668 | if ... | | UseUseExplosion.rb:21:73:21:3652 | if ... | UseUseExplosion.rb:21:68:21:3652 | then ... | @@ -1739,8 +1637,7 @@ | UseUseExplosion.rb:21:77:21:81 | [post] self | UseUseExplosion.rb:21:3643:21:3648 | self | | UseUseExplosion.rb:21:77:21:81 | self | UseUseExplosion.rb:21:98:21:102 | self | | UseUseExplosion.rb:21:77:21:81 | self | UseUseExplosion.rb:21:3643:21:3648 | self | -| UseUseExplosion.rb:21:77:21:86 | ... > ... | UseUseExplosion.rb:21:76:21:87 | [false] ( ... ) | -| UseUseExplosion.rb:21:77:21:86 | ... > ... | UseUseExplosion.rb:21:76:21:87 | [true] ( ... ) | +| UseUseExplosion.rb:21:77:21:86 | ... > ... | UseUseExplosion.rb:21:76:21:87 | ( ... ) | | UseUseExplosion.rb:21:85:21:86 | 97 | UseUseExplosion.rb:21:77:21:86 | ... > ... | | UseUseExplosion.rb:21:89:21:3636 | then ... | UseUseExplosion.rb:21:73:21:3652 | if ... | | UseUseExplosion.rb:21:94:21:3636 | if ... | UseUseExplosion.rb:21:89:21:3636 | then ... | @@ -1749,8 +1646,7 @@ | UseUseExplosion.rb:21:98:21:102 | [post] self | UseUseExplosion.rb:21:3627:21:3632 | self | | UseUseExplosion.rb:21:98:21:102 | self | UseUseExplosion.rb:21:119:21:123 | self | | UseUseExplosion.rb:21:98:21:102 | self | UseUseExplosion.rb:21:3627:21:3632 | self | -| UseUseExplosion.rb:21:98:21:107 | ... > ... | UseUseExplosion.rb:21:97:21:108 | [false] ( ... ) | -| UseUseExplosion.rb:21:98:21:107 | ... > ... | UseUseExplosion.rb:21:97:21:108 | [true] ( ... ) | +| UseUseExplosion.rb:21:98:21:107 | ... > ... | UseUseExplosion.rb:21:97:21:108 | ( ... ) | | UseUseExplosion.rb:21:106:21:107 | 96 | UseUseExplosion.rb:21:98:21:107 | ... > ... | | UseUseExplosion.rb:21:110:21:3620 | then ... | UseUseExplosion.rb:21:94:21:3636 | if ... | | UseUseExplosion.rb:21:115:21:3620 | if ... | UseUseExplosion.rb:21:110:21:3620 | then ... | @@ -1759,8 +1655,7 @@ | UseUseExplosion.rb:21:119:21:123 | [post] self | UseUseExplosion.rb:21:3611:21:3616 | self | | UseUseExplosion.rb:21:119:21:123 | self | UseUseExplosion.rb:21:140:21:144 | self | | UseUseExplosion.rb:21:119:21:123 | self | UseUseExplosion.rb:21:3611:21:3616 | self | -| UseUseExplosion.rb:21:119:21:128 | ... > ... | UseUseExplosion.rb:21:118:21:129 | [false] ( ... ) | -| UseUseExplosion.rb:21:119:21:128 | ... > ... | UseUseExplosion.rb:21:118:21:129 | [true] ( ... ) | +| UseUseExplosion.rb:21:119:21:128 | ... > ... | UseUseExplosion.rb:21:118:21:129 | ( ... ) | | UseUseExplosion.rb:21:127:21:128 | 95 | UseUseExplosion.rb:21:119:21:128 | ... > ... | | UseUseExplosion.rb:21:131:21:3604 | then ... | UseUseExplosion.rb:21:115:21:3620 | if ... | | UseUseExplosion.rb:21:136:21:3604 | if ... | UseUseExplosion.rb:21:131:21:3604 | then ... | @@ -1769,8 +1664,7 @@ | UseUseExplosion.rb:21:140:21:144 | [post] self | UseUseExplosion.rb:21:3595:21:3600 | self | | UseUseExplosion.rb:21:140:21:144 | self | UseUseExplosion.rb:21:161:21:165 | self | | UseUseExplosion.rb:21:140:21:144 | self | UseUseExplosion.rb:21:3595:21:3600 | self | -| UseUseExplosion.rb:21:140:21:149 | ... > ... | UseUseExplosion.rb:21:139:21:150 | [false] ( ... ) | -| UseUseExplosion.rb:21:140:21:149 | ... > ... | UseUseExplosion.rb:21:139:21:150 | [true] ( ... ) | +| UseUseExplosion.rb:21:140:21:149 | ... > ... | UseUseExplosion.rb:21:139:21:150 | ( ... ) | | UseUseExplosion.rb:21:148:21:149 | 94 | UseUseExplosion.rb:21:140:21:149 | ... > ... | | UseUseExplosion.rb:21:152:21:3588 | then ... | UseUseExplosion.rb:21:136:21:3604 | if ... | | UseUseExplosion.rb:21:157:21:3588 | if ... | UseUseExplosion.rb:21:152:21:3588 | then ... | @@ -1779,8 +1673,7 @@ | UseUseExplosion.rb:21:161:21:165 | [post] self | UseUseExplosion.rb:21:3579:21:3584 | self | | UseUseExplosion.rb:21:161:21:165 | self | UseUseExplosion.rb:21:182:21:186 | self | | UseUseExplosion.rb:21:161:21:165 | self | UseUseExplosion.rb:21:3579:21:3584 | self | -| UseUseExplosion.rb:21:161:21:170 | ... > ... | UseUseExplosion.rb:21:160:21:171 | [false] ( ... ) | -| UseUseExplosion.rb:21:161:21:170 | ... > ... | UseUseExplosion.rb:21:160:21:171 | [true] ( ... ) | +| UseUseExplosion.rb:21:161:21:170 | ... > ... | UseUseExplosion.rb:21:160:21:171 | ( ... ) | | UseUseExplosion.rb:21:169:21:170 | 93 | UseUseExplosion.rb:21:161:21:170 | ... > ... | | UseUseExplosion.rb:21:173:21:3572 | then ... | UseUseExplosion.rb:21:157:21:3588 | if ... | | UseUseExplosion.rb:21:178:21:3572 | if ... | UseUseExplosion.rb:21:173:21:3572 | then ... | @@ -1789,8 +1682,7 @@ | UseUseExplosion.rb:21:182:21:186 | [post] self | UseUseExplosion.rb:21:3563:21:3568 | self | | UseUseExplosion.rb:21:182:21:186 | self | UseUseExplosion.rb:21:203:21:207 | self | | UseUseExplosion.rb:21:182:21:186 | self | UseUseExplosion.rb:21:3563:21:3568 | self | -| UseUseExplosion.rb:21:182:21:191 | ... > ... | UseUseExplosion.rb:21:181:21:192 | [false] ( ... ) | -| UseUseExplosion.rb:21:182:21:191 | ... > ... | UseUseExplosion.rb:21:181:21:192 | [true] ( ... ) | +| UseUseExplosion.rb:21:182:21:191 | ... > ... | UseUseExplosion.rb:21:181:21:192 | ( ... ) | | UseUseExplosion.rb:21:190:21:191 | 92 | UseUseExplosion.rb:21:182:21:191 | ... > ... | | UseUseExplosion.rb:21:194:21:3556 | then ... | UseUseExplosion.rb:21:178:21:3572 | if ... | | UseUseExplosion.rb:21:199:21:3556 | if ... | UseUseExplosion.rb:21:194:21:3556 | then ... | @@ -1799,8 +1691,7 @@ | UseUseExplosion.rb:21:203:21:207 | [post] self | UseUseExplosion.rb:21:3547:21:3552 | self | | UseUseExplosion.rb:21:203:21:207 | self | UseUseExplosion.rb:21:224:21:228 | self | | UseUseExplosion.rb:21:203:21:207 | self | UseUseExplosion.rb:21:3547:21:3552 | self | -| UseUseExplosion.rb:21:203:21:212 | ... > ... | UseUseExplosion.rb:21:202:21:213 | [false] ( ... ) | -| UseUseExplosion.rb:21:203:21:212 | ... > ... | UseUseExplosion.rb:21:202:21:213 | [true] ( ... ) | +| UseUseExplosion.rb:21:203:21:212 | ... > ... | UseUseExplosion.rb:21:202:21:213 | ( ... ) | | UseUseExplosion.rb:21:211:21:212 | 91 | UseUseExplosion.rb:21:203:21:212 | ... > ... | | UseUseExplosion.rb:21:215:21:3540 | then ... | UseUseExplosion.rb:21:199:21:3556 | if ... | | UseUseExplosion.rb:21:220:21:3540 | if ... | UseUseExplosion.rb:21:215:21:3540 | then ... | @@ -1809,8 +1700,7 @@ | UseUseExplosion.rb:21:224:21:228 | [post] self | UseUseExplosion.rb:21:3531:21:3536 | self | | UseUseExplosion.rb:21:224:21:228 | self | UseUseExplosion.rb:21:245:21:249 | self | | UseUseExplosion.rb:21:224:21:228 | self | UseUseExplosion.rb:21:3531:21:3536 | self | -| UseUseExplosion.rb:21:224:21:233 | ... > ... | UseUseExplosion.rb:21:223:21:234 | [false] ( ... ) | -| UseUseExplosion.rb:21:224:21:233 | ... > ... | UseUseExplosion.rb:21:223:21:234 | [true] ( ... ) | +| UseUseExplosion.rb:21:224:21:233 | ... > ... | UseUseExplosion.rb:21:223:21:234 | ( ... ) | | UseUseExplosion.rb:21:232:21:233 | 90 | UseUseExplosion.rb:21:224:21:233 | ... > ... | | UseUseExplosion.rb:21:236:21:3524 | then ... | UseUseExplosion.rb:21:220:21:3540 | if ... | | UseUseExplosion.rb:21:241:21:3524 | if ... | UseUseExplosion.rb:21:236:21:3524 | then ... | @@ -1819,8 +1709,7 @@ | UseUseExplosion.rb:21:245:21:249 | [post] self | UseUseExplosion.rb:21:3515:21:3520 | self | | UseUseExplosion.rb:21:245:21:249 | self | UseUseExplosion.rb:21:266:21:270 | self | | UseUseExplosion.rb:21:245:21:249 | self | UseUseExplosion.rb:21:3515:21:3520 | self | -| UseUseExplosion.rb:21:245:21:254 | ... > ... | UseUseExplosion.rb:21:244:21:255 | [false] ( ... ) | -| UseUseExplosion.rb:21:245:21:254 | ... > ... | UseUseExplosion.rb:21:244:21:255 | [true] ( ... ) | +| UseUseExplosion.rb:21:245:21:254 | ... > ... | UseUseExplosion.rb:21:244:21:255 | ( ... ) | | UseUseExplosion.rb:21:253:21:254 | 89 | UseUseExplosion.rb:21:245:21:254 | ... > ... | | UseUseExplosion.rb:21:257:21:3508 | then ... | UseUseExplosion.rb:21:241:21:3524 | if ... | | UseUseExplosion.rb:21:262:21:3508 | if ... | UseUseExplosion.rb:21:257:21:3508 | then ... | @@ -1829,8 +1718,7 @@ | UseUseExplosion.rb:21:266:21:270 | [post] self | UseUseExplosion.rb:21:3499:21:3504 | self | | UseUseExplosion.rb:21:266:21:270 | self | UseUseExplosion.rb:21:287:21:291 | self | | UseUseExplosion.rb:21:266:21:270 | self | UseUseExplosion.rb:21:3499:21:3504 | self | -| UseUseExplosion.rb:21:266:21:275 | ... > ... | UseUseExplosion.rb:21:265:21:276 | [false] ( ... ) | -| UseUseExplosion.rb:21:266:21:275 | ... > ... | UseUseExplosion.rb:21:265:21:276 | [true] ( ... ) | +| UseUseExplosion.rb:21:266:21:275 | ... > ... | UseUseExplosion.rb:21:265:21:276 | ( ... ) | | UseUseExplosion.rb:21:274:21:275 | 88 | UseUseExplosion.rb:21:266:21:275 | ... > ... | | UseUseExplosion.rb:21:278:21:3492 | then ... | UseUseExplosion.rb:21:262:21:3508 | if ... | | UseUseExplosion.rb:21:283:21:3492 | if ... | UseUseExplosion.rb:21:278:21:3492 | then ... | @@ -1839,8 +1727,7 @@ | UseUseExplosion.rb:21:287:21:291 | [post] self | UseUseExplosion.rb:21:3483:21:3488 | self | | UseUseExplosion.rb:21:287:21:291 | self | UseUseExplosion.rb:21:308:21:312 | self | | UseUseExplosion.rb:21:287:21:291 | self | UseUseExplosion.rb:21:3483:21:3488 | self | -| UseUseExplosion.rb:21:287:21:296 | ... > ... | UseUseExplosion.rb:21:286:21:297 | [false] ( ... ) | -| UseUseExplosion.rb:21:287:21:296 | ... > ... | UseUseExplosion.rb:21:286:21:297 | [true] ( ... ) | +| UseUseExplosion.rb:21:287:21:296 | ... > ... | UseUseExplosion.rb:21:286:21:297 | ( ... ) | | UseUseExplosion.rb:21:295:21:296 | 87 | UseUseExplosion.rb:21:287:21:296 | ... > ... | | UseUseExplosion.rb:21:299:21:3476 | then ... | UseUseExplosion.rb:21:283:21:3492 | if ... | | UseUseExplosion.rb:21:304:21:3476 | if ... | UseUseExplosion.rb:21:299:21:3476 | then ... | @@ -1849,8 +1736,7 @@ | UseUseExplosion.rb:21:308:21:312 | [post] self | UseUseExplosion.rb:21:3467:21:3472 | self | | UseUseExplosion.rb:21:308:21:312 | self | UseUseExplosion.rb:21:329:21:333 | self | | UseUseExplosion.rb:21:308:21:312 | self | UseUseExplosion.rb:21:3467:21:3472 | self | -| UseUseExplosion.rb:21:308:21:317 | ... > ... | UseUseExplosion.rb:21:307:21:318 | [false] ( ... ) | -| UseUseExplosion.rb:21:308:21:317 | ... > ... | UseUseExplosion.rb:21:307:21:318 | [true] ( ... ) | +| UseUseExplosion.rb:21:308:21:317 | ... > ... | UseUseExplosion.rb:21:307:21:318 | ( ... ) | | UseUseExplosion.rb:21:316:21:317 | 86 | UseUseExplosion.rb:21:308:21:317 | ... > ... | | UseUseExplosion.rb:21:320:21:3460 | then ... | UseUseExplosion.rb:21:304:21:3476 | if ... | | UseUseExplosion.rb:21:325:21:3460 | if ... | UseUseExplosion.rb:21:320:21:3460 | then ... | @@ -1859,8 +1745,7 @@ | UseUseExplosion.rb:21:329:21:333 | [post] self | UseUseExplosion.rb:21:3451:21:3456 | self | | UseUseExplosion.rb:21:329:21:333 | self | UseUseExplosion.rb:21:350:21:354 | self | | UseUseExplosion.rb:21:329:21:333 | self | UseUseExplosion.rb:21:3451:21:3456 | self | -| UseUseExplosion.rb:21:329:21:338 | ... > ... | UseUseExplosion.rb:21:328:21:339 | [false] ( ... ) | -| UseUseExplosion.rb:21:329:21:338 | ... > ... | UseUseExplosion.rb:21:328:21:339 | [true] ( ... ) | +| UseUseExplosion.rb:21:329:21:338 | ... > ... | UseUseExplosion.rb:21:328:21:339 | ( ... ) | | UseUseExplosion.rb:21:337:21:338 | 85 | UseUseExplosion.rb:21:329:21:338 | ... > ... | | UseUseExplosion.rb:21:341:21:3444 | then ... | UseUseExplosion.rb:21:325:21:3460 | if ... | | UseUseExplosion.rb:21:346:21:3444 | if ... | UseUseExplosion.rb:21:341:21:3444 | then ... | @@ -1869,8 +1754,7 @@ | UseUseExplosion.rb:21:350:21:354 | [post] self | UseUseExplosion.rb:21:3435:21:3440 | self | | UseUseExplosion.rb:21:350:21:354 | self | UseUseExplosion.rb:21:371:21:375 | self | | UseUseExplosion.rb:21:350:21:354 | self | UseUseExplosion.rb:21:3435:21:3440 | self | -| UseUseExplosion.rb:21:350:21:359 | ... > ... | UseUseExplosion.rb:21:349:21:360 | [false] ( ... ) | -| UseUseExplosion.rb:21:350:21:359 | ... > ... | UseUseExplosion.rb:21:349:21:360 | [true] ( ... ) | +| UseUseExplosion.rb:21:350:21:359 | ... > ... | UseUseExplosion.rb:21:349:21:360 | ( ... ) | | UseUseExplosion.rb:21:358:21:359 | 84 | UseUseExplosion.rb:21:350:21:359 | ... > ... | | UseUseExplosion.rb:21:362:21:3428 | then ... | UseUseExplosion.rb:21:346:21:3444 | if ... | | UseUseExplosion.rb:21:367:21:3428 | if ... | UseUseExplosion.rb:21:362:21:3428 | then ... | @@ -1879,8 +1763,7 @@ | UseUseExplosion.rb:21:371:21:375 | [post] self | UseUseExplosion.rb:21:3419:21:3424 | self | | UseUseExplosion.rb:21:371:21:375 | self | UseUseExplosion.rb:21:392:21:396 | self | | UseUseExplosion.rb:21:371:21:375 | self | UseUseExplosion.rb:21:3419:21:3424 | self | -| UseUseExplosion.rb:21:371:21:380 | ... > ... | UseUseExplosion.rb:21:370:21:381 | [false] ( ... ) | -| UseUseExplosion.rb:21:371:21:380 | ... > ... | UseUseExplosion.rb:21:370:21:381 | [true] ( ... ) | +| UseUseExplosion.rb:21:371:21:380 | ... > ... | UseUseExplosion.rb:21:370:21:381 | ( ... ) | | UseUseExplosion.rb:21:379:21:380 | 83 | UseUseExplosion.rb:21:371:21:380 | ... > ... | | UseUseExplosion.rb:21:383:21:3412 | then ... | UseUseExplosion.rb:21:367:21:3428 | if ... | | UseUseExplosion.rb:21:388:21:3412 | if ... | UseUseExplosion.rb:21:383:21:3412 | then ... | @@ -1889,8 +1772,7 @@ | UseUseExplosion.rb:21:392:21:396 | [post] self | UseUseExplosion.rb:21:3403:21:3408 | self | | UseUseExplosion.rb:21:392:21:396 | self | UseUseExplosion.rb:21:413:21:417 | self | | UseUseExplosion.rb:21:392:21:396 | self | UseUseExplosion.rb:21:3403:21:3408 | self | -| UseUseExplosion.rb:21:392:21:401 | ... > ... | UseUseExplosion.rb:21:391:21:402 | [false] ( ... ) | -| UseUseExplosion.rb:21:392:21:401 | ... > ... | UseUseExplosion.rb:21:391:21:402 | [true] ( ... ) | +| UseUseExplosion.rb:21:392:21:401 | ... > ... | UseUseExplosion.rb:21:391:21:402 | ( ... ) | | UseUseExplosion.rb:21:400:21:401 | 82 | UseUseExplosion.rb:21:392:21:401 | ... > ... | | UseUseExplosion.rb:21:404:21:3396 | then ... | UseUseExplosion.rb:21:388:21:3412 | if ... | | UseUseExplosion.rb:21:409:21:3396 | if ... | UseUseExplosion.rb:21:404:21:3396 | then ... | @@ -1899,8 +1781,7 @@ | UseUseExplosion.rb:21:413:21:417 | [post] self | UseUseExplosion.rb:21:3387:21:3392 | self | | UseUseExplosion.rb:21:413:21:417 | self | UseUseExplosion.rb:21:434:21:438 | self | | UseUseExplosion.rb:21:413:21:417 | self | UseUseExplosion.rb:21:3387:21:3392 | self | -| UseUseExplosion.rb:21:413:21:422 | ... > ... | UseUseExplosion.rb:21:412:21:423 | [false] ( ... ) | -| UseUseExplosion.rb:21:413:21:422 | ... > ... | UseUseExplosion.rb:21:412:21:423 | [true] ( ... ) | +| UseUseExplosion.rb:21:413:21:422 | ... > ... | UseUseExplosion.rb:21:412:21:423 | ( ... ) | | UseUseExplosion.rb:21:421:21:422 | 81 | UseUseExplosion.rb:21:413:21:422 | ... > ... | | UseUseExplosion.rb:21:425:21:3380 | then ... | UseUseExplosion.rb:21:409:21:3396 | if ... | | UseUseExplosion.rb:21:430:21:3380 | if ... | UseUseExplosion.rb:21:425:21:3380 | then ... | @@ -1909,8 +1790,7 @@ | UseUseExplosion.rb:21:434:21:438 | [post] self | UseUseExplosion.rb:21:3371:21:3376 | self | | UseUseExplosion.rb:21:434:21:438 | self | UseUseExplosion.rb:21:455:21:459 | self | | UseUseExplosion.rb:21:434:21:438 | self | UseUseExplosion.rb:21:3371:21:3376 | self | -| UseUseExplosion.rb:21:434:21:443 | ... > ... | UseUseExplosion.rb:21:433:21:444 | [false] ( ... ) | -| UseUseExplosion.rb:21:434:21:443 | ... > ... | UseUseExplosion.rb:21:433:21:444 | [true] ( ... ) | +| UseUseExplosion.rb:21:434:21:443 | ... > ... | UseUseExplosion.rb:21:433:21:444 | ( ... ) | | UseUseExplosion.rb:21:442:21:443 | 80 | UseUseExplosion.rb:21:434:21:443 | ... > ... | | UseUseExplosion.rb:21:446:21:3364 | then ... | UseUseExplosion.rb:21:430:21:3380 | if ... | | UseUseExplosion.rb:21:451:21:3364 | if ... | UseUseExplosion.rb:21:446:21:3364 | then ... | @@ -1919,8 +1799,7 @@ | UseUseExplosion.rb:21:455:21:459 | [post] self | UseUseExplosion.rb:21:3355:21:3360 | self | | UseUseExplosion.rb:21:455:21:459 | self | UseUseExplosion.rb:21:476:21:480 | self | | UseUseExplosion.rb:21:455:21:459 | self | UseUseExplosion.rb:21:3355:21:3360 | self | -| UseUseExplosion.rb:21:455:21:464 | ... > ... | UseUseExplosion.rb:21:454:21:465 | [false] ( ... ) | -| UseUseExplosion.rb:21:455:21:464 | ... > ... | UseUseExplosion.rb:21:454:21:465 | [true] ( ... ) | +| UseUseExplosion.rb:21:455:21:464 | ... > ... | UseUseExplosion.rb:21:454:21:465 | ( ... ) | | UseUseExplosion.rb:21:463:21:464 | 79 | UseUseExplosion.rb:21:455:21:464 | ... > ... | | UseUseExplosion.rb:21:467:21:3348 | then ... | UseUseExplosion.rb:21:451:21:3364 | if ... | | UseUseExplosion.rb:21:472:21:3348 | if ... | UseUseExplosion.rb:21:467:21:3348 | then ... | @@ -1929,8 +1808,7 @@ | UseUseExplosion.rb:21:476:21:480 | [post] self | UseUseExplosion.rb:21:3339:21:3344 | self | | UseUseExplosion.rb:21:476:21:480 | self | UseUseExplosion.rb:21:497:21:501 | self | | UseUseExplosion.rb:21:476:21:480 | self | UseUseExplosion.rb:21:3339:21:3344 | self | -| UseUseExplosion.rb:21:476:21:485 | ... > ... | UseUseExplosion.rb:21:475:21:486 | [false] ( ... ) | -| UseUseExplosion.rb:21:476:21:485 | ... > ... | UseUseExplosion.rb:21:475:21:486 | [true] ( ... ) | +| UseUseExplosion.rb:21:476:21:485 | ... > ... | UseUseExplosion.rb:21:475:21:486 | ( ... ) | | UseUseExplosion.rb:21:484:21:485 | 78 | UseUseExplosion.rb:21:476:21:485 | ... > ... | | UseUseExplosion.rb:21:488:21:3332 | then ... | UseUseExplosion.rb:21:472:21:3348 | if ... | | UseUseExplosion.rb:21:493:21:3332 | if ... | UseUseExplosion.rb:21:488:21:3332 | then ... | @@ -1939,8 +1817,7 @@ | UseUseExplosion.rb:21:497:21:501 | [post] self | UseUseExplosion.rb:21:3323:21:3328 | self | | UseUseExplosion.rb:21:497:21:501 | self | UseUseExplosion.rb:21:518:21:522 | self | | UseUseExplosion.rb:21:497:21:501 | self | UseUseExplosion.rb:21:3323:21:3328 | self | -| UseUseExplosion.rb:21:497:21:506 | ... > ... | UseUseExplosion.rb:21:496:21:507 | [false] ( ... ) | -| UseUseExplosion.rb:21:497:21:506 | ... > ... | UseUseExplosion.rb:21:496:21:507 | [true] ( ... ) | +| UseUseExplosion.rb:21:497:21:506 | ... > ... | UseUseExplosion.rb:21:496:21:507 | ( ... ) | | UseUseExplosion.rb:21:505:21:506 | 77 | UseUseExplosion.rb:21:497:21:506 | ... > ... | | UseUseExplosion.rb:21:509:21:3316 | then ... | UseUseExplosion.rb:21:493:21:3332 | if ... | | UseUseExplosion.rb:21:514:21:3316 | if ... | UseUseExplosion.rb:21:509:21:3316 | then ... | @@ -1949,8 +1826,7 @@ | UseUseExplosion.rb:21:518:21:522 | [post] self | UseUseExplosion.rb:21:3307:21:3312 | self | | UseUseExplosion.rb:21:518:21:522 | self | UseUseExplosion.rb:21:539:21:543 | self | | UseUseExplosion.rb:21:518:21:522 | self | UseUseExplosion.rb:21:3307:21:3312 | self | -| UseUseExplosion.rb:21:518:21:527 | ... > ... | UseUseExplosion.rb:21:517:21:528 | [false] ( ... ) | -| UseUseExplosion.rb:21:518:21:527 | ... > ... | UseUseExplosion.rb:21:517:21:528 | [true] ( ... ) | +| UseUseExplosion.rb:21:518:21:527 | ... > ... | UseUseExplosion.rb:21:517:21:528 | ( ... ) | | UseUseExplosion.rb:21:526:21:527 | 76 | UseUseExplosion.rb:21:518:21:527 | ... > ... | | UseUseExplosion.rb:21:530:21:3300 | then ... | UseUseExplosion.rb:21:514:21:3316 | if ... | | UseUseExplosion.rb:21:535:21:3300 | if ... | UseUseExplosion.rb:21:530:21:3300 | then ... | @@ -1959,8 +1835,7 @@ | UseUseExplosion.rb:21:539:21:543 | [post] self | UseUseExplosion.rb:21:3291:21:3296 | self | | UseUseExplosion.rb:21:539:21:543 | self | UseUseExplosion.rb:21:560:21:564 | self | | UseUseExplosion.rb:21:539:21:543 | self | UseUseExplosion.rb:21:3291:21:3296 | self | -| UseUseExplosion.rb:21:539:21:548 | ... > ... | UseUseExplosion.rb:21:538:21:549 | [false] ( ... ) | -| UseUseExplosion.rb:21:539:21:548 | ... > ... | UseUseExplosion.rb:21:538:21:549 | [true] ( ... ) | +| UseUseExplosion.rb:21:539:21:548 | ... > ... | UseUseExplosion.rb:21:538:21:549 | ( ... ) | | UseUseExplosion.rb:21:547:21:548 | 75 | UseUseExplosion.rb:21:539:21:548 | ... > ... | | UseUseExplosion.rb:21:551:21:3284 | then ... | UseUseExplosion.rb:21:535:21:3300 | if ... | | UseUseExplosion.rb:21:556:21:3284 | if ... | UseUseExplosion.rb:21:551:21:3284 | then ... | @@ -1969,8 +1844,7 @@ | UseUseExplosion.rb:21:560:21:564 | [post] self | UseUseExplosion.rb:21:3275:21:3280 | self | | UseUseExplosion.rb:21:560:21:564 | self | UseUseExplosion.rb:21:581:21:585 | self | | UseUseExplosion.rb:21:560:21:564 | self | UseUseExplosion.rb:21:3275:21:3280 | self | -| UseUseExplosion.rb:21:560:21:569 | ... > ... | UseUseExplosion.rb:21:559:21:570 | [false] ( ... ) | -| UseUseExplosion.rb:21:560:21:569 | ... > ... | UseUseExplosion.rb:21:559:21:570 | [true] ( ... ) | +| UseUseExplosion.rb:21:560:21:569 | ... > ... | UseUseExplosion.rb:21:559:21:570 | ( ... ) | | UseUseExplosion.rb:21:568:21:569 | 74 | UseUseExplosion.rb:21:560:21:569 | ... > ... | | UseUseExplosion.rb:21:572:21:3268 | then ... | UseUseExplosion.rb:21:556:21:3284 | if ... | | UseUseExplosion.rb:21:577:21:3268 | if ... | UseUseExplosion.rb:21:572:21:3268 | then ... | @@ -1979,8 +1853,7 @@ | UseUseExplosion.rb:21:581:21:585 | [post] self | UseUseExplosion.rb:21:3259:21:3264 | self | | UseUseExplosion.rb:21:581:21:585 | self | UseUseExplosion.rb:21:602:21:606 | self | | UseUseExplosion.rb:21:581:21:585 | self | UseUseExplosion.rb:21:3259:21:3264 | self | -| UseUseExplosion.rb:21:581:21:590 | ... > ... | UseUseExplosion.rb:21:580:21:591 | [false] ( ... ) | -| UseUseExplosion.rb:21:581:21:590 | ... > ... | UseUseExplosion.rb:21:580:21:591 | [true] ( ... ) | +| UseUseExplosion.rb:21:581:21:590 | ... > ... | UseUseExplosion.rb:21:580:21:591 | ( ... ) | | UseUseExplosion.rb:21:589:21:590 | 73 | UseUseExplosion.rb:21:581:21:590 | ... > ... | | UseUseExplosion.rb:21:593:21:3252 | then ... | UseUseExplosion.rb:21:577:21:3268 | if ... | | UseUseExplosion.rb:21:598:21:3252 | if ... | UseUseExplosion.rb:21:593:21:3252 | then ... | @@ -1989,8 +1862,7 @@ | UseUseExplosion.rb:21:602:21:606 | [post] self | UseUseExplosion.rb:21:3243:21:3248 | self | | UseUseExplosion.rb:21:602:21:606 | self | UseUseExplosion.rb:21:623:21:627 | self | | UseUseExplosion.rb:21:602:21:606 | self | UseUseExplosion.rb:21:3243:21:3248 | self | -| UseUseExplosion.rb:21:602:21:611 | ... > ... | UseUseExplosion.rb:21:601:21:612 | [false] ( ... ) | -| UseUseExplosion.rb:21:602:21:611 | ... > ... | UseUseExplosion.rb:21:601:21:612 | [true] ( ... ) | +| UseUseExplosion.rb:21:602:21:611 | ... > ... | UseUseExplosion.rb:21:601:21:612 | ( ... ) | | UseUseExplosion.rb:21:610:21:611 | 72 | UseUseExplosion.rb:21:602:21:611 | ... > ... | | UseUseExplosion.rb:21:614:21:3236 | then ... | UseUseExplosion.rb:21:598:21:3252 | if ... | | UseUseExplosion.rb:21:619:21:3236 | if ... | UseUseExplosion.rb:21:614:21:3236 | then ... | @@ -1999,8 +1871,7 @@ | UseUseExplosion.rb:21:623:21:627 | [post] self | UseUseExplosion.rb:21:3227:21:3232 | self | | UseUseExplosion.rb:21:623:21:627 | self | UseUseExplosion.rb:21:644:21:648 | self | | UseUseExplosion.rb:21:623:21:627 | self | UseUseExplosion.rb:21:3227:21:3232 | self | -| UseUseExplosion.rb:21:623:21:632 | ... > ... | UseUseExplosion.rb:21:622:21:633 | [false] ( ... ) | -| UseUseExplosion.rb:21:623:21:632 | ... > ... | UseUseExplosion.rb:21:622:21:633 | [true] ( ... ) | +| UseUseExplosion.rb:21:623:21:632 | ... > ... | UseUseExplosion.rb:21:622:21:633 | ( ... ) | | UseUseExplosion.rb:21:631:21:632 | 71 | UseUseExplosion.rb:21:623:21:632 | ... > ... | | UseUseExplosion.rb:21:635:21:3220 | then ... | UseUseExplosion.rb:21:619:21:3236 | if ... | | UseUseExplosion.rb:21:640:21:3220 | if ... | UseUseExplosion.rb:21:635:21:3220 | then ... | @@ -2009,8 +1880,7 @@ | UseUseExplosion.rb:21:644:21:648 | [post] self | UseUseExplosion.rb:21:3211:21:3216 | self | | UseUseExplosion.rb:21:644:21:648 | self | UseUseExplosion.rb:21:665:21:669 | self | | UseUseExplosion.rb:21:644:21:648 | self | UseUseExplosion.rb:21:3211:21:3216 | self | -| UseUseExplosion.rb:21:644:21:653 | ... > ... | UseUseExplosion.rb:21:643:21:654 | [false] ( ... ) | -| UseUseExplosion.rb:21:644:21:653 | ... > ... | UseUseExplosion.rb:21:643:21:654 | [true] ( ... ) | +| UseUseExplosion.rb:21:644:21:653 | ... > ... | UseUseExplosion.rb:21:643:21:654 | ( ... ) | | UseUseExplosion.rb:21:652:21:653 | 70 | UseUseExplosion.rb:21:644:21:653 | ... > ... | | UseUseExplosion.rb:21:656:21:3204 | then ... | UseUseExplosion.rb:21:640:21:3220 | if ... | | UseUseExplosion.rb:21:661:21:3204 | if ... | UseUseExplosion.rb:21:656:21:3204 | then ... | @@ -2019,8 +1889,7 @@ | UseUseExplosion.rb:21:665:21:669 | [post] self | UseUseExplosion.rb:21:3195:21:3200 | self | | UseUseExplosion.rb:21:665:21:669 | self | UseUseExplosion.rb:21:686:21:690 | self | | UseUseExplosion.rb:21:665:21:669 | self | UseUseExplosion.rb:21:3195:21:3200 | self | -| UseUseExplosion.rb:21:665:21:674 | ... > ... | UseUseExplosion.rb:21:664:21:675 | [false] ( ... ) | -| UseUseExplosion.rb:21:665:21:674 | ... > ... | UseUseExplosion.rb:21:664:21:675 | [true] ( ... ) | +| UseUseExplosion.rb:21:665:21:674 | ... > ... | UseUseExplosion.rb:21:664:21:675 | ( ... ) | | UseUseExplosion.rb:21:673:21:674 | 69 | UseUseExplosion.rb:21:665:21:674 | ... > ... | | UseUseExplosion.rb:21:677:21:3188 | then ... | UseUseExplosion.rb:21:661:21:3204 | if ... | | UseUseExplosion.rb:21:682:21:3188 | if ... | UseUseExplosion.rb:21:677:21:3188 | then ... | @@ -2029,8 +1898,7 @@ | UseUseExplosion.rb:21:686:21:690 | [post] self | UseUseExplosion.rb:21:3179:21:3184 | self | | UseUseExplosion.rb:21:686:21:690 | self | UseUseExplosion.rb:21:707:21:711 | self | | UseUseExplosion.rb:21:686:21:690 | self | UseUseExplosion.rb:21:3179:21:3184 | self | -| UseUseExplosion.rb:21:686:21:695 | ... > ... | UseUseExplosion.rb:21:685:21:696 | [false] ( ... ) | -| UseUseExplosion.rb:21:686:21:695 | ... > ... | UseUseExplosion.rb:21:685:21:696 | [true] ( ... ) | +| UseUseExplosion.rb:21:686:21:695 | ... > ... | UseUseExplosion.rb:21:685:21:696 | ( ... ) | | UseUseExplosion.rb:21:694:21:695 | 68 | UseUseExplosion.rb:21:686:21:695 | ... > ... | | UseUseExplosion.rb:21:698:21:3172 | then ... | UseUseExplosion.rb:21:682:21:3188 | if ... | | UseUseExplosion.rb:21:703:21:3172 | if ... | UseUseExplosion.rb:21:698:21:3172 | then ... | @@ -2039,8 +1907,7 @@ | UseUseExplosion.rb:21:707:21:711 | [post] self | UseUseExplosion.rb:21:3163:21:3168 | self | | UseUseExplosion.rb:21:707:21:711 | self | UseUseExplosion.rb:21:728:21:732 | self | | UseUseExplosion.rb:21:707:21:711 | self | UseUseExplosion.rb:21:3163:21:3168 | self | -| UseUseExplosion.rb:21:707:21:716 | ... > ... | UseUseExplosion.rb:21:706:21:717 | [false] ( ... ) | -| UseUseExplosion.rb:21:707:21:716 | ... > ... | UseUseExplosion.rb:21:706:21:717 | [true] ( ... ) | +| UseUseExplosion.rb:21:707:21:716 | ... > ... | UseUseExplosion.rb:21:706:21:717 | ( ... ) | | UseUseExplosion.rb:21:715:21:716 | 67 | UseUseExplosion.rb:21:707:21:716 | ... > ... | | UseUseExplosion.rb:21:719:21:3156 | then ... | UseUseExplosion.rb:21:703:21:3172 | if ... | | UseUseExplosion.rb:21:724:21:3156 | if ... | UseUseExplosion.rb:21:719:21:3156 | then ... | @@ -2049,8 +1916,7 @@ | UseUseExplosion.rb:21:728:21:732 | [post] self | UseUseExplosion.rb:21:3147:21:3152 | self | | UseUseExplosion.rb:21:728:21:732 | self | UseUseExplosion.rb:21:749:21:753 | self | | UseUseExplosion.rb:21:728:21:732 | self | UseUseExplosion.rb:21:3147:21:3152 | self | -| UseUseExplosion.rb:21:728:21:737 | ... > ... | UseUseExplosion.rb:21:727:21:738 | [false] ( ... ) | -| UseUseExplosion.rb:21:728:21:737 | ... > ... | UseUseExplosion.rb:21:727:21:738 | [true] ( ... ) | +| UseUseExplosion.rb:21:728:21:737 | ... > ... | UseUseExplosion.rb:21:727:21:738 | ( ... ) | | UseUseExplosion.rb:21:736:21:737 | 66 | UseUseExplosion.rb:21:728:21:737 | ... > ... | | UseUseExplosion.rb:21:740:21:3140 | then ... | UseUseExplosion.rb:21:724:21:3156 | if ... | | UseUseExplosion.rb:21:745:21:3140 | if ... | UseUseExplosion.rb:21:740:21:3140 | then ... | @@ -2059,8 +1925,7 @@ | UseUseExplosion.rb:21:749:21:753 | [post] self | UseUseExplosion.rb:21:3131:21:3136 | self | | UseUseExplosion.rb:21:749:21:753 | self | UseUseExplosion.rb:21:770:21:774 | self | | UseUseExplosion.rb:21:749:21:753 | self | UseUseExplosion.rb:21:3131:21:3136 | self | -| UseUseExplosion.rb:21:749:21:758 | ... > ... | UseUseExplosion.rb:21:748:21:759 | [false] ( ... ) | -| UseUseExplosion.rb:21:749:21:758 | ... > ... | UseUseExplosion.rb:21:748:21:759 | [true] ( ... ) | +| UseUseExplosion.rb:21:749:21:758 | ... > ... | UseUseExplosion.rb:21:748:21:759 | ( ... ) | | UseUseExplosion.rb:21:757:21:758 | 65 | UseUseExplosion.rb:21:749:21:758 | ... > ... | | UseUseExplosion.rb:21:761:21:3124 | then ... | UseUseExplosion.rb:21:745:21:3140 | if ... | | UseUseExplosion.rb:21:766:21:3124 | if ... | UseUseExplosion.rb:21:761:21:3124 | then ... | @@ -2069,8 +1934,7 @@ | UseUseExplosion.rb:21:770:21:774 | [post] self | UseUseExplosion.rb:21:3115:21:3120 | self | | UseUseExplosion.rb:21:770:21:774 | self | UseUseExplosion.rb:21:791:21:795 | self | | UseUseExplosion.rb:21:770:21:774 | self | UseUseExplosion.rb:21:3115:21:3120 | self | -| UseUseExplosion.rb:21:770:21:779 | ... > ... | UseUseExplosion.rb:21:769:21:780 | [false] ( ... ) | -| UseUseExplosion.rb:21:770:21:779 | ... > ... | UseUseExplosion.rb:21:769:21:780 | [true] ( ... ) | +| UseUseExplosion.rb:21:770:21:779 | ... > ... | UseUseExplosion.rb:21:769:21:780 | ( ... ) | | UseUseExplosion.rb:21:778:21:779 | 64 | UseUseExplosion.rb:21:770:21:779 | ... > ... | | UseUseExplosion.rb:21:782:21:3108 | then ... | UseUseExplosion.rb:21:766:21:3124 | if ... | | UseUseExplosion.rb:21:787:21:3108 | if ... | UseUseExplosion.rb:21:782:21:3108 | then ... | @@ -2079,8 +1943,7 @@ | UseUseExplosion.rb:21:791:21:795 | [post] self | UseUseExplosion.rb:21:3099:21:3104 | self | | UseUseExplosion.rb:21:791:21:795 | self | UseUseExplosion.rb:21:812:21:816 | self | | UseUseExplosion.rb:21:791:21:795 | self | UseUseExplosion.rb:21:3099:21:3104 | self | -| UseUseExplosion.rb:21:791:21:800 | ... > ... | UseUseExplosion.rb:21:790:21:801 | [false] ( ... ) | -| UseUseExplosion.rb:21:791:21:800 | ... > ... | UseUseExplosion.rb:21:790:21:801 | [true] ( ... ) | +| UseUseExplosion.rb:21:791:21:800 | ... > ... | UseUseExplosion.rb:21:790:21:801 | ( ... ) | | UseUseExplosion.rb:21:799:21:800 | 63 | UseUseExplosion.rb:21:791:21:800 | ... > ... | | UseUseExplosion.rb:21:803:21:3092 | then ... | UseUseExplosion.rb:21:787:21:3108 | if ... | | UseUseExplosion.rb:21:808:21:3092 | if ... | UseUseExplosion.rb:21:803:21:3092 | then ... | @@ -2089,8 +1952,7 @@ | UseUseExplosion.rb:21:812:21:816 | [post] self | UseUseExplosion.rb:21:3083:21:3088 | self | | UseUseExplosion.rb:21:812:21:816 | self | UseUseExplosion.rb:21:833:21:837 | self | | UseUseExplosion.rb:21:812:21:816 | self | UseUseExplosion.rb:21:3083:21:3088 | self | -| UseUseExplosion.rb:21:812:21:821 | ... > ... | UseUseExplosion.rb:21:811:21:822 | [false] ( ... ) | -| UseUseExplosion.rb:21:812:21:821 | ... > ... | UseUseExplosion.rb:21:811:21:822 | [true] ( ... ) | +| UseUseExplosion.rb:21:812:21:821 | ... > ... | UseUseExplosion.rb:21:811:21:822 | ( ... ) | | UseUseExplosion.rb:21:820:21:821 | 62 | UseUseExplosion.rb:21:812:21:821 | ... > ... | | UseUseExplosion.rb:21:824:21:3076 | then ... | UseUseExplosion.rb:21:808:21:3092 | if ... | | UseUseExplosion.rb:21:829:21:3076 | if ... | UseUseExplosion.rb:21:824:21:3076 | then ... | @@ -2099,8 +1961,7 @@ | UseUseExplosion.rb:21:833:21:837 | [post] self | UseUseExplosion.rb:21:3067:21:3072 | self | | UseUseExplosion.rb:21:833:21:837 | self | UseUseExplosion.rb:21:854:21:858 | self | | UseUseExplosion.rb:21:833:21:837 | self | UseUseExplosion.rb:21:3067:21:3072 | self | -| UseUseExplosion.rb:21:833:21:842 | ... > ... | UseUseExplosion.rb:21:832:21:843 | [false] ( ... ) | -| UseUseExplosion.rb:21:833:21:842 | ... > ... | UseUseExplosion.rb:21:832:21:843 | [true] ( ... ) | +| UseUseExplosion.rb:21:833:21:842 | ... > ... | UseUseExplosion.rb:21:832:21:843 | ( ... ) | | UseUseExplosion.rb:21:841:21:842 | 61 | UseUseExplosion.rb:21:833:21:842 | ... > ... | | UseUseExplosion.rb:21:845:21:3060 | then ... | UseUseExplosion.rb:21:829:21:3076 | if ... | | UseUseExplosion.rb:21:850:21:3060 | if ... | UseUseExplosion.rb:21:845:21:3060 | then ... | @@ -2109,8 +1970,7 @@ | UseUseExplosion.rb:21:854:21:858 | [post] self | UseUseExplosion.rb:21:3051:21:3056 | self | | UseUseExplosion.rb:21:854:21:858 | self | UseUseExplosion.rb:21:875:21:879 | self | | UseUseExplosion.rb:21:854:21:858 | self | UseUseExplosion.rb:21:3051:21:3056 | self | -| UseUseExplosion.rb:21:854:21:863 | ... > ... | UseUseExplosion.rb:21:853:21:864 | [false] ( ... ) | -| UseUseExplosion.rb:21:854:21:863 | ... > ... | UseUseExplosion.rb:21:853:21:864 | [true] ( ... ) | +| UseUseExplosion.rb:21:854:21:863 | ... > ... | UseUseExplosion.rb:21:853:21:864 | ( ... ) | | UseUseExplosion.rb:21:862:21:863 | 60 | UseUseExplosion.rb:21:854:21:863 | ... > ... | | UseUseExplosion.rb:21:866:21:3044 | then ... | UseUseExplosion.rb:21:850:21:3060 | if ... | | UseUseExplosion.rb:21:871:21:3044 | if ... | UseUseExplosion.rb:21:866:21:3044 | then ... | @@ -2119,8 +1979,7 @@ | UseUseExplosion.rb:21:875:21:879 | [post] self | UseUseExplosion.rb:21:3035:21:3040 | self | | UseUseExplosion.rb:21:875:21:879 | self | UseUseExplosion.rb:21:896:21:900 | self | | UseUseExplosion.rb:21:875:21:879 | self | UseUseExplosion.rb:21:3035:21:3040 | self | -| UseUseExplosion.rb:21:875:21:884 | ... > ... | UseUseExplosion.rb:21:874:21:885 | [false] ( ... ) | -| UseUseExplosion.rb:21:875:21:884 | ... > ... | UseUseExplosion.rb:21:874:21:885 | [true] ( ... ) | +| UseUseExplosion.rb:21:875:21:884 | ... > ... | UseUseExplosion.rb:21:874:21:885 | ( ... ) | | UseUseExplosion.rb:21:883:21:884 | 59 | UseUseExplosion.rb:21:875:21:884 | ... > ... | | UseUseExplosion.rb:21:887:21:3028 | then ... | UseUseExplosion.rb:21:871:21:3044 | if ... | | UseUseExplosion.rb:21:892:21:3028 | if ... | UseUseExplosion.rb:21:887:21:3028 | then ... | @@ -2129,8 +1988,7 @@ | UseUseExplosion.rb:21:896:21:900 | [post] self | UseUseExplosion.rb:21:3019:21:3024 | self | | UseUseExplosion.rb:21:896:21:900 | self | UseUseExplosion.rb:21:917:21:921 | self | | UseUseExplosion.rb:21:896:21:900 | self | UseUseExplosion.rb:21:3019:21:3024 | self | -| UseUseExplosion.rb:21:896:21:905 | ... > ... | UseUseExplosion.rb:21:895:21:906 | [false] ( ... ) | -| UseUseExplosion.rb:21:896:21:905 | ... > ... | UseUseExplosion.rb:21:895:21:906 | [true] ( ... ) | +| UseUseExplosion.rb:21:896:21:905 | ... > ... | UseUseExplosion.rb:21:895:21:906 | ( ... ) | | UseUseExplosion.rb:21:904:21:905 | 58 | UseUseExplosion.rb:21:896:21:905 | ... > ... | | UseUseExplosion.rb:21:908:21:3012 | then ... | UseUseExplosion.rb:21:892:21:3028 | if ... | | UseUseExplosion.rb:21:913:21:3012 | if ... | UseUseExplosion.rb:21:908:21:3012 | then ... | @@ -2139,8 +1997,7 @@ | UseUseExplosion.rb:21:917:21:921 | [post] self | UseUseExplosion.rb:21:3003:21:3008 | self | | UseUseExplosion.rb:21:917:21:921 | self | UseUseExplosion.rb:21:938:21:942 | self | | UseUseExplosion.rb:21:917:21:921 | self | UseUseExplosion.rb:21:3003:21:3008 | self | -| UseUseExplosion.rb:21:917:21:926 | ... > ... | UseUseExplosion.rb:21:916:21:927 | [false] ( ... ) | -| UseUseExplosion.rb:21:917:21:926 | ... > ... | UseUseExplosion.rb:21:916:21:927 | [true] ( ... ) | +| UseUseExplosion.rb:21:917:21:926 | ... > ... | UseUseExplosion.rb:21:916:21:927 | ( ... ) | | UseUseExplosion.rb:21:925:21:926 | 57 | UseUseExplosion.rb:21:917:21:926 | ... > ... | | UseUseExplosion.rb:21:929:21:2996 | then ... | UseUseExplosion.rb:21:913:21:3012 | if ... | | UseUseExplosion.rb:21:934:21:2996 | if ... | UseUseExplosion.rb:21:929:21:2996 | then ... | @@ -2149,8 +2006,7 @@ | UseUseExplosion.rb:21:938:21:942 | [post] self | UseUseExplosion.rb:21:2987:21:2992 | self | | UseUseExplosion.rb:21:938:21:942 | self | UseUseExplosion.rb:21:959:21:963 | self | | UseUseExplosion.rb:21:938:21:942 | self | UseUseExplosion.rb:21:2987:21:2992 | self | -| UseUseExplosion.rb:21:938:21:947 | ... > ... | UseUseExplosion.rb:21:937:21:948 | [false] ( ... ) | -| UseUseExplosion.rb:21:938:21:947 | ... > ... | UseUseExplosion.rb:21:937:21:948 | [true] ( ... ) | +| UseUseExplosion.rb:21:938:21:947 | ... > ... | UseUseExplosion.rb:21:937:21:948 | ( ... ) | | UseUseExplosion.rb:21:946:21:947 | 56 | UseUseExplosion.rb:21:938:21:947 | ... > ... | | UseUseExplosion.rb:21:950:21:2980 | then ... | UseUseExplosion.rb:21:934:21:2996 | if ... | | UseUseExplosion.rb:21:955:21:2980 | if ... | UseUseExplosion.rb:21:950:21:2980 | then ... | @@ -2159,8 +2015,7 @@ | UseUseExplosion.rb:21:959:21:963 | [post] self | UseUseExplosion.rb:21:2971:21:2976 | self | | UseUseExplosion.rb:21:959:21:963 | self | UseUseExplosion.rb:21:980:21:984 | self | | UseUseExplosion.rb:21:959:21:963 | self | UseUseExplosion.rb:21:2971:21:2976 | self | -| UseUseExplosion.rb:21:959:21:968 | ... > ... | UseUseExplosion.rb:21:958:21:969 | [false] ( ... ) | -| UseUseExplosion.rb:21:959:21:968 | ... > ... | UseUseExplosion.rb:21:958:21:969 | [true] ( ... ) | +| UseUseExplosion.rb:21:959:21:968 | ... > ... | UseUseExplosion.rb:21:958:21:969 | ( ... ) | | UseUseExplosion.rb:21:967:21:968 | 55 | UseUseExplosion.rb:21:959:21:968 | ... > ... | | UseUseExplosion.rb:21:971:21:2964 | then ... | UseUseExplosion.rb:21:955:21:2980 | if ... | | UseUseExplosion.rb:21:976:21:2964 | if ... | UseUseExplosion.rb:21:971:21:2964 | then ... | @@ -2169,8 +2024,7 @@ | UseUseExplosion.rb:21:980:21:984 | [post] self | UseUseExplosion.rb:21:2955:21:2960 | self | | UseUseExplosion.rb:21:980:21:984 | self | UseUseExplosion.rb:21:1001:21:1005 | self | | UseUseExplosion.rb:21:980:21:984 | self | UseUseExplosion.rb:21:2955:21:2960 | self | -| UseUseExplosion.rb:21:980:21:989 | ... > ... | UseUseExplosion.rb:21:979:21:990 | [false] ( ... ) | -| UseUseExplosion.rb:21:980:21:989 | ... > ... | UseUseExplosion.rb:21:979:21:990 | [true] ( ... ) | +| UseUseExplosion.rb:21:980:21:989 | ... > ... | UseUseExplosion.rb:21:979:21:990 | ( ... ) | | UseUseExplosion.rb:21:988:21:989 | 54 | UseUseExplosion.rb:21:980:21:989 | ... > ... | | UseUseExplosion.rb:21:992:21:2948 | then ... | UseUseExplosion.rb:21:976:21:2964 | if ... | | UseUseExplosion.rb:21:997:21:2948 | if ... | UseUseExplosion.rb:21:992:21:2948 | then ... | @@ -2179,8 +2033,7 @@ | UseUseExplosion.rb:21:1001:21:1005 | [post] self | UseUseExplosion.rb:21:2939:21:2944 | self | | UseUseExplosion.rb:21:1001:21:1005 | self | UseUseExplosion.rb:21:1022:21:1026 | self | | UseUseExplosion.rb:21:1001:21:1005 | self | UseUseExplosion.rb:21:2939:21:2944 | self | -| UseUseExplosion.rb:21:1001:21:1010 | ... > ... | UseUseExplosion.rb:21:1000:21:1011 | [false] ( ... ) | -| UseUseExplosion.rb:21:1001:21:1010 | ... > ... | UseUseExplosion.rb:21:1000:21:1011 | [true] ( ... ) | +| UseUseExplosion.rb:21:1001:21:1010 | ... > ... | UseUseExplosion.rb:21:1000:21:1011 | ( ... ) | | UseUseExplosion.rb:21:1009:21:1010 | 53 | UseUseExplosion.rb:21:1001:21:1010 | ... > ... | | UseUseExplosion.rb:21:1013:21:2932 | then ... | UseUseExplosion.rb:21:997:21:2948 | if ... | | UseUseExplosion.rb:21:1018:21:2932 | if ... | UseUseExplosion.rb:21:1013:21:2932 | then ... | @@ -2189,8 +2042,7 @@ | UseUseExplosion.rb:21:1022:21:1026 | [post] self | UseUseExplosion.rb:21:2923:21:2928 | self | | UseUseExplosion.rb:21:1022:21:1026 | self | UseUseExplosion.rb:21:1043:21:1047 | self | | UseUseExplosion.rb:21:1022:21:1026 | self | UseUseExplosion.rb:21:2923:21:2928 | self | -| UseUseExplosion.rb:21:1022:21:1031 | ... > ... | UseUseExplosion.rb:21:1021:21:1032 | [false] ( ... ) | -| UseUseExplosion.rb:21:1022:21:1031 | ... > ... | UseUseExplosion.rb:21:1021:21:1032 | [true] ( ... ) | +| UseUseExplosion.rb:21:1022:21:1031 | ... > ... | UseUseExplosion.rb:21:1021:21:1032 | ( ... ) | | UseUseExplosion.rb:21:1030:21:1031 | 52 | UseUseExplosion.rb:21:1022:21:1031 | ... > ... | | UseUseExplosion.rb:21:1034:21:2916 | then ... | UseUseExplosion.rb:21:1018:21:2932 | if ... | | UseUseExplosion.rb:21:1039:21:2916 | if ... | UseUseExplosion.rb:21:1034:21:2916 | then ... | @@ -2199,8 +2051,7 @@ | UseUseExplosion.rb:21:1043:21:1047 | [post] self | UseUseExplosion.rb:21:2907:21:2912 | self | | UseUseExplosion.rb:21:1043:21:1047 | self | UseUseExplosion.rb:21:1064:21:1068 | self | | UseUseExplosion.rb:21:1043:21:1047 | self | UseUseExplosion.rb:21:2907:21:2912 | self | -| UseUseExplosion.rb:21:1043:21:1052 | ... > ... | UseUseExplosion.rb:21:1042:21:1053 | [false] ( ... ) | -| UseUseExplosion.rb:21:1043:21:1052 | ... > ... | UseUseExplosion.rb:21:1042:21:1053 | [true] ( ... ) | +| UseUseExplosion.rb:21:1043:21:1052 | ... > ... | UseUseExplosion.rb:21:1042:21:1053 | ( ... ) | | UseUseExplosion.rb:21:1051:21:1052 | 51 | UseUseExplosion.rb:21:1043:21:1052 | ... > ... | | UseUseExplosion.rb:21:1055:21:2900 | then ... | UseUseExplosion.rb:21:1039:21:2916 | if ... | | UseUseExplosion.rb:21:1060:21:2900 | if ... | UseUseExplosion.rb:21:1055:21:2900 | then ... | @@ -2209,8 +2060,7 @@ | UseUseExplosion.rb:21:1064:21:1068 | [post] self | UseUseExplosion.rb:21:2891:21:2896 | self | | UseUseExplosion.rb:21:1064:21:1068 | self | UseUseExplosion.rb:21:1085:21:1089 | self | | UseUseExplosion.rb:21:1064:21:1068 | self | UseUseExplosion.rb:21:2891:21:2896 | self | -| UseUseExplosion.rb:21:1064:21:1073 | ... > ... | UseUseExplosion.rb:21:1063:21:1074 | [false] ( ... ) | -| UseUseExplosion.rb:21:1064:21:1073 | ... > ... | UseUseExplosion.rb:21:1063:21:1074 | [true] ( ... ) | +| UseUseExplosion.rb:21:1064:21:1073 | ... > ... | UseUseExplosion.rb:21:1063:21:1074 | ( ... ) | | UseUseExplosion.rb:21:1072:21:1073 | 50 | UseUseExplosion.rb:21:1064:21:1073 | ... > ... | | UseUseExplosion.rb:21:1076:21:2884 | then ... | UseUseExplosion.rb:21:1060:21:2900 | if ... | | UseUseExplosion.rb:21:1081:21:2884 | if ... | UseUseExplosion.rb:21:1076:21:2884 | then ... | @@ -2219,8 +2069,7 @@ | UseUseExplosion.rb:21:1085:21:1089 | [post] self | UseUseExplosion.rb:21:2875:21:2880 | self | | UseUseExplosion.rb:21:1085:21:1089 | self | UseUseExplosion.rb:21:1106:21:1110 | self | | UseUseExplosion.rb:21:1085:21:1089 | self | UseUseExplosion.rb:21:2875:21:2880 | self | -| UseUseExplosion.rb:21:1085:21:1094 | ... > ... | UseUseExplosion.rb:21:1084:21:1095 | [false] ( ... ) | -| UseUseExplosion.rb:21:1085:21:1094 | ... > ... | UseUseExplosion.rb:21:1084:21:1095 | [true] ( ... ) | +| UseUseExplosion.rb:21:1085:21:1094 | ... > ... | UseUseExplosion.rb:21:1084:21:1095 | ( ... ) | | UseUseExplosion.rb:21:1093:21:1094 | 49 | UseUseExplosion.rb:21:1085:21:1094 | ... > ... | | UseUseExplosion.rb:21:1097:21:2868 | then ... | UseUseExplosion.rb:21:1081:21:2884 | if ... | | UseUseExplosion.rb:21:1102:21:2868 | if ... | UseUseExplosion.rb:21:1097:21:2868 | then ... | @@ -2229,8 +2078,7 @@ | UseUseExplosion.rb:21:1106:21:1110 | [post] self | UseUseExplosion.rb:21:2859:21:2864 | self | | UseUseExplosion.rb:21:1106:21:1110 | self | UseUseExplosion.rb:21:1127:21:1131 | self | | UseUseExplosion.rb:21:1106:21:1110 | self | UseUseExplosion.rb:21:2859:21:2864 | self | -| UseUseExplosion.rb:21:1106:21:1115 | ... > ... | UseUseExplosion.rb:21:1105:21:1116 | [false] ( ... ) | -| UseUseExplosion.rb:21:1106:21:1115 | ... > ... | UseUseExplosion.rb:21:1105:21:1116 | [true] ( ... ) | +| UseUseExplosion.rb:21:1106:21:1115 | ... > ... | UseUseExplosion.rb:21:1105:21:1116 | ( ... ) | | UseUseExplosion.rb:21:1114:21:1115 | 48 | UseUseExplosion.rb:21:1106:21:1115 | ... > ... | | UseUseExplosion.rb:21:1118:21:2852 | then ... | UseUseExplosion.rb:21:1102:21:2868 | if ... | | UseUseExplosion.rb:21:1123:21:2852 | if ... | UseUseExplosion.rb:21:1118:21:2852 | then ... | @@ -2239,8 +2087,7 @@ | UseUseExplosion.rb:21:1127:21:1131 | [post] self | UseUseExplosion.rb:21:2843:21:2848 | self | | UseUseExplosion.rb:21:1127:21:1131 | self | UseUseExplosion.rb:21:1148:21:1152 | self | | UseUseExplosion.rb:21:1127:21:1131 | self | UseUseExplosion.rb:21:2843:21:2848 | self | -| UseUseExplosion.rb:21:1127:21:1136 | ... > ... | UseUseExplosion.rb:21:1126:21:1137 | [false] ( ... ) | -| UseUseExplosion.rb:21:1127:21:1136 | ... > ... | UseUseExplosion.rb:21:1126:21:1137 | [true] ( ... ) | +| UseUseExplosion.rb:21:1127:21:1136 | ... > ... | UseUseExplosion.rb:21:1126:21:1137 | ( ... ) | | UseUseExplosion.rb:21:1135:21:1136 | 47 | UseUseExplosion.rb:21:1127:21:1136 | ... > ... | | UseUseExplosion.rb:21:1139:21:2836 | then ... | UseUseExplosion.rb:21:1123:21:2852 | if ... | | UseUseExplosion.rb:21:1144:21:2836 | if ... | UseUseExplosion.rb:21:1139:21:2836 | then ... | @@ -2249,8 +2096,7 @@ | UseUseExplosion.rb:21:1148:21:1152 | [post] self | UseUseExplosion.rb:21:2827:21:2832 | self | | UseUseExplosion.rb:21:1148:21:1152 | self | UseUseExplosion.rb:21:1169:21:1173 | self | | UseUseExplosion.rb:21:1148:21:1152 | self | UseUseExplosion.rb:21:2827:21:2832 | self | -| UseUseExplosion.rb:21:1148:21:1157 | ... > ... | UseUseExplosion.rb:21:1147:21:1158 | [false] ( ... ) | -| UseUseExplosion.rb:21:1148:21:1157 | ... > ... | UseUseExplosion.rb:21:1147:21:1158 | [true] ( ... ) | +| UseUseExplosion.rb:21:1148:21:1157 | ... > ... | UseUseExplosion.rb:21:1147:21:1158 | ( ... ) | | UseUseExplosion.rb:21:1156:21:1157 | 46 | UseUseExplosion.rb:21:1148:21:1157 | ... > ... | | UseUseExplosion.rb:21:1160:21:2820 | then ... | UseUseExplosion.rb:21:1144:21:2836 | if ... | | UseUseExplosion.rb:21:1165:21:2820 | if ... | UseUseExplosion.rb:21:1160:21:2820 | then ... | @@ -2259,8 +2105,7 @@ | UseUseExplosion.rb:21:1169:21:1173 | [post] self | UseUseExplosion.rb:21:2811:21:2816 | self | | UseUseExplosion.rb:21:1169:21:1173 | self | UseUseExplosion.rb:21:1190:21:1194 | self | | UseUseExplosion.rb:21:1169:21:1173 | self | UseUseExplosion.rb:21:2811:21:2816 | self | -| UseUseExplosion.rb:21:1169:21:1178 | ... > ... | UseUseExplosion.rb:21:1168:21:1179 | [false] ( ... ) | -| UseUseExplosion.rb:21:1169:21:1178 | ... > ... | UseUseExplosion.rb:21:1168:21:1179 | [true] ( ... ) | +| UseUseExplosion.rb:21:1169:21:1178 | ... > ... | UseUseExplosion.rb:21:1168:21:1179 | ( ... ) | | UseUseExplosion.rb:21:1177:21:1178 | 45 | UseUseExplosion.rb:21:1169:21:1178 | ... > ... | | UseUseExplosion.rb:21:1181:21:2804 | then ... | UseUseExplosion.rb:21:1165:21:2820 | if ... | | UseUseExplosion.rb:21:1186:21:2804 | if ... | UseUseExplosion.rb:21:1181:21:2804 | then ... | @@ -2269,8 +2114,7 @@ | UseUseExplosion.rb:21:1190:21:1194 | [post] self | UseUseExplosion.rb:21:2795:21:2800 | self | | UseUseExplosion.rb:21:1190:21:1194 | self | UseUseExplosion.rb:21:1211:21:1215 | self | | UseUseExplosion.rb:21:1190:21:1194 | self | UseUseExplosion.rb:21:2795:21:2800 | self | -| UseUseExplosion.rb:21:1190:21:1199 | ... > ... | UseUseExplosion.rb:21:1189:21:1200 | [false] ( ... ) | -| UseUseExplosion.rb:21:1190:21:1199 | ... > ... | UseUseExplosion.rb:21:1189:21:1200 | [true] ( ... ) | +| UseUseExplosion.rb:21:1190:21:1199 | ... > ... | UseUseExplosion.rb:21:1189:21:1200 | ( ... ) | | UseUseExplosion.rb:21:1198:21:1199 | 44 | UseUseExplosion.rb:21:1190:21:1199 | ... > ... | | UseUseExplosion.rb:21:1202:21:2788 | then ... | UseUseExplosion.rb:21:1186:21:2804 | if ... | | UseUseExplosion.rb:21:1207:21:2788 | if ... | UseUseExplosion.rb:21:1202:21:2788 | then ... | @@ -2279,8 +2123,7 @@ | UseUseExplosion.rb:21:1211:21:1215 | [post] self | UseUseExplosion.rb:21:2779:21:2784 | self | | UseUseExplosion.rb:21:1211:21:1215 | self | UseUseExplosion.rb:21:1232:21:1236 | self | | UseUseExplosion.rb:21:1211:21:1215 | self | UseUseExplosion.rb:21:2779:21:2784 | self | -| UseUseExplosion.rb:21:1211:21:1220 | ... > ... | UseUseExplosion.rb:21:1210:21:1221 | [false] ( ... ) | -| UseUseExplosion.rb:21:1211:21:1220 | ... > ... | UseUseExplosion.rb:21:1210:21:1221 | [true] ( ... ) | +| UseUseExplosion.rb:21:1211:21:1220 | ... > ... | UseUseExplosion.rb:21:1210:21:1221 | ( ... ) | | UseUseExplosion.rb:21:1219:21:1220 | 43 | UseUseExplosion.rb:21:1211:21:1220 | ... > ... | | UseUseExplosion.rb:21:1223:21:2772 | then ... | UseUseExplosion.rb:21:1207:21:2788 | if ... | | UseUseExplosion.rb:21:1228:21:2772 | if ... | UseUseExplosion.rb:21:1223:21:2772 | then ... | @@ -2289,8 +2132,7 @@ | UseUseExplosion.rb:21:1232:21:1236 | [post] self | UseUseExplosion.rb:21:2763:21:2768 | self | | UseUseExplosion.rb:21:1232:21:1236 | self | UseUseExplosion.rb:21:1253:21:1257 | self | | UseUseExplosion.rb:21:1232:21:1236 | self | UseUseExplosion.rb:21:2763:21:2768 | self | -| UseUseExplosion.rb:21:1232:21:1241 | ... > ... | UseUseExplosion.rb:21:1231:21:1242 | [false] ( ... ) | -| UseUseExplosion.rb:21:1232:21:1241 | ... > ... | UseUseExplosion.rb:21:1231:21:1242 | [true] ( ... ) | +| UseUseExplosion.rb:21:1232:21:1241 | ... > ... | UseUseExplosion.rb:21:1231:21:1242 | ( ... ) | | UseUseExplosion.rb:21:1240:21:1241 | 42 | UseUseExplosion.rb:21:1232:21:1241 | ... > ... | | UseUseExplosion.rb:21:1244:21:2756 | then ... | UseUseExplosion.rb:21:1228:21:2772 | if ... | | UseUseExplosion.rb:21:1249:21:2756 | if ... | UseUseExplosion.rb:21:1244:21:2756 | then ... | @@ -2299,8 +2141,7 @@ | UseUseExplosion.rb:21:1253:21:1257 | [post] self | UseUseExplosion.rb:21:2747:21:2752 | self | | UseUseExplosion.rb:21:1253:21:1257 | self | UseUseExplosion.rb:21:1274:21:1278 | self | | UseUseExplosion.rb:21:1253:21:1257 | self | UseUseExplosion.rb:21:2747:21:2752 | self | -| UseUseExplosion.rb:21:1253:21:1262 | ... > ... | UseUseExplosion.rb:21:1252:21:1263 | [false] ( ... ) | -| UseUseExplosion.rb:21:1253:21:1262 | ... > ... | UseUseExplosion.rb:21:1252:21:1263 | [true] ( ... ) | +| UseUseExplosion.rb:21:1253:21:1262 | ... > ... | UseUseExplosion.rb:21:1252:21:1263 | ( ... ) | | UseUseExplosion.rb:21:1261:21:1262 | 41 | UseUseExplosion.rb:21:1253:21:1262 | ... > ... | | UseUseExplosion.rb:21:1265:21:2740 | then ... | UseUseExplosion.rb:21:1249:21:2756 | if ... | | UseUseExplosion.rb:21:1270:21:2740 | if ... | UseUseExplosion.rb:21:1265:21:2740 | then ... | @@ -2309,8 +2150,7 @@ | UseUseExplosion.rb:21:1274:21:1278 | [post] self | UseUseExplosion.rb:21:2731:21:2736 | self | | UseUseExplosion.rb:21:1274:21:1278 | self | UseUseExplosion.rb:21:1295:21:1299 | self | | UseUseExplosion.rb:21:1274:21:1278 | self | UseUseExplosion.rb:21:2731:21:2736 | self | -| UseUseExplosion.rb:21:1274:21:1283 | ... > ... | UseUseExplosion.rb:21:1273:21:1284 | [false] ( ... ) | -| UseUseExplosion.rb:21:1274:21:1283 | ... > ... | UseUseExplosion.rb:21:1273:21:1284 | [true] ( ... ) | +| UseUseExplosion.rb:21:1274:21:1283 | ... > ... | UseUseExplosion.rb:21:1273:21:1284 | ( ... ) | | UseUseExplosion.rb:21:1282:21:1283 | 40 | UseUseExplosion.rb:21:1274:21:1283 | ... > ... | | UseUseExplosion.rb:21:1286:21:2724 | then ... | UseUseExplosion.rb:21:1270:21:2740 | if ... | | UseUseExplosion.rb:21:1291:21:2724 | if ... | UseUseExplosion.rb:21:1286:21:2724 | then ... | @@ -2319,8 +2159,7 @@ | UseUseExplosion.rb:21:1295:21:1299 | [post] self | UseUseExplosion.rb:21:2715:21:2720 | self | | UseUseExplosion.rb:21:1295:21:1299 | self | UseUseExplosion.rb:21:1316:21:1320 | self | | UseUseExplosion.rb:21:1295:21:1299 | self | UseUseExplosion.rb:21:2715:21:2720 | self | -| UseUseExplosion.rb:21:1295:21:1304 | ... > ... | UseUseExplosion.rb:21:1294:21:1305 | [false] ( ... ) | -| UseUseExplosion.rb:21:1295:21:1304 | ... > ... | UseUseExplosion.rb:21:1294:21:1305 | [true] ( ... ) | +| UseUseExplosion.rb:21:1295:21:1304 | ... > ... | UseUseExplosion.rb:21:1294:21:1305 | ( ... ) | | UseUseExplosion.rb:21:1303:21:1304 | 39 | UseUseExplosion.rb:21:1295:21:1304 | ... > ... | | UseUseExplosion.rb:21:1307:21:2708 | then ... | UseUseExplosion.rb:21:1291:21:2724 | if ... | | UseUseExplosion.rb:21:1312:21:2708 | if ... | UseUseExplosion.rb:21:1307:21:2708 | then ... | @@ -2329,8 +2168,7 @@ | UseUseExplosion.rb:21:1316:21:1320 | [post] self | UseUseExplosion.rb:21:2699:21:2704 | self | | UseUseExplosion.rb:21:1316:21:1320 | self | UseUseExplosion.rb:21:1337:21:1341 | self | | UseUseExplosion.rb:21:1316:21:1320 | self | UseUseExplosion.rb:21:2699:21:2704 | self | -| UseUseExplosion.rb:21:1316:21:1325 | ... > ... | UseUseExplosion.rb:21:1315:21:1326 | [false] ( ... ) | -| UseUseExplosion.rb:21:1316:21:1325 | ... > ... | UseUseExplosion.rb:21:1315:21:1326 | [true] ( ... ) | +| UseUseExplosion.rb:21:1316:21:1325 | ... > ... | UseUseExplosion.rb:21:1315:21:1326 | ( ... ) | | UseUseExplosion.rb:21:1324:21:1325 | 38 | UseUseExplosion.rb:21:1316:21:1325 | ... > ... | | UseUseExplosion.rb:21:1328:21:2692 | then ... | UseUseExplosion.rb:21:1312:21:2708 | if ... | | UseUseExplosion.rb:21:1333:21:2692 | if ... | UseUseExplosion.rb:21:1328:21:2692 | then ... | @@ -2339,8 +2177,7 @@ | UseUseExplosion.rb:21:1337:21:1341 | [post] self | UseUseExplosion.rb:21:2683:21:2688 | self | | UseUseExplosion.rb:21:1337:21:1341 | self | UseUseExplosion.rb:21:1358:21:1362 | self | | UseUseExplosion.rb:21:1337:21:1341 | self | UseUseExplosion.rb:21:2683:21:2688 | self | -| UseUseExplosion.rb:21:1337:21:1346 | ... > ... | UseUseExplosion.rb:21:1336:21:1347 | [false] ( ... ) | -| UseUseExplosion.rb:21:1337:21:1346 | ... > ... | UseUseExplosion.rb:21:1336:21:1347 | [true] ( ... ) | +| UseUseExplosion.rb:21:1337:21:1346 | ... > ... | UseUseExplosion.rb:21:1336:21:1347 | ( ... ) | | UseUseExplosion.rb:21:1345:21:1346 | 37 | UseUseExplosion.rb:21:1337:21:1346 | ... > ... | | UseUseExplosion.rb:21:1349:21:2676 | then ... | UseUseExplosion.rb:21:1333:21:2692 | if ... | | UseUseExplosion.rb:21:1354:21:2676 | if ... | UseUseExplosion.rb:21:1349:21:2676 | then ... | @@ -2349,8 +2186,7 @@ | UseUseExplosion.rb:21:1358:21:1362 | [post] self | UseUseExplosion.rb:21:2667:21:2672 | self | | UseUseExplosion.rb:21:1358:21:1362 | self | UseUseExplosion.rb:21:1379:21:1383 | self | | UseUseExplosion.rb:21:1358:21:1362 | self | UseUseExplosion.rb:21:2667:21:2672 | self | -| UseUseExplosion.rb:21:1358:21:1367 | ... > ... | UseUseExplosion.rb:21:1357:21:1368 | [false] ( ... ) | -| UseUseExplosion.rb:21:1358:21:1367 | ... > ... | UseUseExplosion.rb:21:1357:21:1368 | [true] ( ... ) | +| UseUseExplosion.rb:21:1358:21:1367 | ... > ... | UseUseExplosion.rb:21:1357:21:1368 | ( ... ) | | UseUseExplosion.rb:21:1366:21:1367 | 36 | UseUseExplosion.rb:21:1358:21:1367 | ... > ... | | UseUseExplosion.rb:21:1370:21:2660 | then ... | UseUseExplosion.rb:21:1354:21:2676 | if ... | | UseUseExplosion.rb:21:1375:21:2660 | if ... | UseUseExplosion.rb:21:1370:21:2660 | then ... | @@ -2359,8 +2195,7 @@ | UseUseExplosion.rb:21:1379:21:1383 | [post] self | UseUseExplosion.rb:21:2651:21:2656 | self | | UseUseExplosion.rb:21:1379:21:1383 | self | UseUseExplosion.rb:21:1400:21:1404 | self | | UseUseExplosion.rb:21:1379:21:1383 | self | UseUseExplosion.rb:21:2651:21:2656 | self | -| UseUseExplosion.rb:21:1379:21:1388 | ... > ... | UseUseExplosion.rb:21:1378:21:1389 | [false] ( ... ) | -| UseUseExplosion.rb:21:1379:21:1388 | ... > ... | UseUseExplosion.rb:21:1378:21:1389 | [true] ( ... ) | +| UseUseExplosion.rb:21:1379:21:1388 | ... > ... | UseUseExplosion.rb:21:1378:21:1389 | ( ... ) | | UseUseExplosion.rb:21:1387:21:1388 | 35 | UseUseExplosion.rb:21:1379:21:1388 | ... > ... | | UseUseExplosion.rb:21:1391:21:2644 | then ... | UseUseExplosion.rb:21:1375:21:2660 | if ... | | UseUseExplosion.rb:21:1396:21:2644 | if ... | UseUseExplosion.rb:21:1391:21:2644 | then ... | @@ -2369,8 +2204,7 @@ | UseUseExplosion.rb:21:1400:21:1404 | [post] self | UseUseExplosion.rb:21:2635:21:2640 | self | | UseUseExplosion.rb:21:1400:21:1404 | self | UseUseExplosion.rb:21:1421:21:1425 | self | | UseUseExplosion.rb:21:1400:21:1404 | self | UseUseExplosion.rb:21:2635:21:2640 | self | -| UseUseExplosion.rb:21:1400:21:1409 | ... > ... | UseUseExplosion.rb:21:1399:21:1410 | [false] ( ... ) | -| UseUseExplosion.rb:21:1400:21:1409 | ... > ... | UseUseExplosion.rb:21:1399:21:1410 | [true] ( ... ) | +| UseUseExplosion.rb:21:1400:21:1409 | ... > ... | UseUseExplosion.rb:21:1399:21:1410 | ( ... ) | | UseUseExplosion.rb:21:1408:21:1409 | 34 | UseUseExplosion.rb:21:1400:21:1409 | ... > ... | | UseUseExplosion.rb:21:1412:21:2628 | then ... | UseUseExplosion.rb:21:1396:21:2644 | if ... | | UseUseExplosion.rb:21:1417:21:2628 | if ... | UseUseExplosion.rb:21:1412:21:2628 | then ... | @@ -2379,8 +2213,7 @@ | UseUseExplosion.rb:21:1421:21:1425 | [post] self | UseUseExplosion.rb:21:2619:21:2624 | self | | UseUseExplosion.rb:21:1421:21:1425 | self | UseUseExplosion.rb:21:1442:21:1446 | self | | UseUseExplosion.rb:21:1421:21:1425 | self | UseUseExplosion.rb:21:2619:21:2624 | self | -| UseUseExplosion.rb:21:1421:21:1430 | ... > ... | UseUseExplosion.rb:21:1420:21:1431 | [false] ( ... ) | -| UseUseExplosion.rb:21:1421:21:1430 | ... > ... | UseUseExplosion.rb:21:1420:21:1431 | [true] ( ... ) | +| UseUseExplosion.rb:21:1421:21:1430 | ... > ... | UseUseExplosion.rb:21:1420:21:1431 | ( ... ) | | UseUseExplosion.rb:21:1429:21:1430 | 33 | UseUseExplosion.rb:21:1421:21:1430 | ... > ... | | UseUseExplosion.rb:21:1433:21:2612 | then ... | UseUseExplosion.rb:21:1417:21:2628 | if ... | | UseUseExplosion.rb:21:1438:21:2612 | if ... | UseUseExplosion.rb:21:1433:21:2612 | then ... | @@ -2389,8 +2222,7 @@ | UseUseExplosion.rb:21:1442:21:1446 | [post] self | UseUseExplosion.rb:21:2603:21:2608 | self | | UseUseExplosion.rb:21:1442:21:1446 | self | UseUseExplosion.rb:21:1463:21:1467 | self | | UseUseExplosion.rb:21:1442:21:1446 | self | UseUseExplosion.rb:21:2603:21:2608 | self | -| UseUseExplosion.rb:21:1442:21:1451 | ... > ... | UseUseExplosion.rb:21:1441:21:1452 | [false] ( ... ) | -| UseUseExplosion.rb:21:1442:21:1451 | ... > ... | UseUseExplosion.rb:21:1441:21:1452 | [true] ( ... ) | +| UseUseExplosion.rb:21:1442:21:1451 | ... > ... | UseUseExplosion.rb:21:1441:21:1452 | ( ... ) | | UseUseExplosion.rb:21:1450:21:1451 | 32 | UseUseExplosion.rb:21:1442:21:1451 | ... > ... | | UseUseExplosion.rb:21:1454:21:2596 | then ... | UseUseExplosion.rb:21:1438:21:2612 | if ... | | UseUseExplosion.rb:21:1459:21:2596 | if ... | UseUseExplosion.rb:21:1454:21:2596 | then ... | @@ -2399,8 +2231,7 @@ | UseUseExplosion.rb:21:1463:21:1467 | [post] self | UseUseExplosion.rb:21:2587:21:2592 | self | | UseUseExplosion.rb:21:1463:21:1467 | self | UseUseExplosion.rb:21:1484:21:1488 | self | | UseUseExplosion.rb:21:1463:21:1467 | self | UseUseExplosion.rb:21:2587:21:2592 | self | -| UseUseExplosion.rb:21:1463:21:1472 | ... > ... | UseUseExplosion.rb:21:1462:21:1473 | [false] ( ... ) | -| UseUseExplosion.rb:21:1463:21:1472 | ... > ... | UseUseExplosion.rb:21:1462:21:1473 | [true] ( ... ) | +| UseUseExplosion.rb:21:1463:21:1472 | ... > ... | UseUseExplosion.rb:21:1462:21:1473 | ( ... ) | | UseUseExplosion.rb:21:1471:21:1472 | 31 | UseUseExplosion.rb:21:1463:21:1472 | ... > ... | | UseUseExplosion.rb:21:1475:21:2580 | then ... | UseUseExplosion.rb:21:1459:21:2596 | if ... | | UseUseExplosion.rb:21:1480:21:2580 | if ... | UseUseExplosion.rb:21:1475:21:2580 | then ... | @@ -2409,8 +2240,7 @@ | UseUseExplosion.rb:21:1484:21:1488 | [post] self | UseUseExplosion.rb:21:2571:21:2576 | self | | UseUseExplosion.rb:21:1484:21:1488 | self | UseUseExplosion.rb:21:1505:21:1509 | self | | UseUseExplosion.rb:21:1484:21:1488 | self | UseUseExplosion.rb:21:2571:21:2576 | self | -| UseUseExplosion.rb:21:1484:21:1493 | ... > ... | UseUseExplosion.rb:21:1483:21:1494 | [false] ( ... ) | -| UseUseExplosion.rb:21:1484:21:1493 | ... > ... | UseUseExplosion.rb:21:1483:21:1494 | [true] ( ... ) | +| UseUseExplosion.rb:21:1484:21:1493 | ... > ... | UseUseExplosion.rb:21:1483:21:1494 | ( ... ) | | UseUseExplosion.rb:21:1492:21:1493 | 30 | UseUseExplosion.rb:21:1484:21:1493 | ... > ... | | UseUseExplosion.rb:21:1496:21:2564 | then ... | UseUseExplosion.rb:21:1480:21:2580 | if ... | | UseUseExplosion.rb:21:1501:21:2564 | if ... | UseUseExplosion.rb:21:1496:21:2564 | then ... | @@ -2419,8 +2249,7 @@ | UseUseExplosion.rb:21:1505:21:1509 | [post] self | UseUseExplosion.rb:21:2555:21:2560 | self | | UseUseExplosion.rb:21:1505:21:1509 | self | UseUseExplosion.rb:21:1526:21:1530 | self | | UseUseExplosion.rb:21:1505:21:1509 | self | UseUseExplosion.rb:21:2555:21:2560 | self | -| UseUseExplosion.rb:21:1505:21:1514 | ... > ... | UseUseExplosion.rb:21:1504:21:1515 | [false] ( ... ) | -| UseUseExplosion.rb:21:1505:21:1514 | ... > ... | UseUseExplosion.rb:21:1504:21:1515 | [true] ( ... ) | +| UseUseExplosion.rb:21:1505:21:1514 | ... > ... | UseUseExplosion.rb:21:1504:21:1515 | ( ... ) | | UseUseExplosion.rb:21:1513:21:1514 | 29 | UseUseExplosion.rb:21:1505:21:1514 | ... > ... | | UseUseExplosion.rb:21:1517:21:2548 | then ... | UseUseExplosion.rb:21:1501:21:2564 | if ... | | UseUseExplosion.rb:21:1522:21:2548 | if ... | UseUseExplosion.rb:21:1517:21:2548 | then ... | @@ -2429,8 +2258,7 @@ | UseUseExplosion.rb:21:1526:21:1530 | [post] self | UseUseExplosion.rb:21:2539:21:2544 | self | | UseUseExplosion.rb:21:1526:21:1530 | self | UseUseExplosion.rb:21:1547:21:1551 | self | | UseUseExplosion.rb:21:1526:21:1530 | self | UseUseExplosion.rb:21:2539:21:2544 | self | -| UseUseExplosion.rb:21:1526:21:1535 | ... > ... | UseUseExplosion.rb:21:1525:21:1536 | [false] ( ... ) | -| UseUseExplosion.rb:21:1526:21:1535 | ... > ... | UseUseExplosion.rb:21:1525:21:1536 | [true] ( ... ) | +| UseUseExplosion.rb:21:1526:21:1535 | ... > ... | UseUseExplosion.rb:21:1525:21:1536 | ( ... ) | | UseUseExplosion.rb:21:1534:21:1535 | 28 | UseUseExplosion.rb:21:1526:21:1535 | ... > ... | | UseUseExplosion.rb:21:1538:21:2532 | then ... | UseUseExplosion.rb:21:1522:21:2548 | if ... | | UseUseExplosion.rb:21:1543:21:2532 | if ... | UseUseExplosion.rb:21:1538:21:2532 | then ... | @@ -2439,8 +2267,7 @@ | UseUseExplosion.rb:21:1547:21:1551 | [post] self | UseUseExplosion.rb:21:2523:21:2528 | self | | UseUseExplosion.rb:21:1547:21:1551 | self | UseUseExplosion.rb:21:1568:21:1572 | self | | UseUseExplosion.rb:21:1547:21:1551 | self | UseUseExplosion.rb:21:2523:21:2528 | self | -| UseUseExplosion.rb:21:1547:21:1556 | ... > ... | UseUseExplosion.rb:21:1546:21:1557 | [false] ( ... ) | -| UseUseExplosion.rb:21:1547:21:1556 | ... > ... | UseUseExplosion.rb:21:1546:21:1557 | [true] ( ... ) | +| UseUseExplosion.rb:21:1547:21:1556 | ... > ... | UseUseExplosion.rb:21:1546:21:1557 | ( ... ) | | UseUseExplosion.rb:21:1555:21:1556 | 27 | UseUseExplosion.rb:21:1547:21:1556 | ... > ... | | UseUseExplosion.rb:21:1559:21:2516 | then ... | UseUseExplosion.rb:21:1543:21:2532 | if ... | | UseUseExplosion.rb:21:1564:21:2516 | if ... | UseUseExplosion.rb:21:1559:21:2516 | then ... | @@ -2449,8 +2276,7 @@ | UseUseExplosion.rb:21:1568:21:1572 | [post] self | UseUseExplosion.rb:21:2507:21:2512 | self | | UseUseExplosion.rb:21:1568:21:1572 | self | UseUseExplosion.rb:21:1589:21:1593 | self | | UseUseExplosion.rb:21:1568:21:1572 | self | UseUseExplosion.rb:21:2507:21:2512 | self | -| UseUseExplosion.rb:21:1568:21:1577 | ... > ... | UseUseExplosion.rb:21:1567:21:1578 | [false] ( ... ) | -| UseUseExplosion.rb:21:1568:21:1577 | ... > ... | UseUseExplosion.rb:21:1567:21:1578 | [true] ( ... ) | +| UseUseExplosion.rb:21:1568:21:1577 | ... > ... | UseUseExplosion.rb:21:1567:21:1578 | ( ... ) | | UseUseExplosion.rb:21:1576:21:1577 | 26 | UseUseExplosion.rb:21:1568:21:1577 | ... > ... | | UseUseExplosion.rb:21:1580:21:2500 | then ... | UseUseExplosion.rb:21:1564:21:2516 | if ... | | UseUseExplosion.rb:21:1585:21:2500 | if ... | UseUseExplosion.rb:21:1580:21:2500 | then ... | @@ -2459,8 +2285,7 @@ | UseUseExplosion.rb:21:1589:21:1593 | [post] self | UseUseExplosion.rb:21:2491:21:2496 | self | | UseUseExplosion.rb:21:1589:21:1593 | self | UseUseExplosion.rb:21:1610:21:1614 | self | | UseUseExplosion.rb:21:1589:21:1593 | self | UseUseExplosion.rb:21:2491:21:2496 | self | -| UseUseExplosion.rb:21:1589:21:1598 | ... > ... | UseUseExplosion.rb:21:1588:21:1599 | [false] ( ... ) | -| UseUseExplosion.rb:21:1589:21:1598 | ... > ... | UseUseExplosion.rb:21:1588:21:1599 | [true] ( ... ) | +| UseUseExplosion.rb:21:1589:21:1598 | ... > ... | UseUseExplosion.rb:21:1588:21:1599 | ( ... ) | | UseUseExplosion.rb:21:1597:21:1598 | 25 | UseUseExplosion.rb:21:1589:21:1598 | ... > ... | | UseUseExplosion.rb:21:1601:21:2484 | then ... | UseUseExplosion.rb:21:1585:21:2500 | if ... | | UseUseExplosion.rb:21:1606:21:2484 | if ... | UseUseExplosion.rb:21:1601:21:2484 | then ... | @@ -2469,8 +2294,7 @@ | UseUseExplosion.rb:21:1610:21:1614 | [post] self | UseUseExplosion.rb:21:2475:21:2480 | self | | UseUseExplosion.rb:21:1610:21:1614 | self | UseUseExplosion.rb:21:1631:21:1635 | self | | UseUseExplosion.rb:21:1610:21:1614 | self | UseUseExplosion.rb:21:2475:21:2480 | self | -| UseUseExplosion.rb:21:1610:21:1619 | ... > ... | UseUseExplosion.rb:21:1609:21:1620 | [false] ( ... ) | -| UseUseExplosion.rb:21:1610:21:1619 | ... > ... | UseUseExplosion.rb:21:1609:21:1620 | [true] ( ... ) | +| UseUseExplosion.rb:21:1610:21:1619 | ... > ... | UseUseExplosion.rb:21:1609:21:1620 | ( ... ) | | UseUseExplosion.rb:21:1618:21:1619 | 24 | UseUseExplosion.rb:21:1610:21:1619 | ... > ... | | UseUseExplosion.rb:21:1622:21:2468 | then ... | UseUseExplosion.rb:21:1606:21:2484 | if ... | | UseUseExplosion.rb:21:1627:21:2468 | if ... | UseUseExplosion.rb:21:1622:21:2468 | then ... | @@ -2479,8 +2303,7 @@ | UseUseExplosion.rb:21:1631:21:1635 | [post] self | UseUseExplosion.rb:21:2459:21:2464 | self | | UseUseExplosion.rb:21:1631:21:1635 | self | UseUseExplosion.rb:21:1652:21:1656 | self | | UseUseExplosion.rb:21:1631:21:1635 | self | UseUseExplosion.rb:21:2459:21:2464 | self | -| UseUseExplosion.rb:21:1631:21:1640 | ... > ... | UseUseExplosion.rb:21:1630:21:1641 | [false] ( ... ) | -| UseUseExplosion.rb:21:1631:21:1640 | ... > ... | UseUseExplosion.rb:21:1630:21:1641 | [true] ( ... ) | +| UseUseExplosion.rb:21:1631:21:1640 | ... > ... | UseUseExplosion.rb:21:1630:21:1641 | ( ... ) | | UseUseExplosion.rb:21:1639:21:1640 | 23 | UseUseExplosion.rb:21:1631:21:1640 | ... > ... | | UseUseExplosion.rb:21:1643:21:2452 | then ... | UseUseExplosion.rb:21:1627:21:2468 | if ... | | UseUseExplosion.rb:21:1648:21:2452 | if ... | UseUseExplosion.rb:21:1643:21:2452 | then ... | @@ -2489,8 +2312,7 @@ | UseUseExplosion.rb:21:1652:21:1656 | [post] self | UseUseExplosion.rb:21:2443:21:2448 | self | | UseUseExplosion.rb:21:1652:21:1656 | self | UseUseExplosion.rb:21:1673:21:1677 | self | | UseUseExplosion.rb:21:1652:21:1656 | self | UseUseExplosion.rb:21:2443:21:2448 | self | -| UseUseExplosion.rb:21:1652:21:1661 | ... > ... | UseUseExplosion.rb:21:1651:21:1662 | [false] ( ... ) | -| UseUseExplosion.rb:21:1652:21:1661 | ... > ... | UseUseExplosion.rb:21:1651:21:1662 | [true] ( ... ) | +| UseUseExplosion.rb:21:1652:21:1661 | ... > ... | UseUseExplosion.rb:21:1651:21:1662 | ( ... ) | | UseUseExplosion.rb:21:1660:21:1661 | 22 | UseUseExplosion.rb:21:1652:21:1661 | ... > ... | | UseUseExplosion.rb:21:1664:21:2436 | then ... | UseUseExplosion.rb:21:1648:21:2452 | if ... | | UseUseExplosion.rb:21:1669:21:2436 | if ... | UseUseExplosion.rb:21:1664:21:2436 | then ... | @@ -2499,8 +2321,7 @@ | UseUseExplosion.rb:21:1673:21:1677 | [post] self | UseUseExplosion.rb:21:2427:21:2432 | self | | UseUseExplosion.rb:21:1673:21:1677 | self | UseUseExplosion.rb:21:1694:21:1698 | self | | UseUseExplosion.rb:21:1673:21:1677 | self | UseUseExplosion.rb:21:2427:21:2432 | self | -| UseUseExplosion.rb:21:1673:21:1682 | ... > ... | UseUseExplosion.rb:21:1672:21:1683 | [false] ( ... ) | -| UseUseExplosion.rb:21:1673:21:1682 | ... > ... | UseUseExplosion.rb:21:1672:21:1683 | [true] ( ... ) | +| UseUseExplosion.rb:21:1673:21:1682 | ... > ... | UseUseExplosion.rb:21:1672:21:1683 | ( ... ) | | UseUseExplosion.rb:21:1681:21:1682 | 21 | UseUseExplosion.rb:21:1673:21:1682 | ... > ... | | UseUseExplosion.rb:21:1685:21:2420 | then ... | UseUseExplosion.rb:21:1669:21:2436 | if ... | | UseUseExplosion.rb:21:1690:21:2420 | if ... | UseUseExplosion.rb:21:1685:21:2420 | then ... | @@ -2509,8 +2330,7 @@ | UseUseExplosion.rb:21:1694:21:1698 | [post] self | UseUseExplosion.rb:21:2411:21:2416 | self | | UseUseExplosion.rb:21:1694:21:1698 | self | UseUseExplosion.rb:21:1715:21:1719 | self | | UseUseExplosion.rb:21:1694:21:1698 | self | UseUseExplosion.rb:21:2411:21:2416 | self | -| UseUseExplosion.rb:21:1694:21:1703 | ... > ... | UseUseExplosion.rb:21:1693:21:1704 | [false] ( ... ) | -| UseUseExplosion.rb:21:1694:21:1703 | ... > ... | UseUseExplosion.rb:21:1693:21:1704 | [true] ( ... ) | +| UseUseExplosion.rb:21:1694:21:1703 | ... > ... | UseUseExplosion.rb:21:1693:21:1704 | ( ... ) | | UseUseExplosion.rb:21:1702:21:1703 | 20 | UseUseExplosion.rb:21:1694:21:1703 | ... > ... | | UseUseExplosion.rb:21:1706:21:2404 | then ... | UseUseExplosion.rb:21:1690:21:2420 | if ... | | UseUseExplosion.rb:21:1711:21:2404 | if ... | UseUseExplosion.rb:21:1706:21:2404 | then ... | @@ -2519,8 +2339,7 @@ | UseUseExplosion.rb:21:1715:21:1719 | [post] self | UseUseExplosion.rb:21:2395:21:2400 | self | | UseUseExplosion.rb:21:1715:21:1719 | self | UseUseExplosion.rb:21:1736:21:1740 | self | | UseUseExplosion.rb:21:1715:21:1719 | self | UseUseExplosion.rb:21:2395:21:2400 | self | -| UseUseExplosion.rb:21:1715:21:1724 | ... > ... | UseUseExplosion.rb:21:1714:21:1725 | [false] ( ... ) | -| UseUseExplosion.rb:21:1715:21:1724 | ... > ... | UseUseExplosion.rb:21:1714:21:1725 | [true] ( ... ) | +| UseUseExplosion.rb:21:1715:21:1724 | ... > ... | UseUseExplosion.rb:21:1714:21:1725 | ( ... ) | | UseUseExplosion.rb:21:1723:21:1724 | 19 | UseUseExplosion.rb:21:1715:21:1724 | ... > ... | | UseUseExplosion.rb:21:1727:21:2388 | then ... | UseUseExplosion.rb:21:1711:21:2404 | if ... | | UseUseExplosion.rb:21:1732:21:2388 | if ... | UseUseExplosion.rb:21:1727:21:2388 | then ... | @@ -2529,8 +2348,7 @@ | UseUseExplosion.rb:21:1736:21:1740 | [post] self | UseUseExplosion.rb:21:2379:21:2384 | self | | UseUseExplosion.rb:21:1736:21:1740 | self | UseUseExplosion.rb:21:1757:21:1761 | self | | UseUseExplosion.rb:21:1736:21:1740 | self | UseUseExplosion.rb:21:2379:21:2384 | self | -| UseUseExplosion.rb:21:1736:21:1745 | ... > ... | UseUseExplosion.rb:21:1735:21:1746 | [false] ( ... ) | -| UseUseExplosion.rb:21:1736:21:1745 | ... > ... | UseUseExplosion.rb:21:1735:21:1746 | [true] ( ... ) | +| UseUseExplosion.rb:21:1736:21:1745 | ... > ... | UseUseExplosion.rb:21:1735:21:1746 | ( ... ) | | UseUseExplosion.rb:21:1744:21:1745 | 18 | UseUseExplosion.rb:21:1736:21:1745 | ... > ... | | UseUseExplosion.rb:21:1748:21:2372 | then ... | UseUseExplosion.rb:21:1732:21:2388 | if ... | | UseUseExplosion.rb:21:1753:21:2372 | if ... | UseUseExplosion.rb:21:1748:21:2372 | then ... | @@ -2539,8 +2357,7 @@ | UseUseExplosion.rb:21:1757:21:1761 | [post] self | UseUseExplosion.rb:21:2363:21:2368 | self | | UseUseExplosion.rb:21:1757:21:1761 | self | UseUseExplosion.rb:21:1778:21:1782 | self | | UseUseExplosion.rb:21:1757:21:1761 | self | UseUseExplosion.rb:21:2363:21:2368 | self | -| UseUseExplosion.rb:21:1757:21:1766 | ... > ... | UseUseExplosion.rb:21:1756:21:1767 | [false] ( ... ) | -| UseUseExplosion.rb:21:1757:21:1766 | ... > ... | UseUseExplosion.rb:21:1756:21:1767 | [true] ( ... ) | +| UseUseExplosion.rb:21:1757:21:1766 | ... > ... | UseUseExplosion.rb:21:1756:21:1767 | ( ... ) | | UseUseExplosion.rb:21:1765:21:1766 | 17 | UseUseExplosion.rb:21:1757:21:1766 | ... > ... | | UseUseExplosion.rb:21:1769:21:2356 | then ... | UseUseExplosion.rb:21:1753:21:2372 | if ... | | UseUseExplosion.rb:21:1774:21:2356 | if ... | UseUseExplosion.rb:21:1769:21:2356 | then ... | @@ -2549,8 +2366,7 @@ | UseUseExplosion.rb:21:1778:21:1782 | [post] self | UseUseExplosion.rb:21:2347:21:2352 | self | | UseUseExplosion.rb:21:1778:21:1782 | self | UseUseExplosion.rb:21:1799:21:1803 | self | | UseUseExplosion.rb:21:1778:21:1782 | self | UseUseExplosion.rb:21:2347:21:2352 | self | -| UseUseExplosion.rb:21:1778:21:1787 | ... > ... | UseUseExplosion.rb:21:1777:21:1788 | [false] ( ... ) | -| UseUseExplosion.rb:21:1778:21:1787 | ... > ... | UseUseExplosion.rb:21:1777:21:1788 | [true] ( ... ) | +| UseUseExplosion.rb:21:1778:21:1787 | ... > ... | UseUseExplosion.rb:21:1777:21:1788 | ( ... ) | | UseUseExplosion.rb:21:1786:21:1787 | 16 | UseUseExplosion.rb:21:1778:21:1787 | ... > ... | | UseUseExplosion.rb:21:1790:21:2340 | then ... | UseUseExplosion.rb:21:1774:21:2356 | if ... | | UseUseExplosion.rb:21:1795:21:2340 | if ... | UseUseExplosion.rb:21:1790:21:2340 | then ... | @@ -2559,8 +2375,7 @@ | UseUseExplosion.rb:21:1799:21:1803 | [post] self | UseUseExplosion.rb:21:2331:21:2336 | self | | UseUseExplosion.rb:21:1799:21:1803 | self | UseUseExplosion.rb:21:1820:21:1824 | self | | UseUseExplosion.rb:21:1799:21:1803 | self | UseUseExplosion.rb:21:2331:21:2336 | self | -| UseUseExplosion.rb:21:1799:21:1808 | ... > ... | UseUseExplosion.rb:21:1798:21:1809 | [false] ( ... ) | -| UseUseExplosion.rb:21:1799:21:1808 | ... > ... | UseUseExplosion.rb:21:1798:21:1809 | [true] ( ... ) | +| UseUseExplosion.rb:21:1799:21:1808 | ... > ... | UseUseExplosion.rb:21:1798:21:1809 | ( ... ) | | UseUseExplosion.rb:21:1807:21:1808 | 15 | UseUseExplosion.rb:21:1799:21:1808 | ... > ... | | UseUseExplosion.rb:21:1811:21:2324 | then ... | UseUseExplosion.rb:21:1795:21:2340 | if ... | | UseUseExplosion.rb:21:1816:21:2324 | if ... | UseUseExplosion.rb:21:1811:21:2324 | then ... | @@ -2569,8 +2384,7 @@ | UseUseExplosion.rb:21:1820:21:1824 | [post] self | UseUseExplosion.rb:21:2315:21:2320 | self | | UseUseExplosion.rb:21:1820:21:1824 | self | UseUseExplosion.rb:21:1841:21:1845 | self | | UseUseExplosion.rb:21:1820:21:1824 | self | UseUseExplosion.rb:21:2315:21:2320 | self | -| UseUseExplosion.rb:21:1820:21:1829 | ... > ... | UseUseExplosion.rb:21:1819:21:1830 | [false] ( ... ) | -| UseUseExplosion.rb:21:1820:21:1829 | ... > ... | UseUseExplosion.rb:21:1819:21:1830 | [true] ( ... ) | +| UseUseExplosion.rb:21:1820:21:1829 | ... > ... | UseUseExplosion.rb:21:1819:21:1830 | ( ... ) | | UseUseExplosion.rb:21:1828:21:1829 | 14 | UseUseExplosion.rb:21:1820:21:1829 | ... > ... | | UseUseExplosion.rb:21:1832:21:2308 | then ... | UseUseExplosion.rb:21:1816:21:2324 | if ... | | UseUseExplosion.rb:21:1837:21:2308 | if ... | UseUseExplosion.rb:21:1832:21:2308 | then ... | @@ -2579,8 +2393,7 @@ | UseUseExplosion.rb:21:1841:21:1845 | [post] self | UseUseExplosion.rb:21:2299:21:2304 | self | | UseUseExplosion.rb:21:1841:21:1845 | self | UseUseExplosion.rb:21:1862:21:1866 | self | | UseUseExplosion.rb:21:1841:21:1845 | self | UseUseExplosion.rb:21:2299:21:2304 | self | -| UseUseExplosion.rb:21:1841:21:1850 | ... > ... | UseUseExplosion.rb:21:1840:21:1851 | [false] ( ... ) | -| UseUseExplosion.rb:21:1841:21:1850 | ... > ... | UseUseExplosion.rb:21:1840:21:1851 | [true] ( ... ) | +| UseUseExplosion.rb:21:1841:21:1850 | ... > ... | UseUseExplosion.rb:21:1840:21:1851 | ( ... ) | | UseUseExplosion.rb:21:1849:21:1850 | 13 | UseUseExplosion.rb:21:1841:21:1850 | ... > ... | | UseUseExplosion.rb:21:1853:21:2292 | then ... | UseUseExplosion.rb:21:1837:21:2308 | if ... | | UseUseExplosion.rb:21:1858:21:2292 | if ... | UseUseExplosion.rb:21:1853:21:2292 | then ... | @@ -2589,8 +2402,7 @@ | UseUseExplosion.rb:21:1862:21:1866 | [post] self | UseUseExplosion.rb:21:2283:21:2288 | self | | UseUseExplosion.rb:21:1862:21:1866 | self | UseUseExplosion.rb:21:1883:21:1887 | self | | UseUseExplosion.rb:21:1862:21:1866 | self | UseUseExplosion.rb:21:2283:21:2288 | self | -| UseUseExplosion.rb:21:1862:21:1871 | ... > ... | UseUseExplosion.rb:21:1861:21:1872 | [false] ( ... ) | -| UseUseExplosion.rb:21:1862:21:1871 | ... > ... | UseUseExplosion.rb:21:1861:21:1872 | [true] ( ... ) | +| UseUseExplosion.rb:21:1862:21:1871 | ... > ... | UseUseExplosion.rb:21:1861:21:1872 | ( ... ) | | UseUseExplosion.rb:21:1870:21:1871 | 12 | UseUseExplosion.rb:21:1862:21:1871 | ... > ... | | UseUseExplosion.rb:21:1874:21:2276 | then ... | UseUseExplosion.rb:21:1858:21:2292 | if ... | | UseUseExplosion.rb:21:1879:21:2276 | if ... | UseUseExplosion.rb:21:1874:21:2276 | then ... | @@ -2599,8 +2411,7 @@ | UseUseExplosion.rb:21:1883:21:1887 | [post] self | UseUseExplosion.rb:21:2267:21:2272 | self | | UseUseExplosion.rb:21:1883:21:1887 | self | UseUseExplosion.rb:21:1904:21:1908 | self | | UseUseExplosion.rb:21:1883:21:1887 | self | UseUseExplosion.rb:21:2267:21:2272 | self | -| UseUseExplosion.rb:21:1883:21:1892 | ... > ... | UseUseExplosion.rb:21:1882:21:1893 | [false] ( ... ) | -| UseUseExplosion.rb:21:1883:21:1892 | ... > ... | UseUseExplosion.rb:21:1882:21:1893 | [true] ( ... ) | +| UseUseExplosion.rb:21:1883:21:1892 | ... > ... | UseUseExplosion.rb:21:1882:21:1893 | ( ... ) | | UseUseExplosion.rb:21:1891:21:1892 | 11 | UseUseExplosion.rb:21:1883:21:1892 | ... > ... | | UseUseExplosion.rb:21:1895:21:2260 | then ... | UseUseExplosion.rb:21:1879:21:2276 | if ... | | UseUseExplosion.rb:21:1900:21:2260 | if ... | UseUseExplosion.rb:21:1895:21:2260 | then ... | @@ -2609,8 +2420,7 @@ | UseUseExplosion.rb:21:1904:21:1908 | [post] self | UseUseExplosion.rb:21:2251:21:2256 | self | | UseUseExplosion.rb:21:1904:21:1908 | self | UseUseExplosion.rb:21:1925:21:1929 | self | | UseUseExplosion.rb:21:1904:21:1908 | self | UseUseExplosion.rb:21:2251:21:2256 | self | -| UseUseExplosion.rb:21:1904:21:1913 | ... > ... | UseUseExplosion.rb:21:1903:21:1914 | [false] ( ... ) | -| UseUseExplosion.rb:21:1904:21:1913 | ... > ... | UseUseExplosion.rb:21:1903:21:1914 | [true] ( ... ) | +| UseUseExplosion.rb:21:1904:21:1913 | ... > ... | UseUseExplosion.rb:21:1903:21:1914 | ( ... ) | | UseUseExplosion.rb:21:1912:21:1913 | 10 | UseUseExplosion.rb:21:1904:21:1913 | ... > ... | | UseUseExplosion.rb:21:1916:21:2244 | then ... | UseUseExplosion.rb:21:1900:21:2260 | if ... | | UseUseExplosion.rb:21:1921:21:2244 | if ... | UseUseExplosion.rb:21:1916:21:2244 | then ... | @@ -2619,8 +2429,7 @@ | UseUseExplosion.rb:21:1925:21:1929 | [post] self | UseUseExplosion.rb:21:2235:21:2240 | self | | UseUseExplosion.rb:21:1925:21:1929 | self | UseUseExplosion.rb:21:1945:21:1949 | self | | UseUseExplosion.rb:21:1925:21:1929 | self | UseUseExplosion.rb:21:2235:21:2240 | self | -| UseUseExplosion.rb:21:1925:21:1933 | ... > ... | UseUseExplosion.rb:21:1924:21:1934 | [false] ( ... ) | -| UseUseExplosion.rb:21:1925:21:1933 | ... > ... | UseUseExplosion.rb:21:1924:21:1934 | [true] ( ... ) | +| UseUseExplosion.rb:21:1925:21:1933 | ... > ... | UseUseExplosion.rb:21:1924:21:1934 | ( ... ) | | UseUseExplosion.rb:21:1933:21:1933 | 9 | UseUseExplosion.rb:21:1925:21:1933 | ... > ... | | UseUseExplosion.rb:21:1936:21:2228 | then ... | UseUseExplosion.rb:21:1921:21:2244 | if ... | | UseUseExplosion.rb:21:1941:21:2228 | if ... | UseUseExplosion.rb:21:1936:21:2228 | then ... | @@ -2629,8 +2438,7 @@ | UseUseExplosion.rb:21:1945:21:1949 | [post] self | UseUseExplosion.rb:21:2219:21:2224 | self | | UseUseExplosion.rb:21:1945:21:1949 | self | UseUseExplosion.rb:21:1965:21:1969 | self | | UseUseExplosion.rb:21:1945:21:1949 | self | UseUseExplosion.rb:21:2219:21:2224 | self | -| UseUseExplosion.rb:21:1945:21:1953 | ... > ... | UseUseExplosion.rb:21:1944:21:1954 | [false] ( ... ) | -| UseUseExplosion.rb:21:1945:21:1953 | ... > ... | UseUseExplosion.rb:21:1944:21:1954 | [true] ( ... ) | +| UseUseExplosion.rb:21:1945:21:1953 | ... > ... | UseUseExplosion.rb:21:1944:21:1954 | ( ... ) | | UseUseExplosion.rb:21:1953:21:1953 | 8 | UseUseExplosion.rb:21:1945:21:1953 | ... > ... | | UseUseExplosion.rb:21:1956:21:2212 | then ... | UseUseExplosion.rb:21:1941:21:2228 | if ... | | UseUseExplosion.rb:21:1961:21:2212 | if ... | UseUseExplosion.rb:21:1956:21:2212 | then ... | @@ -2639,8 +2447,7 @@ | UseUseExplosion.rb:21:1965:21:1969 | [post] self | UseUseExplosion.rb:21:2203:21:2208 | self | | UseUseExplosion.rb:21:1965:21:1969 | self | UseUseExplosion.rb:21:1985:21:1989 | self | | UseUseExplosion.rb:21:1965:21:1969 | self | UseUseExplosion.rb:21:2203:21:2208 | self | -| UseUseExplosion.rb:21:1965:21:1973 | ... > ... | UseUseExplosion.rb:21:1964:21:1974 | [false] ( ... ) | -| UseUseExplosion.rb:21:1965:21:1973 | ... > ... | UseUseExplosion.rb:21:1964:21:1974 | [true] ( ... ) | +| UseUseExplosion.rb:21:1965:21:1973 | ... > ... | UseUseExplosion.rb:21:1964:21:1974 | ( ... ) | | UseUseExplosion.rb:21:1973:21:1973 | 7 | UseUseExplosion.rb:21:1965:21:1973 | ... > ... | | UseUseExplosion.rb:21:1976:21:2196 | then ... | UseUseExplosion.rb:21:1961:21:2212 | if ... | | UseUseExplosion.rb:21:1981:21:2196 | if ... | UseUseExplosion.rb:21:1976:21:2196 | then ... | @@ -2649,8 +2456,7 @@ | UseUseExplosion.rb:21:1985:21:1989 | [post] self | UseUseExplosion.rb:21:2187:21:2192 | self | | UseUseExplosion.rb:21:1985:21:1989 | self | UseUseExplosion.rb:21:2005:21:2009 | self | | UseUseExplosion.rb:21:1985:21:1989 | self | UseUseExplosion.rb:21:2187:21:2192 | self | -| UseUseExplosion.rb:21:1985:21:1993 | ... > ... | UseUseExplosion.rb:21:1984:21:1994 | [false] ( ... ) | -| UseUseExplosion.rb:21:1985:21:1993 | ... > ... | UseUseExplosion.rb:21:1984:21:1994 | [true] ( ... ) | +| UseUseExplosion.rb:21:1985:21:1993 | ... > ... | UseUseExplosion.rb:21:1984:21:1994 | ( ... ) | | UseUseExplosion.rb:21:1993:21:1993 | 6 | UseUseExplosion.rb:21:1985:21:1993 | ... > ... | | UseUseExplosion.rb:21:1996:21:2180 | then ... | UseUseExplosion.rb:21:1981:21:2196 | if ... | | UseUseExplosion.rb:21:2001:21:2180 | if ... | UseUseExplosion.rb:21:1996:21:2180 | then ... | @@ -2659,8 +2465,7 @@ | UseUseExplosion.rb:21:2005:21:2009 | [post] self | UseUseExplosion.rb:21:2171:21:2176 | self | | UseUseExplosion.rb:21:2005:21:2009 | self | UseUseExplosion.rb:21:2025:21:2029 | self | | UseUseExplosion.rb:21:2005:21:2009 | self | UseUseExplosion.rb:21:2171:21:2176 | self | -| UseUseExplosion.rb:21:2005:21:2013 | ... > ... | UseUseExplosion.rb:21:2004:21:2014 | [false] ( ... ) | -| UseUseExplosion.rb:21:2005:21:2013 | ... > ... | UseUseExplosion.rb:21:2004:21:2014 | [true] ( ... ) | +| UseUseExplosion.rb:21:2005:21:2013 | ... > ... | UseUseExplosion.rb:21:2004:21:2014 | ( ... ) | | UseUseExplosion.rb:21:2013:21:2013 | 5 | UseUseExplosion.rb:21:2005:21:2013 | ... > ... | | UseUseExplosion.rb:21:2016:21:2164 | then ... | UseUseExplosion.rb:21:2001:21:2180 | if ... | | UseUseExplosion.rb:21:2021:21:2164 | if ... | UseUseExplosion.rb:21:2016:21:2164 | then ... | @@ -2669,8 +2474,7 @@ | UseUseExplosion.rb:21:2025:21:2029 | [post] self | UseUseExplosion.rb:21:2155:21:2160 | self | | UseUseExplosion.rb:21:2025:21:2029 | self | UseUseExplosion.rb:21:2045:21:2049 | self | | UseUseExplosion.rb:21:2025:21:2029 | self | UseUseExplosion.rb:21:2155:21:2160 | self | -| UseUseExplosion.rb:21:2025:21:2033 | ... > ... | UseUseExplosion.rb:21:2024:21:2034 | [false] ( ... ) | -| UseUseExplosion.rb:21:2025:21:2033 | ... > ... | UseUseExplosion.rb:21:2024:21:2034 | [true] ( ... ) | +| UseUseExplosion.rb:21:2025:21:2033 | ... > ... | UseUseExplosion.rb:21:2024:21:2034 | ( ... ) | | UseUseExplosion.rb:21:2033:21:2033 | 4 | UseUseExplosion.rb:21:2025:21:2033 | ... > ... | | UseUseExplosion.rb:21:2036:21:2148 | then ... | UseUseExplosion.rb:21:2021:21:2164 | if ... | | UseUseExplosion.rb:21:2041:21:2148 | if ... | UseUseExplosion.rb:21:2036:21:2148 | then ... | @@ -2679,8 +2483,7 @@ | UseUseExplosion.rb:21:2045:21:2049 | [post] self | UseUseExplosion.rb:21:2139:21:2144 | self | | UseUseExplosion.rb:21:2045:21:2049 | self | UseUseExplosion.rb:21:2065:21:2069 | self | | UseUseExplosion.rb:21:2045:21:2049 | self | UseUseExplosion.rb:21:2139:21:2144 | self | -| UseUseExplosion.rb:21:2045:21:2053 | ... > ... | UseUseExplosion.rb:21:2044:21:2054 | [false] ( ... ) | -| UseUseExplosion.rb:21:2045:21:2053 | ... > ... | UseUseExplosion.rb:21:2044:21:2054 | [true] ( ... ) | +| UseUseExplosion.rb:21:2045:21:2053 | ... > ... | UseUseExplosion.rb:21:2044:21:2054 | ( ... ) | | UseUseExplosion.rb:21:2053:21:2053 | 3 | UseUseExplosion.rb:21:2045:21:2053 | ... > ... | | UseUseExplosion.rb:21:2056:21:2132 | then ... | UseUseExplosion.rb:21:2041:21:2148 | if ... | | UseUseExplosion.rb:21:2061:21:2132 | if ... | UseUseExplosion.rb:21:2056:21:2132 | then ... | @@ -2689,16 +2492,14 @@ | UseUseExplosion.rb:21:2065:21:2069 | [post] self | UseUseExplosion.rb:21:2123:21:2128 | self | | UseUseExplosion.rb:21:2065:21:2069 | self | UseUseExplosion.rb:21:2085:21:2089 | self | | UseUseExplosion.rb:21:2065:21:2069 | self | UseUseExplosion.rb:21:2123:21:2128 | self | -| UseUseExplosion.rb:21:2065:21:2073 | ... > ... | UseUseExplosion.rb:21:2064:21:2074 | [false] ( ... ) | -| UseUseExplosion.rb:21:2065:21:2073 | ... > ... | UseUseExplosion.rb:21:2064:21:2074 | [true] ( ... ) | +| UseUseExplosion.rb:21:2065:21:2073 | ... > ... | UseUseExplosion.rb:21:2064:21:2074 | ( ... ) | | UseUseExplosion.rb:21:2073:21:2073 | 2 | UseUseExplosion.rb:21:2065:21:2073 | ... > ... | | UseUseExplosion.rb:21:2076:21:2116 | then ... | UseUseExplosion.rb:21:2061:21:2132 | if ... | | UseUseExplosion.rb:21:2081:21:2116 | if ... | UseUseExplosion.rb:21:2076:21:2116 | then ... | | UseUseExplosion.rb:21:2085:21:2089 | @prop | UseUseExplosion.rb:21:2085:21:2093 | ... > ... | | UseUseExplosion.rb:21:2085:21:2089 | [post] self | UseUseExplosion.rb:21:2107:21:2112 | self | | UseUseExplosion.rb:21:2085:21:2089 | self | UseUseExplosion.rb:21:2107:21:2112 | self | -| UseUseExplosion.rb:21:2085:21:2093 | ... > ... | UseUseExplosion.rb:21:2084:21:2094 | [false] ( ... ) | -| UseUseExplosion.rb:21:2085:21:2093 | ... > ... | UseUseExplosion.rb:21:2084:21:2094 | [true] ( ... ) | +| UseUseExplosion.rb:21:2085:21:2093 | ... > ... | UseUseExplosion.rb:21:2084:21:2094 | ( ... ) | | UseUseExplosion.rb:21:2093:21:2093 | 1 | UseUseExplosion.rb:21:2085:21:2093 | ... > ... | | UseUseExplosion.rb:21:2096:21:2099 | then ... | UseUseExplosion.rb:21:2081:21:2116 | if ... | | UseUseExplosion.rb:21:2102:21:2112 | else ... | UseUseExplosion.rb:21:2081:21:2116 | if ... | @@ -2972,6 +2773,7 @@ | local_dataflow.rb:5:8:5:12 | ... = ... | local_dataflow.rb:5:7:5:13 | ( ... ) | | local_dataflow.rb:5:12:5:12 | a | local_dataflow.rb:5:8:5:12 | ... = ... | | local_dataflow.rb:5:12:5:12 | a | local_dataflow.rb:6:8:6:8 | a | +| local_dataflow.rb:6:3:6:14 | ... = ... | local_dataflow.rb:2:3:6:14 | ... | | local_dataflow.rb:6:7:6:14 | ( ... ) | local_dataflow.rb:6:3:6:14 | ... = ... | | local_dataflow.rb:6:8:6:8 | a | local_dataflow.rb:6:10:6:11 | ... + ... | | local_dataflow.rb:6:8:6:13 | ... = ... | local_dataflow.rb:6:7:6:14 | ( ... ) | @@ -2994,8 +2796,7 @@ | local_dataflow.rb:10:9:10:9 | ... = ... | local_dataflow.rb:10:9:10:9 | if ... | | local_dataflow.rb:10:9:10:9 | [input] phi | local_dataflow.rb:10:9:10:9 | phi | | local_dataflow.rb:10:9:10:9 | [post] x | local_dataflow.rb:10:9:10:9 | [input] phi | -| local_dataflow.rb:10:9:10:9 | defined? ... | local_dataflow.rb:10:9:10:9 | [false] ! ... | -| local_dataflow.rb:10:9:10:9 | defined? ... | local_dataflow.rb:10:9:10:9 | [true] ! ... | +| local_dataflow.rb:10:9:10:9 | defined? ... | local_dataflow.rb:10:9:10:9 | ! ... | | local_dataflow.rb:10:9:10:9 | nil | local_dataflow.rb:10:9:10:9 | ... = ... | | local_dataflow.rb:10:9:10:9 | nil | local_dataflow.rb:10:9:10:9 | x | | local_dataflow.rb:10:9:10:9 | x | local_dataflow.rb:10:9:10:9 | [input] phi | @@ -3006,6 +2807,7 @@ | local_dataflow.rb:10:14:10:18 | array | local_dataflow.rb:15:10:15:14 | array | | local_dataflow.rb:11:1:11:2 | [post] self | local_dataflow.rb:12:3:12:5 | self | | local_dataflow.rb:11:1:11:2 | self | local_dataflow.rb:12:3:12:5 | self | +| local_dataflow.rb:12:3:12:5 | call to p | local_dataflow.rb:10:5:13:3 | ... | | local_dataflow.rb:15:1:17:3 | x | local_dataflow.rb:19:5:19:5 | x | | local_dataflow.rb:15:1:17:3 | __synth__0__1 | local_dataflow.rb:15:1:17:3 | ... = ... | | local_dataflow.rb:15:1:17:3 | __synth__0__1 | local_dataflow.rb:15:1:17:3 | __synth__0__1 | @@ -3016,8 +2818,7 @@ | local_dataflow.rb:15:5:15:5 | ... = ... | local_dataflow.rb:15:5:15:5 | if ... | | local_dataflow.rb:15:5:15:5 | [input] phi | local_dataflow.rb:15:5:15:5 | phi | | local_dataflow.rb:15:5:15:5 | [post] x | local_dataflow.rb:15:5:15:5 | [input] phi | -| local_dataflow.rb:15:5:15:5 | defined? ... | local_dataflow.rb:15:5:15:5 | [false] ! ... | -| local_dataflow.rb:15:5:15:5 | defined? ... | local_dataflow.rb:15:5:15:5 | [true] ! ... | +| local_dataflow.rb:15:5:15:5 | defined? ... | local_dataflow.rb:15:5:15:5 | ! ... | | local_dataflow.rb:15:5:15:5 | nil | local_dataflow.rb:15:5:15:5 | ... = ... | | local_dataflow.rb:15:5:15:5 | nil | local_dataflow.rb:15:5:15:5 | x | | local_dataflow.rb:15:5:15:5 | x | local_dataflow.rb:15:5:15:5 | [input] phi | @@ -3035,14 +2836,14 @@ | local_dataflow.rb:19:5:19:5 | ... = ... | local_dataflow.rb:19:5:19:5 | if ... | | local_dataflow.rb:19:5:19:5 | [input] phi | local_dataflow.rb:19:5:19:5 | phi | | local_dataflow.rb:19:5:19:5 | [post] x | local_dataflow.rb:19:5:19:5 | [input] phi | -| local_dataflow.rb:19:5:19:5 | defined? ... | local_dataflow.rb:19:5:19:5 | [false] ! ... | -| local_dataflow.rb:19:5:19:5 | defined? ... | local_dataflow.rb:19:5:19:5 | [true] ! ... | +| local_dataflow.rb:19:5:19:5 | defined? ... | local_dataflow.rb:19:5:19:5 | ! ... | | local_dataflow.rb:19:5:19:5 | nil | local_dataflow.rb:19:5:19:5 | ... = ... | | local_dataflow.rb:19:5:19:5 | nil | local_dataflow.rb:19:5:19:5 | x | | local_dataflow.rb:19:5:19:5 | x | local_dataflow.rb:19:5:19:5 | [input] phi | | local_dataflow.rb:19:5:19:5 | x | local_dataflow.rb:19:5:19:5 | defined? ... | | local_dataflow.rb:19:5:19:5 | x | local_dataflow.rb:19:5:19:5 | phi | | local_dataflow.rb:19:5:19:5 | x | local_dataflow.rb:20:6:20:6 | x | +| local_dataflow.rb:20:3:20:25 | if ... | local_dataflow.rb:19:1:21:3 | ... | | local_dataflow.rb:20:6:20:6 | x | local_dataflow.rb:20:6:20:10 | ... > ... | | local_dataflow.rb:20:10:20:10 | 1 | local_dataflow.rb:20:6:20:10 | ... > ... | | local_dataflow.rb:24:2:24:8 | break | local_dataflow.rb:23:1:25:3 | while ... | @@ -3053,12 +2854,14 @@ | local_dataflow.rb:30:14:30:20 | "class" | local_dataflow.rb:30:5:30:24 | C | | local_dataflow.rb:32:5:32:25 | bar | local_dataflow.rb:32:1:32:1 | x | | local_dataflow.rb:32:5:32:25 | bar | local_dataflow.rb:32:1:32:25 | ... = ... | +| local_dataflow.rb:32:14:32:21 | "method" | local_dataflow.rb:32:14:32:21 | ... | | local_dataflow.rb:34:1:39:3 | synthetic splat parameter | local_dataflow.rb:34:7:34:7 | x | | local_dataflow.rb:34:7:34:7 | x | local_dataflow.rb:34:7:34:7 | x | | local_dataflow.rb:34:7:34:7 | x | local_dataflow.rb:35:6:35:6 | x | | local_dataflow.rb:35:6:35:6 | x | local_dataflow.rb:35:6:35:11 | ... == ... | | local_dataflow.rb:35:11:35:11 | 4 | local_dataflow.rb:35:6:35:11 | ... == ... | | local_dataflow.rb:36:13:36:13 | 7 | local_dataflow.rb:36:6:36:13 | return | +| local_dataflow.rb:38:3:38:13 | "reachable" | local_dataflow.rb:35:3:38:13 | ... | | local_dataflow.rb:41:1:47:3 | synthetic splat parameter | local_dataflow.rb:41:7:41:7 | x | | local_dataflow.rb:41:7:41:7 | x | local_dataflow.rb:41:7:41:7 | x | | local_dataflow.rb:41:7:41:7 | x | local_dataflow.rb:42:6:42:6 | x | @@ -3077,6 +2880,7 @@ | local_dataflow.rb:51:9:51:15 | "break" | local_dataflow.rb:51:3:51:15 | break | | local_dataflow.rb:51:20:51:20 | x | local_dataflow.rb:51:20:51:24 | ... < ... | | local_dataflow.rb:51:24:51:24 | 9 | local_dataflow.rb:51:20:51:24 | ... < ... | +| local_dataflow.rb:52:3:52:10 | "normal" | local_dataflow.rb:50:3:52:10 | ... | | local_dataflow.rb:55:5:55:13 | Array | local_dataflow.rb:55:5:55:13 | call to [] | | local_dataflow.rb:55:5:55:13 | synthetic splat argument | local_dataflow.rb:55:5:55:13 | call to [] | | local_dataflow.rb:57:1:58:3 | synthetic splat parameter | local_dataflow.rb:57:9:57:9 | x | @@ -3181,6 +2985,7 @@ | local_dataflow.rb:87:25:87:25 | [post] x | local_dataflow.rb:87:29:87:29 | x | | local_dataflow.rb:87:25:87:25 | x | local_dataflow.rb:87:29:87:29 | x | | local_dataflow.rb:87:29:87:29 | x | local_dataflow.rb:87:15:87:48 | then ... | +| local_dataflow.rb:89:3:89:9 | call to sink | local_dataflow.rb:61:3:89:28 | ... | | local_dataflow.rb:92:1:109:3 | self (and_or) | local_dataflow.rb:93:7:93:15 | self | | local_dataflow.rb:92:1:109:3 | self in and_or | local_dataflow.rb:92:1:109:3 | self (and_or) | | local_dataflow.rb:93:3:93:3 | a | local_dataflow.rb:94:8:94:8 | a | @@ -3270,6 +3075,7 @@ | local_dataflow.rb:107:9:107:17 | [post] self | local_dataflow.rb:108:3:108:9 | self | | local_dataflow.rb:107:9:107:17 | call to source | local_dataflow.rb:107:5:107:7 | ... && ... | | local_dataflow.rb:107:9:107:17 | self | local_dataflow.rb:108:3:108:9 | self | +| local_dataflow.rb:108:3:108:9 | call to sink | local_dataflow.rb:93:3:108:28 | ... | | local_dataflow.rb:111:1:114:3 | self (object_dup) | local_dataflow.rb:112:3:112:21 | self | | local_dataflow.rb:111:1:114:3 | self in object_dup | local_dataflow.rb:111:1:114:3 | self (object_dup) | | local_dataflow.rb:112:3:112:21 | [post] self | local_dataflow.rb:112:8:112:16 | self | @@ -3278,6 +3084,7 @@ | local_dataflow.rb:112:8:112:16 | call to source | local_dataflow.rb:112:8:112:20 | call to dup | | local_dataflow.rb:112:8:112:16 | self | local_dataflow.rb:113:3:113:25 | self | | local_dataflow.rb:113:3:113:25 | [post] self | local_dataflow.rb:113:8:113:16 | self | +| local_dataflow.rb:113:3:113:25 | call to sink | local_dataflow.rb:112:3:113:44 | ... | | local_dataflow.rb:113:3:113:25 | self | local_dataflow.rb:113:8:113:16 | self | | local_dataflow.rb:113:8:113:16 | call to source | local_dataflow.rb:113:8:113:20 | call to dup | | local_dataflow.rb:113:8:113:20 | call to dup | local_dataflow.rb:113:8:113:24 | call to dup | @@ -3295,27 +3102,33 @@ | local_dataflow.rb:118:17:118:31 | synthetic splat parameter | local_dataflow.rb:118:20:118:20 | x | | local_dataflow.rb:118:20:118:20 | x | local_dataflow.rb:118:20:118:20 | x | | local_dataflow.rb:118:20:118:20 | x | local_dataflow.rb:118:28:118:28 | x | +| local_dataflow.rb:118:23:118:29 | call to sink | local_dataflow.rb:118:23:118:29 | ... | | local_dataflow.rb:119:3:119:31 | [post] self | local_dataflow.rb:119:8:119:16 | self | +| local_dataflow.rb:119:3:119:31 | call to sink | local_dataflow.rb:117:3:119:50 | ... | | local_dataflow.rb:119:3:119:31 | self | local_dataflow.rb:119:8:119:16 | self | | local_dataflow.rb:119:8:119:16 | call to source | local_dataflow.rb:119:8:119:23 | call to tap | | local_dataflow.rb:119:8:119:23 | call to tap | local_dataflow.rb:119:8:119:30 | call to tap | | local_dataflow.rb:122:1:124:3 | self (dup_tap) | local_dataflow.rb:123:3:123:50 | self | | local_dataflow.rb:122:1:124:3 | self in dup_tap | local_dataflow.rb:122:1:124:3 | self (dup_tap) | | local_dataflow.rb:123:3:123:50 | [post] self | local_dataflow.rb:123:8:123:16 | self | +| local_dataflow.rb:123:3:123:50 | call to sink | local_dataflow.rb:123:3:123:70 | ... | | local_dataflow.rb:123:3:123:50 | self | local_dataflow.rb:123:8:123:16 | self | | local_dataflow.rb:123:8:123:16 | call to source | local_dataflow.rb:123:8:123:20 | call to dup | | local_dataflow.rb:123:8:123:20 | call to dup | local_dataflow.rb:123:8:123:45 | call to tap | | local_dataflow.rb:123:8:123:45 | call to tap | local_dataflow.rb:123:8:123:49 | call to dup | | local_dataflow.rb:123:26:123:45 | self | local_dataflow.rb:123:32:123:43 | self | | local_dataflow.rb:123:26:123:45 | synthetic splat parameter | local_dataflow.rb:123:29:123:29 | x | +| local_dataflow.rb:123:32:123:43 | call to puts | local_dataflow.rb:123:32:123:43 | ... | | local_dataflow.rb:126:1:128:3 | self (use) | local_dataflow.rb:127:3:127:8 | self | | local_dataflow.rb:126:1:128:3 | self in use | local_dataflow.rb:126:1:128:3 | self (use) | | local_dataflow.rb:126:1:128:3 | synthetic splat parameter | local_dataflow.rb:126:9:126:9 | x | +| local_dataflow.rb:127:3:127:8 | call to rand | local_dataflow.rb:127:3:127:8 | ... | | local_dataflow.rb:130:1:150:3 | self (use_use_madness) | local_dataflow.rb:132:6:132:11 | self | | local_dataflow.rb:130:1:150:3 | self in use_use_madness | local_dataflow.rb:130:1:150:3 | self (use_use_madness) | | local_dataflow.rb:131:3:131:3 | x | local_dataflow.rb:132:10:132:10 | x | | local_dataflow.rb:131:7:131:8 | "" | local_dataflow.rb:131:3:131:3 | x | | local_dataflow.rb:131:7:131:8 | "" | local_dataflow.rb:131:3:131:8 | ... = ... | +| local_dataflow.rb:132:3:149:5 | if ... | local_dataflow.rb:131:3:149:5 | ... | | local_dataflow.rb:132:6:132:11 | [post] self | local_dataflow.rb:133:8:133:13 | self | | local_dataflow.rb:132:6:132:11 | self | local_dataflow.rb:133:8:133:13 | self | | local_dataflow.rb:132:10:132:10 | [post] x | local_dataflow.rb:133:12:133:12 | x | @@ -3325,8 +3138,7 @@ | local_dataflow.rb:133:8:133:13 | [input] SSA phi read(x) | local_dataflow.rb:134:11:134:11 | x | | local_dataflow.rb:133:8:133:13 | [post] self | local_dataflow.rb:133:8:133:13 | [input] SSA phi read(self) | | local_dataflow.rb:133:8:133:13 | [post] self | local_dataflow.rb:133:18:133:23 | self | -| local_dataflow.rb:133:8:133:13 | call to use | local_dataflow.rb:133:8:133:23 | [false] ... \|\| ... | -| local_dataflow.rb:133:8:133:13 | call to use | local_dataflow.rb:133:8:133:23 | [true] ... \|\| ... | +| local_dataflow.rb:133:8:133:13 | call to use | local_dataflow.rb:133:8:133:23 | ... \|\| ... | | local_dataflow.rb:133:8:133:13 | self | local_dataflow.rb:133:8:133:13 | [input] SSA phi read(self) | | local_dataflow.rb:133:8:133:13 | self | local_dataflow.rb:133:18:133:23 | self | | local_dataflow.rb:133:12:133:12 | [post] x | local_dataflow.rb:133:8:133:13 | [input] SSA phi read(x) | @@ -3337,8 +3149,7 @@ | local_dataflow.rb:133:18:133:23 | [input] SSA phi read(x) | local_dataflow.rb:134:11:134:11 | x | | local_dataflow.rb:133:18:133:23 | [post] self | local_dataflow.rb:133:18:133:23 | [input] SSA phi read(self) | | local_dataflow.rb:133:18:133:23 | [post] self | local_dataflow.rb:136:7:136:12 | self | -| local_dataflow.rb:133:18:133:23 | call to use | local_dataflow.rb:133:8:133:23 | [false] ... \|\| ... | -| local_dataflow.rb:133:18:133:23 | call to use | local_dataflow.rb:133:8:133:23 | [true] ... \|\| ... | +| local_dataflow.rb:133:18:133:23 | call to use | local_dataflow.rb:133:8:133:23 | ... \|\| ... | | local_dataflow.rb:133:18:133:23 | self | local_dataflow.rb:133:18:133:23 | [input] SSA phi read(self) | | local_dataflow.rb:133:18:133:23 | self | local_dataflow.rb:136:7:136:12 | self | | local_dataflow.rb:133:22:133:22 | [post] x | local_dataflow.rb:133:18:133:23 | [input] SSA phi read(x) | @@ -3371,61 +3182,51 @@ | local_dataflow.rb:137:14:137:14 | [post] x | local_dataflow.rb:137:25:137:25 | x | | local_dataflow.rb:137:14:137:14 | x | local_dataflow.rb:137:10:137:15 | [input] SSA phi read(x) | | local_dataflow.rb:137:14:137:14 | x | local_dataflow.rb:137:25:137:25 | x | -| local_dataflow.rb:137:20:137:26 | [false] ! ... | local_dataflow.rb:137:10:137:26 | [false] ... && ... | +| local_dataflow.rb:137:20:137:26 | ! ... | local_dataflow.rb:137:10:137:26 | ... && ... | | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(self) | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(self) | | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(x) | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(x) | -| local_dataflow.rb:137:20:137:26 | [true] ! ... | local_dataflow.rb:137:10:137:26 | [true] ... && ... | | local_dataflow.rb:137:21:137:26 | [post] self | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(self) | | local_dataflow.rb:137:21:137:26 | [post] self | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(self) | -| local_dataflow.rb:137:21:137:26 | call to use | local_dataflow.rb:137:20:137:26 | [false] ! ... | -| local_dataflow.rb:137:21:137:26 | call to use | local_dataflow.rb:137:20:137:26 | [true] ! ... | +| local_dataflow.rb:137:21:137:26 | call to use | local_dataflow.rb:137:20:137:26 | ! ... | | local_dataflow.rb:137:21:137:26 | self | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(self) | | local_dataflow.rb:137:21:137:26 | self | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(self) | | local_dataflow.rb:137:25:137:25 | [post] x | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(x) | | local_dataflow.rb:137:25:137:25 | [post] x | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(x) | | local_dataflow.rb:137:25:137:25 | x | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(x) | | local_dataflow.rb:137:25:137:25 | x | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(x) | -| local_dataflow.rb:141:8:141:14 | [false] ! ... | local_dataflow.rb:141:8:141:37 | [false] ... \|\| ... | -| local_dataflow.rb:141:8:141:14 | [false] ! ... | local_dataflow.rb:141:8:141:37 | [true] ... \|\| ... | +| local_dataflow.rb:141:8:141:14 | ! ... | local_dataflow.rb:141:8:141:37 | ... \|\| ... | | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(self) | local_dataflow.rb:141:38:142:9 | [input] SSA phi read(self) | | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(x) | local_dataflow.rb:141:38:142:9 | [input] SSA phi read(x) | -| local_dataflow.rb:141:8:141:14 | [true] ! ... | local_dataflow.rb:141:8:141:37 | [true] ... \|\| ... | | local_dataflow.rb:141:9:141:14 | [post] self | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(self) | | local_dataflow.rb:141:9:141:14 | [post] self | local_dataflow.rb:141:20:141:25 | self | -| local_dataflow.rb:141:9:141:14 | call to use | local_dataflow.rb:141:8:141:14 | [false] ! ... | -| local_dataflow.rb:141:9:141:14 | call to use | local_dataflow.rb:141:8:141:14 | [true] ! ... | +| local_dataflow.rb:141:9:141:14 | call to use | local_dataflow.rb:141:8:141:14 | ! ... | | local_dataflow.rb:141:9:141:14 | self | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(self) | | local_dataflow.rb:141:9:141:14 | self | local_dataflow.rb:141:20:141:25 | self | | local_dataflow.rb:141:13:141:13 | [post] x | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(x) | | local_dataflow.rb:141:13:141:13 | [post] x | local_dataflow.rb:141:24:141:24 | x | | local_dataflow.rb:141:13:141:13 | x | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(x) | | local_dataflow.rb:141:13:141:13 | x | local_dataflow.rb:141:24:141:24 | x | -| local_dataflow.rb:141:19:141:37 | [false] ( ... ) | local_dataflow.rb:141:8:141:37 | [false] ... \|\| ... | +| local_dataflow.rb:141:19:141:37 | ( ... ) | local_dataflow.rb:141:8:141:37 | ... \|\| ... | | local_dataflow.rb:141:19:141:37 | [input] SSA phi read(self) | local_dataflow.rb:141:38:142:9 | [input] SSA phi read(self) | | local_dataflow.rb:141:19:141:37 | [input] SSA phi read(x) | local_dataflow.rb:141:38:142:9 | [input] SSA phi read(x) | -| local_dataflow.rb:141:19:141:37 | [post] [false] ( ... ) | local_dataflow.rb:141:20:141:36 | [post] [false] ... && ... | -| local_dataflow.rb:141:19:141:37 | [post] [true] ( ... ) | local_dataflow.rb:141:20:141:36 | [post] [true] ... && ... | -| local_dataflow.rb:141:19:141:37 | [true] ( ... ) | local_dataflow.rb:141:8:141:37 | [true] ... \|\| ... | +| local_dataflow.rb:141:19:141:37 | [post] ( ... ) | local_dataflow.rb:141:20:141:36 | [post] ... && ... | | local_dataflow.rb:141:20:141:25 | [input] SSA phi read(self) | local_dataflow.rb:143:11:143:16 | self | | local_dataflow.rb:141:20:141:25 | [input] SSA phi read(x) | local_dataflow.rb:143:15:143:15 | x | | local_dataflow.rb:141:20:141:25 | [post] self | local_dataflow.rb:141:20:141:25 | [input] SSA phi read(self) | | local_dataflow.rb:141:20:141:25 | [post] self | local_dataflow.rb:141:31:141:36 | self | | local_dataflow.rb:141:20:141:25 | self | local_dataflow.rb:141:20:141:25 | [input] SSA phi read(self) | | local_dataflow.rb:141:20:141:25 | self | local_dataflow.rb:141:31:141:36 | self | -| local_dataflow.rb:141:20:141:36 | [false] ... && ... | local_dataflow.rb:141:19:141:37 | [false] ( ... ) | -| local_dataflow.rb:141:20:141:36 | [true] ... && ... | local_dataflow.rb:141:19:141:37 | [true] ( ... ) | +| local_dataflow.rb:141:20:141:36 | ... && ... | local_dataflow.rb:141:19:141:37 | ( ... ) | | local_dataflow.rb:141:24:141:24 | [post] x | local_dataflow.rb:141:20:141:25 | [input] SSA phi read(x) | | local_dataflow.rb:141:24:141:24 | [post] x | local_dataflow.rb:141:35:141:35 | x | | local_dataflow.rb:141:24:141:24 | x | local_dataflow.rb:141:20:141:25 | [input] SSA phi read(x) | | local_dataflow.rb:141:24:141:24 | x | local_dataflow.rb:141:35:141:35 | x | -| local_dataflow.rb:141:30:141:36 | [false] ! ... | local_dataflow.rb:141:20:141:36 | [false] ... && ... | +| local_dataflow.rb:141:30:141:36 | ! ... | local_dataflow.rb:141:20:141:36 | ... && ... | | local_dataflow.rb:141:30:141:36 | [input] SSA phi read(self) | local_dataflow.rb:143:11:143:16 | self | | local_dataflow.rb:141:30:141:36 | [input] SSA phi read(x) | local_dataflow.rb:143:15:143:15 | x | -| local_dataflow.rb:141:30:141:36 | [true] ! ... | local_dataflow.rb:141:20:141:36 | [true] ... && ... | | local_dataflow.rb:141:31:141:36 | [post] self | local_dataflow.rb:141:19:141:37 | [input] SSA phi read(self) | | local_dataflow.rb:141:31:141:36 | [post] self | local_dataflow.rb:141:30:141:36 | [input] SSA phi read(self) | -| local_dataflow.rb:141:31:141:36 | call to use | local_dataflow.rb:141:30:141:36 | [false] ! ... | -| local_dataflow.rb:141:31:141:36 | call to use | local_dataflow.rb:141:30:141:36 | [true] ! ... | +| local_dataflow.rb:141:31:141:36 | call to use | local_dataflow.rb:141:30:141:36 | ! ... | | local_dataflow.rb:141:31:141:36 | self | local_dataflow.rb:141:19:141:37 | [input] SSA phi read(self) | | local_dataflow.rb:141:31:141:36 | self | local_dataflow.rb:141:30:141:36 | [input] SSA phi read(self) | | local_dataflow.rb:141:35:141:35 | [post] x | local_dataflow.rb:141:19:141:37 | [input] SSA phi read(x) | @@ -3441,8 +3242,7 @@ | local_dataflow.rb:143:11:143:16 | [input] SSA phi read(x) | local_dataflow.rb:144:15:144:15 | x | | local_dataflow.rb:143:11:143:16 | [post] self | local_dataflow.rb:143:11:143:16 | [input] SSA phi read(self) | | local_dataflow.rb:143:11:143:16 | [post] self | local_dataflow.rb:143:21:143:26 | self | -| local_dataflow.rb:143:11:143:16 | call to use | local_dataflow.rb:143:11:143:26 | [false] ... \|\| ... | -| local_dataflow.rb:143:11:143:16 | call to use | local_dataflow.rb:143:11:143:26 | [true] ... \|\| ... | +| local_dataflow.rb:143:11:143:16 | call to use | local_dataflow.rb:143:11:143:26 | ... \|\| ... | | local_dataflow.rb:143:11:143:16 | self | local_dataflow.rb:143:11:143:16 | [input] SSA phi read(self) | | local_dataflow.rb:143:11:143:16 | self | local_dataflow.rb:143:21:143:26 | self | | local_dataflow.rb:143:11:143:26 | [input] SSA phi read(self) | local_dataflow.rb:147:5:147:10 | self | @@ -3455,8 +3255,7 @@ | local_dataflow.rb:143:21:143:26 | [input] SSA phi read(x) | local_dataflow.rb:144:15:144:15 | x | | local_dataflow.rb:143:21:143:26 | [post] self | local_dataflow.rb:143:11:143:26 | [input] SSA phi read(self) | | local_dataflow.rb:143:21:143:26 | [post] self | local_dataflow.rb:143:21:143:26 | [input] SSA phi read(self) | -| local_dataflow.rb:143:21:143:26 | call to use | local_dataflow.rb:143:11:143:26 | [false] ... \|\| ... | -| local_dataflow.rb:143:21:143:26 | call to use | local_dataflow.rb:143:11:143:26 | [true] ... \|\| ... | +| local_dataflow.rb:143:21:143:26 | call to use | local_dataflow.rb:143:11:143:26 | ... \|\| ... | | local_dataflow.rb:143:21:143:26 | self | local_dataflow.rb:143:11:143:26 | [input] SSA phi read(self) | | local_dataflow.rb:143:21:143:26 | self | local_dataflow.rb:143:21:143:26 | [input] SSA phi read(self) | | local_dataflow.rb:143:25:143:25 | [post] x | local_dataflow.rb:143:11:143:26 | [input] SSA phi read(x) | diff --git a/ruby/ql/test/library-tests/dataflow/params/TypeTracker.expected b/ruby/ql/test/library-tests/dataflow/params/TypeTracker.expected index 80e9e84a83a1..7eae6c7cfd1e 100644 --- a/ruby/ql/test/library-tests/dataflow/params/TypeTracker.expected +++ b/ruby/ql/test/library-tests/dataflow/params/TypeTracker.expected @@ -3668,6 +3668,7 @@ trackEnd | params_flow.rb:1:11:1:11 | x | params_flow.rb:1:11:1:11 | x | | params_flow.rb:1:11:1:11 | x | params_flow.rb:1:11:1:11 | x | | params_flow.rb:1:11:1:11 | x | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:1:11:1:11 | x | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:1:11:1:11 | x | params_flow.rb:2:5:2:5 | x | | params_flow.rb:1:11:1:11 | x | params_flow.rb:5:10:5:10 | x | | params_flow.rb:1:11:1:11 | x | params_flow.rb:5:10:5:10 | x | @@ -3869,16 +3870,20 @@ trackEnd | params_flow.rb:5:10:5:10 | x | params_flow.rb:5:10:5:10 | x | | params_flow.rb:5:10:5:10 | x | params_flow.rb:5:10:5:10 | x | | params_flow.rb:5:10:5:10 | x | params_flow.rb:6:10:6:10 | x | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:6:5:6:10 | ... | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:6:5:6:10 | call to puts | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:10:5:10:11 | call to sink | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:10:5:11:84 | ... | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:11:5:11:11 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:14:1:14:30 | call to positional | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:17:5:17:11 | call to sink | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:17:5:18:82 | ... | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:18:5:18:11 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:21:1:21:35 | call to keyword | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:22:1:22:35 | call to keyword | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:23:1:23:41 | call to keyword | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:26:5:26:11 | call to sink | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:26:5:30:22 | ... | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:27:5:27:22 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:28:5:28:22 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:29:5:29:22 | call to sink | @@ -3890,14 +3895,17 @@ trackEnd | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:44:1:44:28 | call to positional | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:47:1:47:17 | call to positional | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:50:5:50:11 | call to sink | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:50:5:52:21 | ... | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:51:5:51:21 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:52:5:52:21 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:55:1:55:29 | call to posargs | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:58:1:58:25 | call to posargs | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:61:1:61:14 | call to posargs | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:65:5:65:13 | call to sink | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:65:5:65:33 | ... | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:67:1:67:17 | call to splatstuff | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:70:5:70:10 | call to sink | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:70:5:75:75 | ... | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:71:5:71:10 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:72:5:72:13 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:73:5:73:13 | call to sink | @@ -3906,6 +3914,7 @@ trackEnd | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:78:1:78:63 | call to splatmid | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:81:1:81:37 | call to splatmid | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:84:5:84:10 | call to sink | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:84:5:90:39 | ... | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:85:5:85:10 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:86:5:86:10 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:87:5:87:10 | call to sink | @@ -3915,17 +3924,20 @@ trackEnd | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:94:1:94:48 | call to pos_many | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:96:1:96:88 | call to splatmid | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:99:5:99:10 | call to sink | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:99:5:102:57 | ... | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:100:5:100:18 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:101:5:101:18 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:102:5:102:10 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:105:1:105:49 | call to splatmidsmall | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:106:1:106:46 | call to splatmidsmall | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:109:5:109:10 | call to sink | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:109:5:111:30 | ... | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:110:5:110:13 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:111:5:111:10 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:114:1:114:67 | call to splat_followed_by_keyword_param | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:118:1:118:14 | call to positional | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:121:5:121:10 | call to sink | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:121:5:125:39 | ... | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:122:5:122:10 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:123:5:123:10 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:124:5:124:10 | call to sink | @@ -3933,6 +3945,7 @@ trackEnd | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:128:1:128:61 | call to destruct | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:131:1:131:46 | call to pos_many | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:134:5:134:16 | call to sink | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:134:5:134:36 | ... | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:137:1:137:44 | call to splatall | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:144:1:144:20 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:146:1:146:20 | call to sink | @@ -3951,20 +3964,24 @@ trackEnd | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:191:1:191:11 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:193:1:193:11 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:201:5:201:15 | call to sink | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:201:5:204:15 | ... | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:202:5:202:15 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:203:5:203:15 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:204:5:204:15 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:207:1:207:14 | call to foo | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:211:9:211:15 | call to sink | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:211:9:217:23 | ... | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:212:9:212:21 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:213:9:213:21 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:214:9:214:21 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:215:9:215:16 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:216:9:216:25 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:217:9:217:23 | yield ... | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:223:9:223:13 | ... | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:223:9:223:13 | super call to m | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:227:1:229:3 | call to m | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:228:5:228:11 | call to sink | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:228:5:228:31 | ... | | params_flow.rb:6:5:6:10 | synthetic splat argument | params_flow.rb:6:5:6:10 | synthetic splat argument | | params_flow.rb:9:1:12:3 | &block | params_flow.rb:9:1:12:3 | &block | | params_flow.rb:9:1:12:3 | positional | params_flow.rb:9:1:12:3 | positional | @@ -3992,6 +4009,7 @@ trackEnd | params_flow.rb:9:20:9:21 | p2 | params_flow.rb:11:10:11:11 | p2 | | params_flow.rb:10:5:10:11 | call to sink | params_flow.rb:10:5:10:11 | call to sink | | params_flow.rb:10:5:10:11 | synthetic splat argument | params_flow.rb:10:5:10:11 | synthetic splat argument | +| params_flow.rb:11:5:11:11 | call to sink | params_flow.rb:10:5:11:84 | ... | | params_flow.rb:11:5:11:11 | call to sink | params_flow.rb:11:5:11:11 | call to sink | | params_flow.rb:11:5:11:11 | call to sink | params_flow.rb:14:1:14:30 | call to positional | | params_flow.rb:11:5:11:11 | call to sink | params_flow.rb:44:1:44:28 | call to positional | @@ -4010,6 +4028,7 @@ trackEnd | params_flow.rb:14:12:14:19 | synthetic splat argument | params_flow.rb:14:12:14:19 | synthetic splat argument | | params_flow.rb:14:18:14:18 | 1 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:14:18:14:18 | 1 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:14:18:14:18 | 1 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:14:18:14:18 | 1 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:14:18:14:18 | 1 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:14:18:14:18 | 1 | params_flow.rb:5:10:5:10 | x | @@ -4029,6 +4048,7 @@ trackEnd | params_flow.rb:14:22:14:29 | synthetic splat argument | params_flow.rb:14:22:14:29 | synthetic splat argument | | params_flow.rb:14:28:14:28 | 2 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:14:28:14:28 | 2 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:14:28:14:28 | 2 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:14:28:14:28 | 2 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:14:28:14:28 | 2 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:14:28:14:28 | 2 | params_flow.rb:5:10:5:10 | x | @@ -4064,6 +4084,7 @@ trackEnd | params_flow.rb:16:18:16:19 | p2 | params_flow.rb:18:10:18:11 | p2 | | params_flow.rb:17:5:17:11 | call to sink | params_flow.rb:17:5:17:11 | call to sink | | params_flow.rb:17:5:17:11 | synthetic splat argument | params_flow.rb:17:5:17:11 | synthetic splat argument | +| params_flow.rb:18:5:18:11 | call to sink | params_flow.rb:17:5:18:82 | ... | | params_flow.rb:18:5:18:11 | call to sink | params_flow.rb:18:5:18:11 | call to sink | | params_flow.rb:18:5:18:11 | call to sink | params_flow.rb:21:1:21:35 | call to keyword | | params_flow.rb:18:5:18:11 | call to sink | params_flow.rb:22:1:22:35 | call to keyword | @@ -4084,6 +4105,7 @@ trackEnd | params_flow.rb:21:13:21:20 | synthetic splat argument | params_flow.rb:21:13:21:20 | synthetic splat argument | | params_flow.rb:21:19:21:19 | 3 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:21:19:21:19 | 3 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:21:19:21:19 | 3 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:21:19:21:19 | 3 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:21:19:21:19 | 3 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:21:19:21:19 | 3 | params_flow.rb:5:10:5:10 | x | @@ -4105,6 +4127,7 @@ trackEnd | params_flow.rb:21:27:21:34 | synthetic splat argument | params_flow.rb:21:27:21:34 | synthetic splat argument | | params_flow.rb:21:33:21:33 | 4 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:21:33:21:33 | 4 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:21:33:21:33 | 4 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:21:33:21:33 | 4 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:21:33:21:33 | 4 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:21:33:21:33 | 4 | params_flow.rb:5:10:5:10 | x | @@ -4128,6 +4151,7 @@ trackEnd | params_flow.rb:22:13:22:20 | synthetic splat argument | params_flow.rb:22:13:22:20 | synthetic splat argument | | params_flow.rb:22:19:22:19 | 5 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:22:19:22:19 | 5 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:22:19:22:19 | 5 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:22:19:22:19 | 5 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:22:19:22:19 | 5 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:22:19:22:19 | 5 | params_flow.rb:5:10:5:10 | x | @@ -4149,6 +4173,7 @@ trackEnd | params_flow.rb:22:27:22:34 | synthetic splat argument | params_flow.rb:22:27:22:34 | synthetic splat argument | | params_flow.rb:22:33:22:33 | 6 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:22:33:22:33 | 6 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:22:33:22:33 | 6 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:22:33:22:33 | 6 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:22:33:22:33 | 6 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:22:33:22:33 | 6 | params_flow.rb:5:10:5:10 | x | @@ -4172,6 +4197,7 @@ trackEnd | params_flow.rb:23:16:23:23 | synthetic splat argument | params_flow.rb:23:16:23:23 | synthetic splat argument | | params_flow.rb:23:22:23:22 | 7 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:23:22:23:22 | 7 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:23:22:23:22 | 7 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:23:22:23:22 | 7 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:23:22:23:22 | 7 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:23:22:23:22 | 7 | params_flow.rb:5:10:5:10 | x | @@ -4193,6 +4219,7 @@ trackEnd | params_flow.rb:23:33:23:40 | synthetic splat argument | params_flow.rb:23:33:23:40 | synthetic splat argument | | params_flow.rb:23:39:23:39 | 8 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:23:39:23:39 | 8 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:23:39:23:39 | 8 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:23:39:23:39 | 8 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:23:39:23:39 | 8 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:23:39:23:39 | 8 | params_flow.rb:5:10:5:10 | x | @@ -4258,6 +4285,7 @@ trackEnd | params_flow.rb:29:11:29:21 | ...[...] | params_flow.rb:29:11:29:21 | ...[...] | | params_flow.rb:29:11:29:21 | synthetic splat argument | params_flow.rb:29:11:29:21 | synthetic splat argument | | params_flow.rb:29:18:29:20 | :p3 | params_flow.rb:29:18:29:20 | :p3 | +| params_flow.rb:30:5:30:22 | call to sink | params_flow.rb:26:5:30:22 | ... | | params_flow.rb:30:5:30:22 | call to sink | params_flow.rb:30:5:30:22 | call to sink | | params_flow.rb:30:5:30:22 | call to sink | params_flow.rb:33:1:33:58 | call to kwargs | | params_flow.rb:30:5:30:22 | call to sink | params_flow.rb:35:1:35:29 | call to kwargs | @@ -4292,6 +4320,7 @@ trackEnd | params_flow.rb:33:12:33:19 | synthetic splat argument | params_flow.rb:33:12:33:19 | synthetic splat argument | | params_flow.rb:33:18:33:18 | 9 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:33:18:33:18 | 9 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:33:18:33:18 | 9 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:33:18:33:18 | 9 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:33:18:33:18 | 9 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:33:18:33:18 | 9 | params_flow.rb:5:10:5:10 | x | @@ -4314,6 +4343,7 @@ trackEnd | params_flow.rb:33:26:33:34 | synthetic splat argument | params_flow.rb:33:26:33:34 | synthetic splat argument | | params_flow.rb:33:32:33:33 | 10 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:33:32:33:33 | 10 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:33:32:33:33 | 10 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:33:32:33:33 | 10 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:33:32:33:33 | 10 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:33:32:33:33 | 10 | params_flow.rb:5:10:5:10 | x | @@ -4333,6 +4363,7 @@ trackEnd | params_flow.rb:33:41:33:49 | synthetic splat argument | params_flow.rb:33:41:33:49 | synthetic splat argument | | params_flow.rb:33:47:33:48 | 11 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:33:47:33:48 | 11 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:33:47:33:48 | 11 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:33:47:33:48 | 11 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:33:47:33:48 | 11 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:33:47:33:48 | 11 | params_flow.rb:5:10:5:10 | x | @@ -4371,6 +4402,7 @@ trackEnd | params_flow.rb:34:14:34:22 | synthetic splat argument | params_flow.rb:34:14:34:22 | synthetic splat argument | | params_flow.rb:34:20:34:21 | 12 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:34:20:34:21 | 12 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:34:20:34:21 | 12 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:34:20:34:21 | 12 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:34:20:34:21 | 12 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:34:20:34:21 | 12 | params_flow.rb:5:10:5:10 | x | @@ -4409,6 +4441,7 @@ trackEnd | params_flow.rb:35:12:35:20 | synthetic splat argument | params_flow.rb:35:12:35:20 | synthetic splat argument | | params_flow.rb:35:18:35:19 | 13 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:35:18:35:19 | 13 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:35:18:35:19 | 13 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:35:18:35:19 | 13 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:35:18:35:19 | 13 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:35:18:35:19 | 13 | params_flow.rb:5:10:5:10 | x | @@ -4453,6 +4486,7 @@ trackEnd | params_flow.rb:37:16:37:24 | synthetic splat argument | params_flow.rb:37:16:37:24 | synthetic splat argument | | params_flow.rb:37:22:37:23 | 14 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:37:22:37:23 | 14 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:37:22:37:23 | 14 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:37:22:37:23 | 14 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:37:22:37:23 | 14 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:37:22:37:23 | 14 | params_flow.rb:5:10:5:10 | x | @@ -4475,6 +4509,7 @@ trackEnd | params_flow.rb:37:34:37:42 | synthetic splat argument | params_flow.rb:37:34:37:42 | synthetic splat argument | | params_flow.rb:37:40:37:41 | 15 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:37:40:37:41 | 15 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:37:40:37:41 | 15 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:37:40:37:41 | 15 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:37:40:37:41 | 15 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:37:40:37:41 | 15 | params_flow.rb:5:10:5:10 | x | @@ -4515,6 +4550,7 @@ trackEnd | params_flow.rb:40:16:40:24 | synthetic splat argument | params_flow.rb:40:16:40:24 | synthetic splat argument | | params_flow.rb:40:22:40:23 | 16 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:40:22:40:23 | 16 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:40:22:40:23 | 16 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:40:22:40:23 | 16 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:40:22:40:23 | 16 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:40:22:40:23 | 16 | params_flow.rb:5:10:5:10 | x | @@ -4538,6 +4574,7 @@ trackEnd | params_flow.rb:41:13:41:21 | synthetic splat argument | params_flow.rb:41:13:41:21 | synthetic splat argument | | params_flow.rb:41:19:41:20 | 17 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:41:19:41:20 | 17 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:41:19:41:20 | 17 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:41:19:41:20 | 17 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:41:19:41:20 | 17 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:41:19:41:20 | 17 | params_flow.rb:5:10:5:10 | x | @@ -4582,6 +4619,7 @@ trackEnd | params_flow.rb:43:9:43:17 | synthetic splat argument | params_flow.rb:43:9:43:17 | synthetic splat argument | | params_flow.rb:43:15:43:16 | 17 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:43:15:43:16 | 17 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:43:15:43:16 | 17 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:43:15:43:16 | 17 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:43:15:43:16 | 17 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:43:15:43:16 | 17 | params_flow.rb:5:10:5:10 | x | @@ -4604,6 +4642,7 @@ trackEnd | params_flow.rb:44:12:44:20 | synthetic splat argument | params_flow.rb:44:12:44:20 | synthetic splat argument | | params_flow.rb:44:18:44:19 | 16 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:44:18:44:19 | 16 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:44:18:44:19 | 16 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:44:18:44:19 | 16 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:44:18:44:19 | 16 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:44:18:44:19 | 16 | params_flow.rb:5:10:5:10 | x | @@ -4647,6 +4686,7 @@ trackEnd | params_flow.rb:46:9:46:17 | synthetic splat argument | params_flow.rb:46:9:46:17 | synthetic splat argument | | params_flow.rb:46:15:46:16 | 18 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:46:15:46:16 | 18 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:46:15:46:16 | 18 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:46:15:46:16 | 18 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:46:15:46:16 | 18 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:46:15:46:16 | 18 | params_flow.rb:5:10:5:10 | x | @@ -4666,6 +4706,7 @@ trackEnd | params_flow.rb:46:20:46:28 | synthetic splat argument | params_flow.rb:46:20:46:28 | synthetic splat argument | | params_flow.rb:46:26:46:27 | 19 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:46:26:46:27 | 19 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:46:26:46:27 | 19 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:46:26:46:27 | 19 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:46:26:46:27 | 19 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:46:26:46:27 | 19 | params_flow.rb:5:10:5:10 | x | @@ -4712,6 +4753,7 @@ trackEnd | params_flow.rb:51:11:51:20 | ...[...] | params_flow.rb:51:11:51:20 | ...[...] | | params_flow.rb:51:11:51:20 | synthetic splat argument | params_flow.rb:51:11:51:20 | synthetic splat argument | | params_flow.rb:51:19:51:19 | 0 | params_flow.rb:51:19:51:19 | 0 | +| params_flow.rb:52:5:52:21 | call to sink | params_flow.rb:50:5:52:21 | ... | | params_flow.rb:52:5:52:21 | call to sink | params_flow.rb:52:5:52:21 | call to sink | | params_flow.rb:52:5:52:21 | call to sink | params_flow.rb:55:1:55:29 | call to posargs | | params_flow.rb:52:5:52:21 | call to sink | params_flow.rb:58:1:58:25 | call to posargs | @@ -4737,6 +4779,7 @@ trackEnd | params_flow.rb:55:9:55:17 | synthetic splat argument | params_flow.rb:55:9:55:17 | synthetic splat argument | | params_flow.rb:55:15:55:16 | 20 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:55:15:55:16 | 20 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:55:15:55:16 | 20 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:55:15:55:16 | 20 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:55:15:55:16 | 20 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:55:15:55:16 | 20 | params_flow.rb:5:10:5:10 | x | @@ -4755,6 +4798,7 @@ trackEnd | params_flow.rb:55:20:55:28 | synthetic splat argument | params_flow.rb:55:20:55:28 | synthetic splat argument | | params_flow.rb:55:26:55:27 | 21 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:55:26:55:27 | 21 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:55:26:55:27 | 21 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:55:26:55:27 | 21 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:55:26:55:27 | 21 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:55:26:55:27 | 21 | params_flow.rb:5:10:5:10 | x | @@ -4793,6 +4837,7 @@ trackEnd | params_flow.rb:57:9:57:17 | synthetic splat argument | params_flow.rb:57:9:57:17 | synthetic splat argument | | params_flow.rb:57:15:57:16 | 22 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:57:15:57:16 | 22 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:57:15:57:16 | 22 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:57:15:57:16 | 22 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:57:15:57:16 | 22 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:57:15:57:16 | 22 | params_flow.rb:5:10:5:10 | x | @@ -4813,6 +4858,7 @@ trackEnd | params_flow.rb:58:9:58:17 | synthetic splat argument | params_flow.rb:58:9:58:17 | synthetic splat argument | | params_flow.rb:58:15:58:16 | 23 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:58:15:58:16 | 23 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:58:15:58:16 | 23 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:58:15:58:16 | 23 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:58:15:58:16 | 23 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:58:15:58:16 | 23 | params_flow.rb:5:10:5:10 | x | @@ -4860,6 +4906,7 @@ trackEnd | params_flow.rb:60:9:60:17 | synthetic splat argument | params_flow.rb:60:9:60:17 | synthetic splat argument | | params_flow.rb:60:15:60:16 | 24 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:60:15:60:16 | 24 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:60:15:60:16 | 24 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:60:15:60:16 | 24 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:60:15:60:16 | 24 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:60:15:60:16 | 24 | params_flow.rb:5:10:5:10 | x | @@ -4878,6 +4925,7 @@ trackEnd | params_flow.rb:60:20:60:28 | synthetic splat argument | params_flow.rb:60:20:60:28 | synthetic splat argument | | params_flow.rb:60:26:60:27 | 25 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:60:26:60:27 | 25 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:60:26:60:27 | 25 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:60:26:60:27 | 25 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:60:26:60:27 | 25 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:60:26:60:27 | 25 | params_flow.rb:5:10:5:10 | x | @@ -4901,6 +4949,7 @@ trackEnd | params_flow.rb:63:8:63:16 | synthetic splat argument | params_flow.rb:63:8:63:16 | synthetic splat argument | | params_flow.rb:63:14:63:15 | 26 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:63:14:63:15 | 26 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:63:14:63:15 | 26 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:63:14:63:15 | 26 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:63:14:63:15 | 26 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:63:14:63:15 | 26 | params_flow.rb:5:10:5:10 | x | @@ -4924,6 +4973,7 @@ trackEnd | params_flow.rb:64:16:64:17 | *x | params_flow.rb:65:10:65:10 | x | | params_flow.rb:64:17:64:17 | x | params_flow.rb:64:17:64:17 | x | | params_flow.rb:65:5:65:13 | call to sink | params_flow.rb:65:5:65:13 | call to sink | +| params_flow.rb:65:5:65:13 | call to sink | params_flow.rb:65:5:65:33 | ... | | params_flow.rb:65:5:65:13 | call to sink | params_flow.rb:67:1:67:17 | call to splatstuff | | params_flow.rb:65:5:65:13 | synthetic splat argument | params_flow.rb:65:5:65:13 | synthetic splat argument | | params_flow.rb:65:10:65:13 | ...[...] | params_flow.rb:5:10:5:10 | x | @@ -5006,6 +5056,7 @@ trackEnd | params_flow.rb:73:12:73:12 | 1 | params_flow.rb:73:12:73:12 | 1 | | params_flow.rb:74:5:74:10 | call to sink | params_flow.rb:74:5:74:10 | call to sink | | params_flow.rb:74:5:74:10 | synthetic splat argument | params_flow.rb:74:5:74:10 | synthetic splat argument | +| params_flow.rb:75:5:75:10 | call to sink | params_flow.rb:70:5:75:75 | ... | | params_flow.rb:75:5:75:10 | call to sink | params_flow.rb:75:5:75:10 | call to sink | | params_flow.rb:75:5:75:10 | call to sink | params_flow.rb:78:1:78:63 | call to splatmid | | params_flow.rb:75:5:75:10 | call to sink | params_flow.rb:81:1:81:37 | call to splatmid | @@ -5024,6 +5075,7 @@ trackEnd | params_flow.rb:78:10:78:18 | synthetic splat argument | params_flow.rb:78:10:78:18 | synthetic splat argument | | params_flow.rb:78:16:78:17 | 27 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:78:16:78:17 | 27 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:78:16:78:17 | 27 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:78:16:78:17 | 27 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:78:16:78:17 | 27 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:78:16:78:17 | 27 | params_flow.rb:5:10:5:10 | x | @@ -5043,6 +5095,7 @@ trackEnd | params_flow.rb:78:21:78:29 | synthetic splat argument | params_flow.rb:78:21:78:29 | synthetic splat argument | | params_flow.rb:78:27:78:28 | 28 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:78:27:78:28 | 28 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:78:27:78:28 | 28 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:78:27:78:28 | 28 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:78:27:78:28 | 28 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:78:27:78:28 | 28 | params_flow.rb:5:10:5:10 | x | @@ -5056,6 +5109,7 @@ trackEnd | params_flow.rb:78:32:78:40 | synthetic splat argument | params_flow.rb:78:32:78:40 | synthetic splat argument | | params_flow.rb:78:38:78:39 | 29 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:78:38:78:39 | 29 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:78:38:78:39 | 29 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:78:38:78:39 | 29 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:78:38:78:39 | 29 | params_flow.rb:78:32:78:40 | call to taint | | params_flow.rb:78:38:78:39 | 29 | params_flow.rb:78:38:78:39 | 29 | @@ -5063,6 +5117,7 @@ trackEnd | params_flow.rb:78:43:78:51 | synthetic splat argument | params_flow.rb:78:43:78:51 | synthetic splat argument | | params_flow.rb:78:49:78:50 | 30 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:78:49:78:50 | 30 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:78:49:78:50 | 30 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:78:49:78:50 | 30 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:78:49:78:50 | 30 | params_flow.rb:78:43:78:51 | call to taint | | params_flow.rb:78:49:78:50 | 30 | params_flow.rb:78:49:78:50 | 30 | @@ -5070,6 +5125,7 @@ trackEnd | params_flow.rb:78:54:78:62 | synthetic splat argument | params_flow.rb:78:54:78:62 | synthetic splat argument | | params_flow.rb:78:60:78:61 | 31 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:78:60:78:61 | 31 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:78:60:78:61 | 31 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:78:60:78:61 | 31 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:78:60:78:61 | 31 | params_flow.rb:78:54:78:62 | call to taint | | params_flow.rb:78:60:78:61 | 31 | params_flow.rb:78:60:78:61 | 31 | @@ -5106,6 +5162,7 @@ trackEnd | params_flow.rb:80:9:80:17 | synthetic splat argument | params_flow.rb:80:9:80:17 | synthetic splat argument | | params_flow.rb:80:15:80:16 | 33 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:80:15:80:16 | 33 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:80:15:80:16 | 33 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:80:15:80:16 | 33 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:80:15:80:16 | 33 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:80:15:80:16 | 33 | params_flow.rb:5:10:5:10 | x | @@ -5119,6 +5176,7 @@ trackEnd | params_flow.rb:80:20:80:28 | synthetic splat argument | params_flow.rb:80:20:80:28 | synthetic splat argument | | params_flow.rb:80:26:80:27 | 34 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:80:26:80:27 | 34 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:80:26:80:27 | 34 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:80:26:80:27 | 34 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:80:26:80:27 | 34 | params_flow.rb:80:20:80:28 | call to taint | | params_flow.rb:80:26:80:27 | 34 | params_flow.rb:80:26:80:27 | 34 | @@ -5126,6 +5184,7 @@ trackEnd | params_flow.rb:80:31:80:39 | synthetic splat argument | params_flow.rb:80:31:80:39 | synthetic splat argument | | params_flow.rb:80:37:80:38 | 35 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:80:37:80:38 | 35 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:80:37:80:38 | 35 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:80:37:80:38 | 35 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:80:37:80:38 | 35 | params_flow.rb:80:31:80:39 | call to taint | | params_flow.rb:80:37:80:38 | 35 | params_flow.rb:80:37:80:38 | 35 | @@ -5133,6 +5192,7 @@ trackEnd | params_flow.rb:80:42:80:50 | synthetic splat argument | params_flow.rb:80:42:80:50 | synthetic splat argument | | params_flow.rb:80:48:80:49 | 36 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:80:48:80:49 | 36 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:80:48:80:49 | 36 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:80:48:80:49 | 36 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:80:48:80:49 | 36 | params_flow.rb:80:42:80:50 | call to taint | | params_flow.rb:80:48:80:49 | 36 | params_flow.rb:80:48:80:49 | 36 | @@ -5149,6 +5209,7 @@ trackEnd | params_flow.rb:81:10:81:18 | synthetic splat argument | params_flow.rb:81:10:81:18 | synthetic splat argument | | params_flow.rb:81:16:81:17 | 32 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:81:16:81:17 | 32 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:81:16:81:17 | 32 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:81:16:81:17 | 32 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:81:16:81:17 | 32 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:81:16:81:17 | 32 | params_flow.rb:5:10:5:10 | x | @@ -5163,6 +5224,7 @@ trackEnd | params_flow.rb:81:28:81:36 | synthetic splat argument | params_flow.rb:81:28:81:36 | synthetic splat argument | | params_flow.rb:81:34:81:35 | 37 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:81:34:81:35 | 37 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:81:34:81:35 | 37 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:81:34:81:35 | 37 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:81:34:81:35 | 37 | params_flow.rb:81:28:81:36 | call to taint | | params_flow.rb:81:34:81:35 | 37 | params_flow.rb:81:34:81:35 | 37 | @@ -5242,6 +5304,7 @@ trackEnd | params_flow.rb:88:5:88:10 | synthetic splat argument | params_flow.rb:88:5:88:10 | synthetic splat argument | | params_flow.rb:89:5:89:10 | call to sink | params_flow.rb:89:5:89:10 | call to sink | | params_flow.rb:89:5:89:10 | synthetic splat argument | params_flow.rb:89:5:89:10 | synthetic splat argument | +| params_flow.rb:90:5:90:10 | call to sink | params_flow.rb:84:5:90:39 | ... | | params_flow.rb:90:5:90:10 | call to sink | params_flow.rb:90:5:90:10 | call to sink | | params_flow.rb:90:5:90:10 | call to sink | params_flow.rb:94:1:94:48 | call to pos_many | | params_flow.rb:90:5:90:10 | call to sink | params_flow.rb:131:1:131:46 | call to pos_many | @@ -5279,6 +5342,7 @@ trackEnd | params_flow.rb:93:9:93:17 | synthetic splat argument | params_flow.rb:93:9:93:17 | synthetic splat argument | | params_flow.rb:93:15:93:16 | 40 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:93:15:93:16 | 40 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:93:15:93:16 | 40 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:93:15:93:16 | 40 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:93:15:93:16 | 40 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:93:15:93:16 | 40 | params_flow.rb:5:10:5:10 | x | @@ -5298,6 +5362,7 @@ trackEnd | params_flow.rb:93:20:93:28 | synthetic splat argument | params_flow.rb:93:20:93:28 | synthetic splat argument | | params_flow.rb:93:26:93:27 | 41 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:93:26:93:27 | 41 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:93:26:93:27 | 41 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:93:26:93:27 | 41 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:93:26:93:27 | 41 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:93:26:93:27 | 41 | params_flow.rb:5:10:5:10 | x | @@ -5317,6 +5382,7 @@ trackEnd | params_flow.rb:93:31:93:39 | synthetic splat argument | params_flow.rb:93:31:93:39 | synthetic splat argument | | params_flow.rb:93:37:93:38 | 42 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:93:37:93:38 | 42 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:93:37:93:38 | 42 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:93:37:93:38 | 42 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:93:37:93:38 | 42 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:93:37:93:38 | 42 | params_flow.rb:5:10:5:10 | x | @@ -5336,6 +5402,7 @@ trackEnd | params_flow.rb:93:42:93:50 | synthetic splat argument | params_flow.rb:93:42:93:50 | synthetic splat argument | | params_flow.rb:93:48:93:49 | 43 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:93:48:93:49 | 43 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:93:48:93:49 | 43 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:93:48:93:49 | 43 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:93:48:93:49 | 43 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:93:48:93:49 | 43 | params_flow.rb:5:10:5:10 | x | @@ -5358,6 +5425,7 @@ trackEnd | params_flow.rb:94:10:94:18 | synthetic splat argument | params_flow.rb:94:10:94:18 | synthetic splat argument | | params_flow.rb:94:16:94:17 | 38 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:94:16:94:17 | 38 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:94:16:94:17 | 38 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:94:16:94:17 | 38 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:94:16:94:17 | 38 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:94:16:94:17 | 38 | params_flow.rb:5:10:5:10 | x | @@ -5377,6 +5445,7 @@ trackEnd | params_flow.rb:94:21:94:29 | synthetic splat argument | params_flow.rb:94:21:94:29 | synthetic splat argument | | params_flow.rb:94:27:94:28 | 39 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:94:27:94:28 | 39 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:94:27:94:28 | 39 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:94:27:94:28 | 39 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:94:27:94:28 | 39 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:94:27:94:28 | 39 | params_flow.rb:5:10:5:10 | x | @@ -5391,6 +5460,7 @@ trackEnd | params_flow.rb:94:39:94:47 | synthetic splat argument | params_flow.rb:94:39:94:47 | synthetic splat argument | | params_flow.rb:94:45:94:46 | 44 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:94:45:94:46 | 44 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:94:45:94:46 | 44 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:94:45:94:46 | 44 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:94:45:94:46 | 44 | params_flow.rb:94:39:94:47 | call to taint | | params_flow.rb:94:45:94:46 | 44 | params_flow.rb:94:45:94:46 | 44 | @@ -5406,6 +5476,7 @@ trackEnd | params_flow.rb:96:10:96:18 | synthetic splat argument | params_flow.rb:96:10:96:18 | synthetic splat argument | | params_flow.rb:96:16:96:17 | 45 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:96:16:96:17 | 45 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:96:16:96:17 | 45 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:96:16:96:17 | 45 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:96:16:96:17 | 45 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:96:16:96:17 | 45 | params_flow.rb:5:10:5:10 | x | @@ -5425,6 +5496,7 @@ trackEnd | params_flow.rb:96:21:96:29 | synthetic splat argument | params_flow.rb:96:21:96:29 | synthetic splat argument | | params_flow.rb:96:27:96:28 | 46 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:96:27:96:28 | 46 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:96:27:96:28 | 46 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:96:27:96:28 | 46 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:96:27:96:28 | 46 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:96:27:96:28 | 46 | params_flow.rb:5:10:5:10 | x | @@ -5443,6 +5515,7 @@ trackEnd | params_flow.rb:96:34:96:42 | synthetic splat argument | params_flow.rb:96:34:96:42 | synthetic splat argument | | params_flow.rb:96:40:96:41 | 47 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:96:40:96:41 | 47 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:96:40:96:41 | 47 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:96:40:96:41 | 47 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:96:40:96:41 | 47 | params_flow.rb:96:34:96:42 | call to taint | | params_flow.rb:96:40:96:41 | 47 | params_flow.rb:96:40:96:41 | 47 | @@ -5450,6 +5523,7 @@ trackEnd | params_flow.rb:96:45:96:53 | synthetic splat argument | params_flow.rb:96:45:96:53 | synthetic splat argument | | params_flow.rb:96:51:96:52 | 48 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:96:51:96:52 | 48 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:96:51:96:52 | 48 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:96:51:96:52 | 48 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:96:51:96:52 | 48 | params_flow.rb:96:45:96:53 | call to taint | | params_flow.rb:96:51:96:52 | 48 | params_flow.rb:96:51:96:52 | 48 | @@ -5457,6 +5531,7 @@ trackEnd | params_flow.rb:96:56:96:64 | synthetic splat argument | params_flow.rb:96:56:96:64 | synthetic splat argument | | params_flow.rb:96:62:96:63 | 49 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:96:62:96:63 | 49 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:96:62:96:63 | 49 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:96:62:96:63 | 49 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:96:62:96:63 | 49 | params_flow.rb:96:56:96:64 | call to taint | | params_flow.rb:96:62:96:63 | 49 | params_flow.rb:96:62:96:63 | 49 | @@ -5464,6 +5539,7 @@ trackEnd | params_flow.rb:96:68:96:76 | synthetic splat argument | params_flow.rb:96:68:96:76 | synthetic splat argument | | params_flow.rb:96:74:96:75 | 50 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:96:74:96:75 | 50 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:96:74:96:75 | 50 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:96:74:96:75 | 50 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:96:74:96:75 | 50 | params_flow.rb:96:68:96:76 | call to taint | | params_flow.rb:96:74:96:75 | 50 | params_flow.rb:96:74:96:75 | 50 | @@ -5471,6 +5547,7 @@ trackEnd | params_flow.rb:96:79:96:87 | synthetic splat argument | params_flow.rb:96:79:96:87 | synthetic splat argument | | params_flow.rb:96:85:96:86 | 51 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:96:85:96:86 | 51 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:96:85:96:86 | 51 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:96:85:96:86 | 51 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:96:85:96:86 | 51 | params_flow.rb:96:79:96:87 | call to taint | | params_flow.rb:96:85:96:86 | 51 | params_flow.rb:96:85:96:86 | 51 | @@ -5523,6 +5600,7 @@ trackEnd | params_flow.rb:101:10:101:18 | ...[...] | params_flow.rb:101:10:101:18 | ...[...] | | params_flow.rb:101:10:101:18 | synthetic splat argument | params_flow.rb:101:10:101:18 | synthetic splat argument | | params_flow.rb:101:17:101:17 | 1 | params_flow.rb:101:17:101:17 | 1 | +| params_flow.rb:102:5:102:10 | call to sink | params_flow.rb:99:5:102:57 | ... | | params_flow.rb:102:5:102:10 | call to sink | params_flow.rb:102:5:102:10 | call to sink | | params_flow.rb:102:5:102:10 | call to sink | params_flow.rb:105:1:105:49 | call to splatmidsmall | | params_flow.rb:102:5:102:10 | call to sink | params_flow.rb:106:1:106:46 | call to splatmidsmall | @@ -5539,6 +5617,7 @@ trackEnd | params_flow.rb:105:15:105:23 | synthetic splat argument | params_flow.rb:105:15:105:23 | synthetic splat argument | | params_flow.rb:105:21:105:22 | 52 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:105:21:105:22 | 52 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:105:21:105:22 | 52 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:105:21:105:22 | 52 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:105:21:105:22 | 52 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:105:21:105:22 | 52 | params_flow.rb:5:10:5:10 | x | @@ -5557,6 +5636,7 @@ trackEnd | params_flow.rb:105:28:105:36 | synthetic splat argument | params_flow.rb:105:28:105:36 | synthetic splat argument | | params_flow.rb:105:34:105:35 | 53 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:105:34:105:35 | 53 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:105:34:105:35 | 53 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:105:34:105:35 | 53 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:105:34:105:35 | 53 | params_flow.rb:105:28:105:36 | call to taint | | params_flow.rb:105:34:105:35 | 53 | params_flow.rb:105:34:105:35 | 53 | @@ -5564,6 +5644,7 @@ trackEnd | params_flow.rb:105:39:105:47 | synthetic splat argument | params_flow.rb:105:39:105:47 | synthetic splat argument | | params_flow.rb:105:45:105:46 | 54 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:105:45:105:46 | 54 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:105:45:105:46 | 54 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:105:45:105:46 | 54 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:105:45:105:46 | 54 | params_flow.rb:105:39:105:47 | call to taint | | params_flow.rb:105:45:105:46 | 54 | params_flow.rb:105:45:105:46 | 54 | @@ -5580,6 +5661,7 @@ trackEnd | params_flow.rb:106:15:106:23 | synthetic splat argument | params_flow.rb:106:15:106:23 | synthetic splat argument | | params_flow.rb:106:21:106:22 | 55 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:106:21:106:22 | 55 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:106:21:106:22 | 55 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:106:21:106:22 | 55 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:106:21:106:22 | 55 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:106:21:106:22 | 55 | params_flow.rb:5:10:5:10 | x | @@ -5593,6 +5675,7 @@ trackEnd | params_flow.rb:106:26:106:34 | synthetic splat argument | params_flow.rb:106:26:106:34 | synthetic splat argument | | params_flow.rb:106:32:106:33 | 56 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:106:32:106:33 | 56 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:106:32:106:33 | 56 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:106:32:106:33 | 56 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:106:32:106:33 | 56 | params_flow.rb:106:26:106:34 | call to taint | | params_flow.rb:106:32:106:33 | 56 | params_flow.rb:106:32:106:33 | 56 | @@ -5600,6 +5683,7 @@ trackEnd | params_flow.rb:106:37:106:45 | synthetic splat argument | params_flow.rb:106:37:106:45 | synthetic splat argument | | params_flow.rb:106:43:106:44 | 57 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:106:43:106:44 | 57 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:106:43:106:44 | 57 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:106:43:106:44 | 57 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:106:43:106:44 | 57 | params_flow.rb:106:37:106:45 | call to taint | | params_flow.rb:106:43:106:44 | 57 | params_flow.rb:106:43:106:44 | 57 | @@ -5643,6 +5727,7 @@ trackEnd | params_flow.rb:110:10:110:13 | ...[...] | params_flow.rb:110:10:110:13 | ...[...] | | params_flow.rb:110:10:110:13 | synthetic splat argument | params_flow.rb:110:10:110:13 | synthetic splat argument | | params_flow.rb:110:12:110:12 | 0 | params_flow.rb:110:12:110:12 | 0 | +| params_flow.rb:111:5:111:10 | call to sink | params_flow.rb:109:5:111:30 | ... | | params_flow.rb:111:5:111:10 | call to sink | params_flow.rb:111:5:111:10 | call to sink | | params_flow.rb:111:5:111:10 | call to sink | params_flow.rb:114:1:114:67 | call to splat_followed_by_keyword_param | | params_flow.rb:111:5:111:10 | synthetic splat argument | params_flow.rb:111:5:111:10 | synthetic splat argument | @@ -5660,6 +5745,7 @@ trackEnd | params_flow.rb:114:33:114:41 | synthetic splat argument | params_flow.rb:114:33:114:41 | synthetic splat argument | | params_flow.rb:114:39:114:40 | 58 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:114:39:114:40 | 58 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:114:39:114:40 | 58 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:114:39:114:40 | 58 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:114:39:114:40 | 58 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:114:39:114:40 | 58 | params_flow.rb:5:10:5:10 | x | @@ -5677,6 +5763,7 @@ trackEnd | params_flow.rb:114:44:114:52 | synthetic splat argument | params_flow.rb:114:44:114:52 | synthetic splat argument | | params_flow.rb:114:50:114:51 | 59 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:114:50:114:51 | 59 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:114:50:114:51 | 59 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:114:50:114:51 | 59 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:114:50:114:51 | 59 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:114:50:114:51 | 59 | params_flow.rb:5:10:5:10 | x | @@ -5696,6 +5783,7 @@ trackEnd | params_flow.rb:114:58:114:66 | synthetic splat argument | params_flow.rb:114:58:114:66 | synthetic splat argument | | params_flow.rb:114:64:114:65 | 60 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:114:64:114:65 | 60 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:114:64:114:65 | 60 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:114:64:114:65 | 60 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:114:64:114:65 | 60 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:114:64:114:65 | 60 | params_flow.rb:5:10:5:10 | x | @@ -5747,6 +5835,7 @@ trackEnd | params_flow.rb:117:19:117:27 | synthetic splat argument | params_flow.rb:117:19:117:27 | synthetic splat argument | | params_flow.rb:117:25:117:26 | 61 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:117:25:117:26 | 61 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:117:25:117:26 | 61 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:117:25:117:26 | 61 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:117:25:117:26 | 61 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:117:25:117:26 | 61 | params_flow.rb:5:10:5:10 | x | @@ -5816,6 +5905,7 @@ trackEnd | params_flow.rb:123:5:123:10 | synthetic splat argument | params_flow.rb:123:5:123:10 | synthetic splat argument | | params_flow.rb:124:5:124:10 | call to sink | params_flow.rb:124:5:124:10 | call to sink | | params_flow.rb:124:5:124:10 | synthetic splat argument | params_flow.rb:124:5:124:10 | synthetic splat argument | +| params_flow.rb:125:5:125:10 | call to sink | params_flow.rb:121:5:125:39 | ... | | params_flow.rb:125:5:125:10 | call to sink | params_flow.rb:125:5:125:10 | call to sink | | params_flow.rb:125:5:125:10 | call to sink | params_flow.rb:128:1:128:61 | call to destruct | | params_flow.rb:125:5:125:10 | synthetic splat argument | params_flow.rb:125:5:125:10 | synthetic splat argument | @@ -5829,6 +5919,7 @@ trackEnd | params_flow.rb:128:11:128:19 | synthetic splat argument | params_flow.rb:128:11:128:19 | synthetic splat argument | | params_flow.rb:128:17:128:18 | 62 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:128:17:128:18 | 62 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:128:17:128:18 | 62 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:128:17:128:18 | 62 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:128:17:128:18 | 62 | params_flow.rb:128:11:128:19 | call to taint | | params_flow.rb:128:17:128:18 | 62 | params_flow.rb:128:17:128:18 | 62 | @@ -5836,6 +5927,7 @@ trackEnd | params_flow.rb:128:22:128:30 | synthetic splat argument | params_flow.rb:128:22:128:30 | synthetic splat argument | | params_flow.rb:128:28:128:29 | 63 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:128:28:128:29 | 63 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:128:28:128:29 | 63 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:128:28:128:29 | 63 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:128:28:128:29 | 63 | params_flow.rb:128:22:128:30 | call to taint | | params_flow.rb:128:28:128:29 | 63 | params_flow.rb:128:28:128:29 | 63 | @@ -5847,6 +5939,7 @@ trackEnd | params_flow.rb:128:35:128:43 | synthetic splat argument | params_flow.rb:128:35:128:43 | synthetic splat argument | | params_flow.rb:128:41:128:42 | 64 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:128:41:128:42 | 64 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:128:41:128:42 | 64 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:128:41:128:42 | 64 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:128:41:128:42 | 64 | params_flow.rb:128:35:128:43 | call to taint | | params_flow.rb:128:41:128:42 | 64 | params_flow.rb:128:41:128:42 | 64 | @@ -5859,6 +5952,7 @@ trackEnd | params_flow.rb:128:50:128:58 | synthetic splat argument | params_flow.rb:128:50:128:58 | synthetic splat argument | | params_flow.rb:128:56:128:57 | 65 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:128:56:128:57 | 65 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:128:56:128:57 | 65 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:128:56:128:57 | 65 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:128:56:128:57 | 65 | params_flow.rb:128:50:128:58 | call to taint | | params_flow.rb:128:56:128:57 | 65 | params_flow.rb:128:56:128:57 | 65 | @@ -5895,6 +5989,7 @@ trackEnd | params_flow.rb:130:9:130:17 | synthetic splat argument | params_flow.rb:130:9:130:17 | synthetic splat argument | | params_flow.rb:130:15:130:16 | 66 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:130:15:130:16 | 66 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:130:15:130:16 | 66 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:130:15:130:16 | 66 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:130:15:130:16 | 66 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:130:15:130:16 | 66 | params_flow.rb:5:10:5:10 | x | @@ -5914,6 +6009,7 @@ trackEnd | params_flow.rb:130:20:130:28 | synthetic splat argument | params_flow.rb:130:20:130:28 | synthetic splat argument | | params_flow.rb:130:26:130:27 | 67 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:130:26:130:27 | 67 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:130:26:130:27 | 67 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:130:26:130:27 | 67 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:130:26:130:27 | 67 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:130:26:130:27 | 67 | params_flow.rb:5:10:5:10 | x | @@ -5930,6 +6026,7 @@ trackEnd | params_flow.rb:131:17:131:25 | synthetic splat argument | params_flow.rb:131:17:131:25 | synthetic splat argument | | params_flow.rb:131:23:131:24 | 68 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:131:23:131:24 | 68 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:131:23:131:24 | 68 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:131:23:131:24 | 68 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:131:23:131:24 | 68 | params_flow.rb:131:17:131:25 | call to taint | | params_flow.rb:131:23:131:24 | 68 | params_flow.rb:131:23:131:24 | 68 | @@ -5950,6 +6047,7 @@ trackEnd | params_flow.rb:133:14:133:18 | *args | params_flow.rb:134:10:134:13 | args | | params_flow.rb:133:15:133:18 | args | params_flow.rb:133:15:133:18 | args | | params_flow.rb:134:5:134:16 | call to sink | params_flow.rb:134:5:134:16 | call to sink | +| params_flow.rb:134:5:134:16 | call to sink | params_flow.rb:134:5:134:36 | ... | | params_flow.rb:134:5:134:16 | call to sink | params_flow.rb:137:1:137:44 | call to splatall | | params_flow.rb:134:5:134:16 | synthetic splat argument | params_flow.rb:134:5:134:16 | synthetic splat argument | | params_flow.rb:134:10:134:16 | ...[...] | params_flow.rb:5:10:5:10 | x | @@ -5971,6 +6069,7 @@ trackEnd | params_flow.rb:137:12:137:20 | synthetic splat argument | params_flow.rb:137:12:137:20 | synthetic splat argument | | params_flow.rb:137:18:137:19 | 69 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:137:18:137:19 | 69 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:137:18:137:19 | 69 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:137:18:137:19 | 69 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:137:18:137:19 | 69 | params_flow.rb:137:12:137:20 | call to taint | | params_flow.rb:137:18:137:19 | 69 | params_flow.rb:137:18:137:19 | 69 | @@ -5982,6 +6081,7 @@ trackEnd | params_flow.rb:137:23:137:31 | synthetic splat argument | params_flow.rb:137:23:137:31 | synthetic splat argument | | params_flow.rb:137:29:137:30 | 70 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:137:29:137:30 | 70 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:137:29:137:30 | 70 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:137:29:137:30 | 70 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:137:29:137:30 | 70 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:137:29:137:30 | 70 | params_flow.rb:5:10:5:10 | x | @@ -5993,6 +6093,7 @@ trackEnd | params_flow.rb:137:34:137:42 | synthetic splat argument | params_flow.rb:137:34:137:42 | synthetic splat argument | | params_flow.rb:137:40:137:41 | 71 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:137:40:137:41 | 71 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:137:40:137:41 | 71 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:137:40:137:41 | 71 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:137:40:137:41 | 71 | params_flow.rb:137:34:137:42 | call to taint | | params_flow.rb:137:40:137:41 | 71 | params_flow.rb:137:40:137:41 | 71 | @@ -6007,6 +6108,7 @@ trackEnd | params_flow.rb:140:5:140:15 | ...[...] | params_flow.rb:140:5:140:15 | ...[...] | | params_flow.rb:140:5:140:15 | [post] ...[...] | params_flow.rb:140:5:140:15 | [post] ...[...] | | params_flow.rb:140:5:140:15 | synthetic splat argument | params_flow.rb:140:5:140:15 | synthetic splat argument | +| params_flow.rb:140:5:140:38 | call to insert | params_flow.rb:140:5:140:38 | ... | | params_flow.rb:140:5:140:38 | call to insert | params_flow.rb:140:5:140:38 | call to insert | | params_flow.rb:140:5:140:38 | call to insert | params_flow.rb:145:1:145:29 | call to hashSplatSideEffect | | params_flow.rb:140:5:140:38 | call to insert | params_flow.rb:150:1:150:42 | call to hashSplatSideEffect | @@ -6045,6 +6147,7 @@ trackEnd | params_flow.rb:143:24:143:32 | synthetic splat argument | params_flow.rb:143:24:143:32 | synthetic splat argument | | params_flow.rb:143:30:143:31 | 72 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:143:30:143:31 | 72 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:143:30:143:31 | 72 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:143:30:143:31 | 72 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:143:30:143:31 | 72 | params_flow.rb:140:27:140:37 | ...[...] | | params_flow.rb:143:30:143:31 | 72 | params_flow.rb:143:24:143:32 | call to taint | @@ -6109,6 +6212,7 @@ trackEnd | params_flow.rb:150:33:150:41 | synthetic splat argument | params_flow.rb:150:33:150:41 | synthetic splat argument | | params_flow.rb:150:39:150:40 | 73 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:150:39:150:40 | 73 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:150:39:150:40 | 73 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:150:39:150:40 | 73 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:150:39:150:40 | 73 | params_flow.rb:140:27:140:37 | ...[...] | | params_flow.rb:150:39:150:40 | 73 | params_flow.rb:150:33:150:41 | call to taint | @@ -6134,6 +6238,7 @@ trackEnd | params_flow.rb:153:28:153:29 | p2 | params_flow.rb:153:28:153:29 | p2 | | params_flow.rb:153:28:153:29 | p2 | params_flow.rb:154:18:154:19 | p2 | | params_flow.rb:154:5:154:6 | [post] p1 | params_flow.rb:154:5:154:6 | [post] p1 | +| params_flow.rb:154:5:154:20 | call to insert | params_flow.rb:154:5:154:20 | ... | | params_flow.rb:154:5:154:20 | call to insert | params_flow.rb:154:5:154:20 | call to insert | | params_flow.rb:154:5:154:20 | call to insert | params_flow.rb:159:1:159:27 | call to keywordSideEffect | | params_flow.rb:154:5:154:20 | call to insert | params_flow.rb:164:1:164:40 | call to keywordSideEffect | @@ -6172,6 +6277,7 @@ trackEnd | params_flow.rb:157:24:157:32 | synthetic splat argument | params_flow.rb:157:24:157:32 | synthetic splat argument | | params_flow.rb:157:30:157:31 | 74 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:157:30:157:31 | 74 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:157:30:157:31 | 74 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:157:30:157:31 | 74 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:157:30:157:31 | 74 | params_flow.rb:153:28:153:29 | p2 | | params_flow.rb:157:30:157:31 | 74 | params_flow.rb:153:28:153:29 | p2 | @@ -6235,6 +6341,7 @@ trackEnd | params_flow.rb:164:31:164:39 | synthetic splat argument | params_flow.rb:164:31:164:39 | synthetic splat argument | | params_flow.rb:164:37:164:38 | 75 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:164:37:164:38 | 75 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:164:37:164:38 | 75 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:164:37:164:38 | 75 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:164:37:164:38 | 75 | params_flow.rb:153:28:153:29 | p2 | | params_flow.rb:164:37:164:38 | 75 | params_flow.rb:153:28:153:29 | p2 | @@ -6260,6 +6367,7 @@ trackEnd | params_flow.rb:168:5:168:14 | ...[...] | params_flow.rb:168:5:168:14 | ...[...] | | params_flow.rb:168:5:168:14 | [post] ...[...] | params_flow.rb:168:5:168:14 | [post] ...[...] | | params_flow.rb:168:5:168:14 | synthetic splat argument | params_flow.rb:168:5:168:14 | synthetic splat argument | +| params_flow.rb:168:5:168:36 | call to insert | params_flow.rb:168:5:168:36 | ... | | params_flow.rb:168:5:168:36 | call to insert | params_flow.rb:168:5:168:36 | call to insert | | params_flow.rb:168:5:168:36 | call to insert | params_flow.rb:173:1:173:25 | call to splatSideEffect | | params_flow.rb:168:5:168:36 | call to insert | params_flow.rb:178:1:178:30 | call to splatSideEffect | @@ -6296,6 +6404,7 @@ trackEnd | params_flow.rb:171:17:171:25 | synthetic splat argument | params_flow.rb:171:17:171:25 | synthetic splat argument | | params_flow.rb:171:23:171:24 | 76 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:171:23:171:24 | 76 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:171:23:171:24 | 76 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:171:23:171:24 | 76 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:171:23:171:24 | 76 | params_flow.rb:168:26:168:35 | ...[...] | | params_flow.rb:171:23:171:24 | 76 | params_flow.rb:171:17:171:25 | call to taint | @@ -6356,6 +6465,7 @@ trackEnd | params_flow.rb:178:21:178:29 | synthetic splat argument | params_flow.rb:178:21:178:29 | synthetic splat argument | | params_flow.rb:178:27:178:28 | 77 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:178:27:178:28 | 77 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:178:27:178:28 | 77 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:178:27:178:28 | 77 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:178:27:178:28 | 77 | params_flow.rb:168:26:168:35 | ...[...] | | params_flow.rb:178:27:178:28 | 77 | params_flow.rb:178:21:178:29 | call to taint | @@ -6381,6 +6491,7 @@ trackEnd | params_flow.rb:181:28:181:29 | p2 | params_flow.rb:181:28:181:29 | p2 | | params_flow.rb:181:28:181:29 | p2 | params_flow.rb:182:18:182:19 | p2 | | params_flow.rb:182:5:182:6 | [post] p1 | params_flow.rb:182:5:182:6 | [post] p1 | +| params_flow.rb:182:5:182:20 | call to insert | params_flow.rb:182:5:182:20 | ... | | params_flow.rb:182:5:182:20 | call to insert | params_flow.rb:182:5:182:20 | call to insert | | params_flow.rb:182:5:182:20 | call to insert | params_flow.rb:187:1:187:25 | call to positionSideEffect | | params_flow.rb:182:5:182:20 | call to insert | params_flow.rb:192:1:192:33 | call to positionSideEffect | @@ -6421,6 +6532,7 @@ trackEnd | params_flow.rb:185:14:185:22 | synthetic splat argument | params_flow.rb:185:14:185:22 | synthetic splat argument | | params_flow.rb:185:20:185:21 | 78 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:185:20:185:21 | 78 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:185:20:185:21 | 78 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:185:20:185:21 | 78 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:185:20:185:21 | 78 | params_flow.rb:181:28:181:29 | p2 | | params_flow.rb:185:20:185:21 | 78 | params_flow.rb:181:28:181:29 | p2 | @@ -6480,6 +6592,7 @@ trackEnd | params_flow.rb:192:24:192:32 | synthetic splat argument | params_flow.rb:192:24:192:32 | synthetic splat argument | | params_flow.rb:192:30:192:31 | 79 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:192:30:192:31 | 79 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:192:30:192:31 | 79 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:192:30:192:31 | 79 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:192:30:192:31 | 79 | params_flow.rb:181:28:181:29 | p2 | | params_flow.rb:192:30:192:31 | 79 | params_flow.rb:181:28:181:29 | p2 | @@ -6524,6 +6637,7 @@ trackEnd | params_flow.rb:196:10:196:18 | synthetic splat argument | params_flow.rb:196:10:196:18 | synthetic splat argument | | params_flow.rb:196:16:196:17 | 80 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:196:16:196:17 | 80 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:196:16:196:17 | 80 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:196:16:196:17 | 80 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:196:16:196:17 | 80 | params_flow.rb:196:10:196:18 | call to taint | | params_flow.rb:196:16:196:17 | 80 | params_flow.rb:196:16:196:17 | 80 | @@ -6587,6 +6701,7 @@ trackEnd | params_flow.rb:203:11:203:14 | ...[...] | params_flow.rb:203:11:203:14 | ...[...] | | params_flow.rb:203:11:203:14 | synthetic splat argument | params_flow.rb:203:11:203:14 | synthetic splat argument | | params_flow.rb:203:13:203:13 | 0 | params_flow.rb:203:13:203:13 | 0 | +| params_flow.rb:204:5:204:15 | call to sink | params_flow.rb:201:5:204:15 | ... | | params_flow.rb:204:5:204:15 | call to sink | params_flow.rb:204:5:204:15 | call to sink | | params_flow.rb:204:5:204:15 | call to sink | params_flow.rb:207:1:207:14 | call to foo | | params_flow.rb:204:5:204:15 | synthetic splat argument | params_flow.rb:204:5:204:15 | synthetic splat argument | @@ -6681,7 +6796,9 @@ trackEnd | params_flow.rb:216:14:216:24 | synthetic splat argument | params_flow.rb:216:14:216:24 | synthetic splat argument | | params_flow.rb:216:21:216:23 | :k2 | params_flow.rb:216:21:216:23 | :k2 | | params_flow.rb:217:9:217:23 | synthetic splat argument | params_flow.rb:217:9:217:23 | synthetic splat argument | +| params_flow.rb:217:9:217:23 | yield ... | params_flow.rb:211:9:217:23 | ... | | params_flow.rb:217:9:217:23 | yield ... | params_flow.rb:217:9:217:23 | yield ... | +| params_flow.rb:217:9:217:23 | yield ... | params_flow.rb:223:9:223:13 | ... | | params_flow.rb:217:9:217:23 | yield ... | params_flow.rb:223:9:223:13 | super call to m | | params_flow.rb:217:9:217:23 | yield ... | params_flow.rb:227:1:229:3 | call to m | | params_flow.rb:217:9:217:23 | yield block argument | params_flow.rb:217:9:217:23 | yield block argument | @@ -6695,6 +6812,7 @@ trackEnd | params_flow.rb:217:15:217:23 | synthetic splat argument | params_flow.rb:217:15:217:23 | synthetic splat argument | | params_flow.rb:217:21:217:22 | 86 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:217:21:217:22 | 86 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:217:21:217:22 | 86 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:217:21:217:22 | 86 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:217:21:217:22 | 86 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:217:21:217:22 | 86 | params_flow.rb:5:10:5:10 | x | @@ -6760,6 +6878,7 @@ trackEnd | params_flow.rb:223:9:223:13 | ** ... | params_flow.rb:223:9:223:13 | ** ... | | params_flow.rb:223:9:223:13 | Pair | params_flow.rb:223:9:223:13 | Pair | | params_flow.rb:223:9:223:13 | k1 | params_flow.rb:223:9:223:13 | k1 | +| params_flow.rb:223:9:223:13 | super call to m | params_flow.rb:223:9:223:13 | ... | | params_flow.rb:223:9:223:13 | super call to m | params_flow.rb:223:9:223:13 | super call to m | | params_flow.rb:223:9:223:13 | super call to m | params_flow.rb:227:1:229:3 | call to m | | params_flow.rb:223:9:223:13 | synthetic hash-splat argument | params_flow.rb:210:26:210:33 | **kwargs | @@ -6793,6 +6912,7 @@ trackEnd | params_flow.rb:227:11:227:19 | synthetic splat argument | params_flow.rb:227:11:227:19 | synthetic splat argument | | params_flow.rb:227:17:227:18 | 81 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:227:17:227:18 | 81 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:227:17:227:18 | 81 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:227:17:227:18 | 81 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:227:17:227:18 | 81 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:227:17:227:18 | 81 | params_flow.rb:5:10:5:10 | x | @@ -6813,6 +6933,7 @@ trackEnd | params_flow.rb:227:22:227:30 | synthetic splat argument | params_flow.rb:227:22:227:30 | synthetic splat argument | | params_flow.rb:227:28:227:29 | 82 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:227:28:227:29 | 82 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:227:28:227:29 | 82 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:227:28:227:29 | 82 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:227:28:227:29 | 82 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:227:28:227:29 | 82 | params_flow.rb:5:10:5:10 | x | @@ -6833,6 +6954,7 @@ trackEnd | params_flow.rb:227:36:227:44 | synthetic splat argument | params_flow.rb:227:36:227:44 | synthetic splat argument | | params_flow.rb:227:42:227:43 | 83 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:227:42:227:43 | 83 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:227:42:227:43 | 83 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:227:42:227:43 | 83 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:227:42:227:43 | 83 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:227:42:227:43 | 83 | params_flow.rb:5:10:5:10 | x | @@ -6855,6 +6977,7 @@ trackEnd | params_flow.rb:227:51:227:59 | synthetic splat argument | params_flow.rb:227:51:227:59 | synthetic splat argument | | params_flow.rb:227:57:227:58 | 84 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:227:57:227:58 | 84 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:227:57:227:58 | 84 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:227:57:227:58 | 84 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:227:57:227:58 | 84 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:227:57:227:58 | 84 | params_flow.rb:5:10:5:10 | x | @@ -6877,6 +7000,7 @@ trackEnd | params_flow.rb:227:66:227:74 | synthetic splat argument | params_flow.rb:227:66:227:74 | synthetic splat argument | | params_flow.rb:227:72:227:73 | 85 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:227:72:227:73 | 85 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:227:72:227:73 | 85 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:227:72:227:73 | 85 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:227:72:227:73 | 85 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:227:72:227:73 | 85 | params_flow.rb:5:10:5:10 | x | @@ -6902,10 +7026,13 @@ trackEnd | params_flow.rb:227:81:227:81 | x | params_flow.rb:227:81:227:81 | x | | params_flow.rb:227:81:227:81 | x | params_flow.rb:227:81:227:81 | x | | params_flow.rb:227:81:227:81 | x | params_flow.rb:228:10:228:10 | x | +| params_flow.rb:228:5:228:11 | call to sink | params_flow.rb:211:9:217:23 | ... | | params_flow.rb:228:5:228:11 | call to sink | params_flow.rb:217:9:217:23 | yield ... | +| params_flow.rb:228:5:228:11 | call to sink | params_flow.rb:223:9:223:13 | ... | | params_flow.rb:228:5:228:11 | call to sink | params_flow.rb:223:9:223:13 | super call to m | | params_flow.rb:228:5:228:11 | call to sink | params_flow.rb:227:1:229:3 | call to m | | params_flow.rb:228:5:228:11 | call to sink | params_flow.rb:228:5:228:11 | call to sink | +| params_flow.rb:228:5:228:11 | call to sink | params_flow.rb:228:5:228:31 | ... | | params_flow.rb:228:5:228:11 | synthetic splat argument | params_flow.rb:228:5:228:11 | synthetic splat argument | forwardButNoBackwardFlow backwardButNoForwardFlow diff --git a/ruby/ql/test/library-tests/dataflow/type-tracker/TypeTracker.expected b/ruby/ql/test/library-tests/dataflow/type-tracker/TypeTracker.expected index 7b308c6816cd..bfecc4ec629d 100644 --- a/ruby/ql/test/library-tests/dataflow/type-tracker/TypeTracker.expected +++ b/ruby/ql/test/library-tests/dataflow/type-tracker/TypeTracker.expected @@ -360,9 +360,11 @@ trackEnd | type_tracker.rb:2:16:2:18 | val | type_tracker.rb:2:16:2:18 | val | | type_tracker.rb:2:16:2:18 | val | type_tracker.rb:2:16:2:18 | val | | type_tracker.rb:2:16:2:18 | val | type_tracker.rb:2:16:2:18 | val | +| type_tracker.rb:2:16:2:18 | val | type_tracker.rb:3:9:4:20 | ... | | type_tracker.rb:2:16:2:18 | val | type_tracker.rb:3:14:3:23 | call to field | | type_tracker.rb:2:16:2:18 | val | type_tracker.rb:4:9:4:20 | ... = ... | | type_tracker.rb:2:16:2:18 | val | type_tracker.rb:4:18:4:20 | val | +| type_tracker.rb:2:16:2:18 | val | type_tracker.rb:8:9:8:14 | ... | | type_tracker.rb:2:16:2:18 | val | type_tracker.rb:8:9:8:14 | @field | | type_tracker.rb:2:16:2:18 | val | type_tracker.rb:14:5:14:13 | call to field= | | type_tracker.rb:2:16:2:18 | val | type_tracker.rb:15:10:15:18 | call to field | @@ -377,6 +379,7 @@ trackEnd | type_tracker.rb:7:5:9:7 | self in field | type_tracker.rb:7:5:9:7 | self in field | | type_tracker.rb:7:5:9:7 | self in field | type_tracker.rb:8:9:8:14 | self | | type_tracker.rb:8:9:8:14 | @field | type_tracker.rb:3:14:3:23 | call to field | +| type_tracker.rb:8:9:8:14 | @field | type_tracker.rb:8:9:8:14 | ... | | type_tracker.rb:8:9:8:14 | @field | type_tracker.rb:8:9:8:14 | @field | | type_tracker.rb:8:9:8:14 | @field | type_tracker.rb:15:10:15:18 | call to field | | type_tracker.rb:12:1:16:3 | &block | type_tracker.rb:12:1:16:3 | &block | @@ -408,8 +411,10 @@ trackEnd | type_tracker.rb:14:5:14:13 | synthetic splat argument | type_tracker.rb:14:5:14:13 | synthetic splat argument | | type_tracker.rb:14:17:14:23 | "hello" | type_tracker.rb:2:16:2:18 | val | | type_tracker.rb:14:17:14:23 | "hello" | type_tracker.rb:2:16:2:18 | val | +| type_tracker.rb:14:17:14:23 | "hello" | type_tracker.rb:3:9:4:20 | ... | | type_tracker.rb:14:17:14:23 | "hello" | type_tracker.rb:4:9:4:20 | ... = ... | | type_tracker.rb:14:17:14:23 | "hello" | type_tracker.rb:4:18:4:20 | val | +| type_tracker.rb:14:17:14:23 | "hello" | type_tracker.rb:8:9:8:14 | ... | | type_tracker.rb:14:17:14:23 | "hello" | type_tracker.rb:8:9:8:14 | @field | | type_tracker.rb:14:17:14:23 | "hello" | type_tracker.rb:14:5:14:13 | __synth__0 | | type_tracker.rb:14:17:14:23 | "hello" | type_tracker.rb:14:5:14:13 | call to field= | @@ -419,6 +424,7 @@ trackEnd | type_tracker.rb:14:17:14:23 | "hello" | type_tracker.rb:14:17:14:23 | __synth__0 | | type_tracker.rb:14:17:14:23 | "hello" | type_tracker.rb:15:10:15:18 | call to field | | type_tracker.rb:14:17:14:23 | __synth__0 | type_tracker.rb:14:17:14:23 | __synth__0 | +| type_tracker.rb:15:5:15:18 | call to puts | type_tracker.rb:13:5:15:18 | ... | | type_tracker.rb:15:5:15:18 | call to puts | type_tracker.rb:15:5:15:18 | call to puts | | type_tracker.rb:15:5:15:18 | synthetic splat argument | type_tracker.rb:15:5:15:18 | synthetic splat argument | | type_tracker.rb:15:10:15:18 | call to field | type_tracker.rb:15:10:15:18 | call to field | @@ -439,6 +445,7 @@ trackEnd | type_tracker.rb:18:20:18:21 | p2 | type_tracker.rb:20:10:20:11 | p2 | | type_tracker.rb:19:5:19:11 | call to puts | type_tracker.rb:19:5:19:11 | call to puts | | type_tracker.rb:19:5:19:11 | synthetic splat argument | type_tracker.rb:19:5:19:11 | synthetic splat argument | +| type_tracker.rb:20:5:20:11 | call to puts | type_tracker.rb:19:5:20:11 | ... | | type_tracker.rb:20:5:20:11 | call to puts | type_tracker.rb:20:5:20:11 | call to puts | | type_tracker.rb:20:5:20:11 | call to puts | type_tracker.rb:23:1:23:16 | call to positional | | type_tracker.rb:20:5:20:11 | synthetic splat argument | type_tracker.rb:20:5:20:11 | synthetic splat argument | @@ -469,6 +476,7 @@ trackEnd | type_tracker.rb:25:18:25:19 | p2 | type_tracker.rb:27:10:27:11 | p2 | | type_tracker.rb:26:5:26:11 | call to puts | type_tracker.rb:26:5:26:11 | call to puts | | type_tracker.rb:26:5:26:11 | synthetic splat argument | type_tracker.rb:26:5:26:11 | synthetic splat argument | +| type_tracker.rb:27:5:27:11 | call to puts | type_tracker.rb:26:5:27:11 | ... | | type_tracker.rb:27:5:27:11 | call to puts | type_tracker.rb:27:5:27:11 | call to puts | | type_tracker.rb:27:5:27:11 | call to puts | type_tracker.rb:30:1:30:21 | call to keyword | | type_tracker.rb:27:5:27:11 | call to puts | type_tracker.rb:31:1:31:21 | call to keyword | @@ -523,6 +531,7 @@ trackEnd | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:34:18:34:20 | obj | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:34:18:34:20 | obj | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:34:18:34:20 | obj | +| type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:35:5:52:13 | ... | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:35:12:35:14 | obj | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:36:5:36:10 | ...[...] | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:39:5:39:12 | __synth__0 | @@ -679,16 +688,22 @@ trackEnd | type_tracker.rb:50:14:50:26 | synthetic splat argument | type_tracker.rb:50:14:50:26 | synthetic splat argument | | type_tracker.rb:50:14:50:26 | synthetic splat argument | type_tracker.rb:51:5:51:10 | array4 | | type_tracker.rb:50:14:50:26 | synthetic splat argument | type_tracker.rb:52:5:52:10 | array4 | +| type_tracker.rb:50:15:50:15 | 1 | type_tracker.rb:35:5:52:13 | ... | | type_tracker.rb:50:15:50:15 | 1 | type_tracker.rb:50:15:50:15 | 1 | | type_tracker.rb:50:15:50:15 | 1 | type_tracker.rb:52:5:52:13 | ...[...] | +| type_tracker.rb:50:17:50:17 | 2 | type_tracker.rb:35:5:52:13 | ... | | type_tracker.rb:50:17:50:17 | 2 | type_tracker.rb:50:17:50:17 | 2 | | type_tracker.rb:50:17:50:17 | 2 | type_tracker.rb:52:5:52:13 | ...[...] | +| type_tracker.rb:50:19:50:19 | 3 | type_tracker.rb:35:5:52:13 | ... | | type_tracker.rb:50:19:50:19 | 3 | type_tracker.rb:50:19:50:19 | 3 | | type_tracker.rb:50:19:50:19 | 3 | type_tracker.rb:52:5:52:13 | ...[...] | +| type_tracker.rb:50:21:50:21 | 4 | type_tracker.rb:35:5:52:13 | ... | | type_tracker.rb:50:21:50:21 | 4 | type_tracker.rb:50:21:50:21 | 4 | | type_tracker.rb:50:21:50:21 | 4 | type_tracker.rb:52:5:52:13 | ...[...] | +| type_tracker.rb:50:23:50:23 | 5 | type_tracker.rb:35:5:52:13 | ... | | type_tracker.rb:50:23:50:23 | 5 | type_tracker.rb:50:23:50:23 | 5 | | type_tracker.rb:50:23:50:23 | 5 | type_tracker.rb:52:5:52:13 | ...[...] | +| type_tracker.rb:50:25:50:25 | 6 | type_tracker.rb:35:5:52:13 | ... | | type_tracker.rb:50:25:50:25 | 6 | type_tracker.rb:50:25:50:25 | 6 | | type_tracker.rb:50:25:50:25 | 6 | type_tracker.rb:52:5:52:13 | ...[...] | | type_tracker.rb:51:5:51:10 | [post] array4 | type_tracker.rb:51:5:51:10 | [post] array4 | @@ -696,6 +711,7 @@ trackEnd | type_tracker.rb:51:5:51:13 | call to []= | type_tracker.rb:51:5:51:13 | call to []= | | type_tracker.rb:51:5:51:13 | synthetic splat argument | type_tracker.rb:51:5:51:13 | synthetic splat argument | | type_tracker.rb:51:17:51:19 | __synth__0 | type_tracker.rb:51:17:51:19 | __synth__0 | +| type_tracker.rb:52:5:52:13 | ...[...] | type_tracker.rb:35:5:52:13 | ... | | type_tracker.rb:52:5:52:13 | ...[...] | type_tracker.rb:52:5:52:13 | ...[...] | | type_tracker.rb:52:5:52:13 | synthetic splat argument | type_tracker.rb:52:5:52:13 | synthetic splat argument | forwardButNoBackwardFlow diff --git a/ruby/ql/test/library-tests/frameworks/active_record/ActiveRecord.expected b/ruby/ql/test/library-tests/frameworks/active_record/ActiveRecord.expected index 6b6fdbf22fac..1a78fc816ad9 100644 --- a/ruby/ql/test/library-tests/frameworks/active_record/ActiveRecord.expected +++ b/ruby/ql/test/library-tests/frameworks/active_record/ActiveRecord.expected @@ -7,8 +7,10 @@ activeRecordModelClasses | associations.rb:11:1:13:3 | Tag | | associations.rb:15:1:17:3 | Comment | activeRecordInstances +| ActiveRecord.rb:9:5:9:68 | ... | | ActiveRecord.rb:9:5:9:68 | call to find | | ActiveRecord.rb:13:5:13:40 | call to find_by | +| ActiveRecord.rb:13:5:13:46 | ... | | ActiveRecord.rb:13:5:13:46 | call to users | | ActiveRecord.rb:16:3:31:5 | self (exec) | | ActiveRecord.rb:16:3:31:5 | self in exec | @@ -28,14 +30,19 @@ activeRecordInstances | ActiveRecord.rb:30:5:30:14 | self | | ActiveRecord.rb:52:5:52:51 | call to authenticate | | ActiveRecord.rb:53:5:53:30 | call to find_by_name | +| ActiveRecord.rb:67:5:79:34 | ... | | ActiveRecord.rb:72:5:74:7 | if ... | | ActiveRecord.rb:72:43:73:40 | then ... | | ActiveRecord.rb:73:7:73:40 | call to find_by | | ActiveRecord.rb:77:5:77:33 | call to find_by | | ActiveRecord.rb:79:5:79:34 | call to find | +| ActiveRecord.rb:89:5:89:24 | ... | | ActiveRecord.rb:89:5:89:24 | call to create | +| ActiveRecord.rb:93:5:93:66 | ... | | ActiveRecord.rb:93:5:93:66 | call to create | +| ActiveRecord.rb:97:5:97:68 | ... | | ActiveRecord.rb:97:5:97:68 | call to create | +| ActiveRecord.rb:101:5:101:16 | ... | | ActiveRecord.rb:101:5:101:16 | call to create | | associations.rb:19:1:19:7 | author1 | | associations.rb:19:1:19:20 | ... = ... | diff --git a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll index 2b5ae0402847..375a4f4dcd34 100644 --- a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll +++ b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll @@ -1269,6 +1269,10 @@ module Make0 Ast> { result = block.(Switch).getStmt(_) } + private predicate callableHasParamDefault(Callable c, Expr defaultValue) { + exists(Parameter p | p.getDefaultValue() = defaultValue and c = getEnclosingCallable(p)) + } + /** * Holds if an abrupt completion `c` from within `ast` is caught with * flow continuing at `n`. @@ -1276,7 +1280,9 @@ module Make0 Ast> { private predicate endAbruptCompletion(AstNode ast, PreControlFlowNode n, AbruptCompletion c) { Input2::endAbruptCompletion(ast, n, c) or - exists(Callable callable | callableHasBodyPart(callable, ast) | + exists(Callable callable | + callableHasBodyPart(callable, ast) or callableHasParamDefault(callable, ast) + | c.getSuccessorType() instanceof ReturnSuccessor and n.(NormalExitNodeImpl).getEnclosingCallable() = callable or @@ -1737,6 +1743,10 @@ module Make0 Ast> { not exists(trystmt.getFinally()) and beforeFinally.isAfter(trystmt) ) | + not exists(trystmt.getBody(_)) and + n1.isBefore(trystmt) and + n2 = beforeElse + or exists(int i | n1.isAfter(trystmt.getBody(i)) and not exists(trystmt.getBody(i + 1)) and