(List (= scope= flags=0 words=[] bindings=[('source', {[VarSub 1]})]) (= scope= flags=0 words=[] bindings=[('target', {[VarSub 2]})]) (If (AndOr OP_OR_IF (DBracket {B! {B2 BINARY_STRING_EQUAL {[DQ [VarSub source]]} {[LIT_CHARS /] [LIT_OTHER "*"]}}}) (DBracket {B! {B2 BINARY_STRING_EQUAL {[DQ [VarSub target]]} {[LIT_CHARS /] [LIT_OTHER "*"]}}}) ) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "ERROR: paths must be absolute paths, they must start with a forward slash!"]]} ) (Com {[LIT_CHARS exit]} {[LIT_CHARS 1]} ) ) ) (= scope= flags=0 words=[] bindings=[('common_part', {[VarSub source]})]) (= scope= flags=0 words=[] bindings=[('result', {[DQ ]})]) (While (DBracket {B2 BINARY_STRING_EQUAL {[DQ [VarSub target transform_ops=[VS_UNARY_POUND {[VarSub common_part]}]]]} {[DQ [VarSub target]]}}) (List (= scope= flags=0 words=[] bindings=[('common_part', {[DQ [ComSub (Com {[LIT_CHARS dirname]} {[VarSub common_part]})]]})]) (If (DBracket {B1 UNARY_STRING_z {[VarSub result]}}) (= scope= flags=0 words=[] bindings=[('result', {[DQ [LIT_CHARS ..]]})]) (ElseTrue) (= scope= flags=0 words=[] bindings=[('result', {[DQ [LIT_CHARS ../][VarSub result]]})]) ) ) ) (If (DBracket {B2 BINARY_STRING_EQUAL {[VarSub common_part]} {[DQ [LIT_CHARS /]]}}) (= scope= flags=0 words=[] bindings=[('result', {[DQ [VarSub result][LIT_CHARS /]]})]) ) (= scope= flags=0 words=[] bindings=[('forward_part', {[DQ [VarSub target transform_ops=[VS_UNARY_POUND {[VarSub common_part]}]]]})]) (If (AndOr OP_AND_IF (DBracket {B1 UNARY_STRING_n {[VarSub result]}}) (DBracket {B1 UNARY_STRING_n {[VarSub forward_part]}}) ) (= scope= flags=0 words=[] bindings=[('result', {[DQ [VarSub result][VarSub forward_part]]})]) (DBracket {B1 UNARY_STRING_n {[VarSub forward_part]}}) (= scope= flags=0 words=[] bindings=[('result', {[DQ [VarSub forward_part transform_ops=[Slice {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 1]}} None]]]})]) ) (Com {[LIT_CHARS echo]} {[VarSub result]} ) )