(List (Com {[LIT_CHARS set]} {[LIT_CHARS -eu]}) (= scope= flags=1 words=[] bindings=[('PATH', {[DQ [VarSub PATH][LIT_CHARS ":/sbin:/usr/sbin"]]})]) (Com {[LIT_CHARS unset]} {[LIT_CHARS BASH_ENV]} {[LIT_CHARS CDPATH]} {[LIT_CHARS ENV]} {[LIT_CHARS GLOBIGNORE]} {[LIT_CHARS IFS]} {[LIT_CHARS POSIXLY_CORRECT]}) (= scope= flags=1 words=[{[LIT_CHARS -n]}, {[LIT_CHARS SHELLOPTS]}] bindings=[]) (Com {[LIT_CHARS set]} {[LIT_CHARS -o]} {[LIT_CHARS pipefail]}) (Com {[LIT_CHARS shopt]} {[LIT_CHARS -s]} {[LIT_CHARS nullglob]}) (= scope= flags=0 words=[] bindings=[('ME', {[DQ [ComSub (Com {[LIT_CHARS basename]} {[DQ [VarSub 0]]})]]})]) (= scope= flags=2 words=[{[LIT_CHARS ME]}] bindings=[]) (= scope= flags=2 words=[] bindings=[('KS_CHANNEL_KEY', {[DQ [LIT_CHARS KSChannelID]]})]) (Com {[LIT_OTHER ":"]} {[VarSub GOOGLE_CHROME_UPDATER_DEBUG test_op=VS_TEST_COLON_EQUALS {}]}) (FunctionDef err [] (List (= scope= flags=0 words=[] bindings=[('error', {[DQ [VarSub 1]]})]) (= scope= flags=0 words=[] bindings=[('id', {[SQ ]})]) (If (DBracket {B1 UNARY_STRING_n {[DQ [VarSub GOOGLE_CHROME_UPDATER_DEBUG]]}}) (= scope= flags=0 words=[] bindings=[('id', {[DQ [LIT_CHARS ": "][VarSub $][LIT_CHARS " "][ComSub (Com {[LIT_CHARS date]} {[DQ [LIT_CHARS "+%Y-%m-%d %H:%M:%S %z"]]})]]})]) ) (Com {[LIT_CHARS echo]} {[DQ [VarSub ME][VarSub id][LIT_CHARS ": "][VarSub error]]} < (DescriptorRedirectNode target={[LIT_CHARS 2]} &"> 1), > ) ) ) (FunctionDef note [] (List (= scope= flags=0 words=[] bindings=[('message', {[DQ [VarSub 1]]})]) (If (DBracket {B1 UNARY_STRING_n {[DQ [VarSub GOOGLE_CHROME_UPDATER_DEBUG]]}}) (Com {[LIT_CHARS err]} {[DQ [VarSub message]]}) ) ) ) (= scope= flags=0 words=[] bindings=[('g_temp_dir', {[SQ ]})]) (FunctionDef cleanup [] (List (= scope= flags=0 words=[] bindings=[('status', {[VarSub ?]})]) (Com {[LIT_CHARS trap]} {[LIT_CHARS -]} {[LIT_CHARS EXIT]}) (Com {[LIT_CHARS trap]} {[SQ ]} {[LIT_CHARS HUP]} {[LIT_CHARS INT]} {[LIT_CHARS QUIT]} {[LIT_CHARS TERM]}) (If (DBracket {B2 BINARY_INT_GE {[VarSub status]} {[LIT_CHARS 128]}}) (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "Caught signal "][ArithSub {A2 AS_OP_MINUS {A Atom NODE_ARITH_WORD {[VarSub status]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 128]}}}]]}) ) (If (DBracket {B1 UNARY_STRING_n {[DQ [VarSub g_temp_dir]]}}) (Com {[LIT_CHARS rm]} {[LIT_CHARS -rf]} {[DQ [VarSub g_temp_dir]]}) ) (Com {[LIT_CHARS exit]} {[VarSub status]}) ) ) (FunctionDef ensure_temp_dir [] (If (DBracket {B1 UNARY_STRING_z {[DQ [VarSub g_temp_dir]]}}) (List (= scope= flags=0 words=[] bindings=[('template', {[DQ [VarSub ME]]})]) (If (DBracket {B2 BINARY_STRING_TILDE_EQUAL {[DQ [VarSub template]]} {[LIT_OTHER "^"] [LIT_OTHER "["] [LIT_CHARS -.] [LIT_OTHER "]"] [LIT_OTHER "+"] [LIT_CHARS "("] [LIT_CHARS .] [LIT_OTHER "*"] [LIT_CHARS ")"] [LIT_OTHER "$"]}}) (= scope= flags=0 words=[] bindings=[('template', {[DQ [VarSub BASH_REMATCH bracket_op=(Index {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 1]}})]]})]) ) (If (DBracket {B1 UNARY_STRING_z {[DQ [VarSub template]]}}) (= scope= flags=0 words=[] bindings=[('template', {[DQ [LIT_CHARS keystone_install]]})]) ) (= scope= flags=0 words=[] bindings=[('g_temp_dir', {[DQ [ComSub (Com {[LIT_CHARS mktemp]} {[LIT_CHARS -d]} {[LIT_CHARS -t]} {[DQ [VarSub template]]})]]})]) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "g_temp_dir = "][VarSub g_temp_dir]]}) ) ) ) (FunctionDef is_writable_symlink [] (List (= scope= flags=0 words=[] bindings=[('symlink', {[DQ [VarSub 1]]})]) (= scope= flags=0 words=[{[LIT_CHARS link_mode]}] bindings=[]) (= scope= flags=0 words=[] bindings=[('link_mode', {[DQ [ComSub (AndOr OP_OR_IF (Com redirects=[(FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 2)]{[LIT_CHARS stat]} {[LIT_CHARS -f]} {[LIT_OTHER "%"] [LIT_CHARS Sp]} {[DQ [VarSub symlink]]}) (Com {[LIT_CHARS true]}) )]]})]) (If (AndOr OP_OR_IF (DBracket {B1 UNARY_STRING_z {[DQ [VarSub link_mode]]}}) (DBracket {B2 BINARY_STRING_NOT_EQUAL {[DQ [VarSub link_mode transform_ops=[Slice {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 0]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 1]}}]]]} {[DQ [LIT_CHARS l]]}}) ) (Com {[LIT_CHARS return]} {[LIT_CHARS 1]}) ) (= scope= flags=0 words=[{[LIT_CHARS link_user]}, {[LIT_CHARS link_group]}] bindings=[]) (= scope= flags=0 words=[] bindings=[('link_user', {[DQ [ComSub (AndOr OP_OR_IF (Com redirects=[(FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 2)]{[LIT_CHARS stat]} {[LIT_CHARS -f]} {[LIT_OTHER "%"] [LIT_CHARS u]} {[DQ [VarSub symlink]]}) (Com {[LIT_CHARS true]}) )]]})]) (= scope= flags=0 words=[] bindings=[('link_group', {[DQ [ComSub (AndOr OP_OR_IF (Com redirects=[(FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 2)]{[LIT_CHARS stat]} {[LIT_CHARS -f]} {[LIT_OTHER "%"] [LIT_CHARS g]} {[DQ [VarSub symlink]]}) (Com {[LIT_CHARS true]}) )]]})]) (If (AndOr OP_OR_IF (DBracket {B1 UNARY_STRING_z {[DQ [VarSub link_user]]}}) (DBracket {B1 UNARY_STRING_z {[DQ [VarSub link_group]]}}) ) (Com {[LIT_CHARS return]} {[LIT_CHARS 1]}) ) (If (DBracket {B2 BINARY_INT_EQ {[VarSub EUID]} {[DQ [VarSub link_user]]}}) (List (If (DBracket {B2 BINARY_STRING_EQUAL {[DQ [VarSub link_mode transform_ops=[Slice {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 2]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 1]}}]]]} {[DQ [LIT_CHARS w]]}}) (Com {[LIT_CHARS return]} {[LIT_CHARS 0]}) ) (Com {[LIT_CHARS return]} {[LIT_CHARS 1]}) ) ) (= scope= flags=0 words=[] bindings=[('group_match', {[SQ ]})]) (= scope= flags=0 words=[{[LIT_CHARS group]}] bindings=[]) (For group [{[DQ [VarSub GROUPS bracket_op=(Index {A Atom NODE_ARITH_WORD {AS_OP_AT "@"}})]]}]) (If (DBracket {B2 BINARY_INT_EQ {[DQ [VarSub group]]} {[DQ [VarSub link_group]]}}) (List (= scope= flags=0 words=[] bindings=[('group_match', {[DQ [LIT_CHARS y]]})]) (Com {[LIT_CHARS break]}) ) ) ) (If (DBracket {B1 UNARY_STRING_n {[DQ [VarSub group_match]]}}) (List (If (DBracket {B2 BINARY_STRING_EQUAL {[DQ [VarSub link_mode transform_ops=[Slice {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 5]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 1]}}]]]} {[DQ [LIT_CHARS w]]}}) (Com {[LIT_CHARS return]} {[LIT_CHARS 0]}) ) (Com {[LIT_CHARS return]} {[LIT_CHARS 1]}) ) ) (If (DBracket {B2 BINARY_STRING_EQUAL {[DQ [VarSub link_mode transform_ops=[Slice {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 8]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 1]}}]]]} {[DQ [LIT_CHARS w]]}}) (Com {[LIT_CHARS return]} {[LIT_CHARS 0]}) ) (Com {[LIT_CHARS return]} {[LIT_CHARS 1]}) ) ) (FunctionDef ensure_writable_symlink [] (List (= scope= flags=0 words=[] bindings=[('symlink', {[DQ [VarSub 1]]})]) (If (AndOr OP_AND_IF (DBracket {B1 UNARY_FILE_L {[DQ [VarSub symlink]]}}) (Pipeline! (Com {[LIT_CHARS is_writable_symlink]} {[DQ [VarSub symlink]]}) ) ) (List (= scope= flags=0 words=[{[LIT_CHARS target]}] bindings=[]) (= scope= flags=0 words=[] bindings=[('target', {[DQ [ComSub (AndOr OP_OR_IF (Com redirects=[(FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 2)]{[LIT_CHARS readlink]} {[DQ [VarSub symlink]]}) (Com {[LIT_CHARS true]}) )]]})]) (If (DBracket {B1 UNARY_STRING_z {[DQ [VarSub target]]}}) (Com {[LIT_CHARS return]} {[LIT_CHARS 0]}) ) (= scope= flags=0 words=[{[LIT_CHARS symlink_dir]}, {[LIT_CHARS temp_link_dir]}, {[LIT_CHARS temp_link]}] bindings=[]) (= scope= flags=0 words=[] bindings=[('symlink_dir', {[DQ [ComSub (Com {[LIT_CHARS dirname]} {[DQ [VarSub symlink]]})]]})]) (= scope= flags=0 words=[] bindings=[('temp_link_dir', {[DQ [ComSub (AndOr OP_OR_IF (Com {[LIT_CHARS mktemp]} {[LIT_CHARS -d]} {[DQ [VarSub symlink_dir][LIT_CHARS /.symlink_temp.XXXXXX]]}) (Com {[LIT_CHARS true]}) )]]})]) (If (DBracket {B1 UNARY_STRING_z {[DQ [VarSub temp_link_dir]]}}) (Com {[LIT_CHARS return]} {[LIT_CHARS 0]}) ) (= scope= flags=0 words=[] bindings=[('temp_link', {[DQ [VarSub temp_link_dir][LIT_CHARS /][ComSub (Com {[LIT_CHARS basename]} {[DQ [VarSub symlink]]})]]})]) (AndOr OP_OR_IF (Subshell (AndOr OP_AND_IF (Com {[LIT_CHARS ln]} {[LIT_CHARS -fhs]} {[DQ [VarSub target]]} {[DQ [VarSub temp_link]]}) (AndOr OP_AND_IF (Com {[LIT_CHARS chmod]} {[LIT_CHARS -h]} {[LIT_CHARS 755]} {[DQ [VarSub temp_link]]}) (Com {[LIT_CHARS mv]} {[LIT_CHARS -f]} {[DQ [VarSub temp_link]]} {[DQ [VarSub symlink_dir][LIT_CHARS /]]}) ) ) ) (Com {[LIT_CHARS true]}) ) (Com {[LIT_CHARS rm]} {[LIT_CHARS -rf]} {[DQ [VarSub temp_link_dir]]}) ) ) (Com {[LIT_CHARS return]} {[LIT_CHARS 0]}) ) ) (FunctionDef ensure_writable_symlinks_recursive [] (List (= scope= flags=0 words=[] bindings=[('directory', {[DQ [VarSub 1]]})]) (If (DBracket {B2 BINARY_INT_EQ {[VarSub EUID]} {[LIT_CHARS 0]}}) (Com {[LIT_CHARS return]} {[LIT_CHARS 0]}) ) (= scope= flags=0 words=[] bindings=[('set_e', {[SQ ]})]) (If (DBracket {B2 BINARY_STRING_TILDE_EQUAL {[DQ [VarSub -]]} {[LIT_CHARS e]}}) (List (= scope= flags=0 words=[] bindings=[('set_e', {[DQ [LIT_CHARS y]]})]) (Com {[LIT_CHARS set]} {[LIT_OTHER "+"] [LIT_CHARS e]}) ) ) (= scope= flags=0 words=[{[LIT_CHARS symlink]}] bindings=[]) (While (Com {[LIT_CHARS read]} {[LIT_CHARS -r]} {[LIT_CHARS -d]} {[SQ ]} {[LIT_CHARS symlink]} more_env=[('IFS', {[SQ ]})] ) (Com {[LIT_CHARS ensure_writable_symlink]} {[DQ [VarSub symlink]]}) ) (If (DBracket {B1 UNARY_STRING_n {[DQ [VarSub set_e]]}}) (Com {[LIT_CHARS set]} {[LIT_CHARS -e]}) ) ) ) (FunctionDef is_version_ge [] (List (= scope= flags=0 words=[] bindings=[('left', {[DQ [VarSub 1]]})]) (= scope= flags=0 words=[] bindings=[('right', {[DQ [VarSub 2]]})]) (= scope= flags=0 words=[{[LIT_CHARS -a]}, {[LIT_CHARS left_array]}, {[LIT_CHARS right_array]}] bindings=[]) (= scope= flags=0 words=[] bindings=[('IFS', {[LIT_CHARS .]}), ('left_array', {[Array {[VarSub left]}]})]) (= scope= flags=0 words=[] bindings=[('IFS', {[LIT_CHARS .]}), ('right_array', {[Array {[VarSub right]}]})]) (= scope= flags=0 words=[] bindings=[('left_count', {[VarSub left_array bracket_op=(Index {A Atom NODE_ARITH_WORD {AS_OP_AT "@"}}) transform_ops=[(#len)]]})]) (= scope= flags=0 words=[] bindings=[('right_count', {[VarSub right_array bracket_op=(Index {A Atom NODE_ARITH_WORD {AS_OP_AT "@"}}) transform_ops=[(#len)]]})]) (= scope= flags=0 words=[] bindings=[('count', {[VarSub left_count]})]) (If (DBracket {B2 BINARY_INT_LT {[VarSub right_count]} {[VarSub count]}}) (= scope= flags=0 words=[] bindings=[('count', {[VarSub right_count]})]) ) (= scope= flags=0 words=[] bindings=[('index', {[LIT_CHARS 0]})]) (While (DBracket {B2 BINARY_INT_LT {[VarSub index]} {[VarSub count]}}) (List (= scope= flags=0 words=[] bindings=[('left_element', {[DQ [VarSub left_array bracket_op=(Index {A Atom NODE_ARITH_WORD {[VarSub index]}})]]})]) (= scope= flags=0 words=[] bindings=[('right_element', {[DQ [VarSub right_array bracket_op=(Index {A Atom NODE_ARITH_WORD {[VarSub index]}})]]})]) (If (DBracket {B2 BINARY_INT_GT {[VarSub left_element]} {[VarSub right_element]}}) (Com {[LIT_CHARS return]} {[LIT_CHARS 0]}) (DBracket {B2 BINARY_INT_LT {[VarSub left_element]} {[VarSub right_element]}}) (Com {[LIT_CHARS return]} {[LIT_CHARS 1]}) ) (DParen {A1 AS_OP_DPLUS {A Atom NODE_ARITH_WORD {[VarSub index]}} }) ) ) (While (DBracket {B2 BINARY_INT_LT {[VarSub index]} {[VarSub left_count]}}) (List (= scope= flags=0 words=[] bindings=[('left_element', {[DQ [VarSub left_array bracket_op=(Index {A Atom NODE_ARITH_WORD {[VarSub index]}})]]})]) (If (DBracket {B2 BINARY_INT_GT {[VarSub left_element]} {[LIT_CHARS 0]}}) (Com {[LIT_CHARS return]} {[LIT_CHARS 0]}) ) (DParen {A1 AS_OP_DPLUS {A Atom NODE_ARITH_WORD {[VarSub index]}} }) ) ) (While (DBracket {B2 BINARY_INT_LT {[VarSub index]} {[VarSub right_count]}}) (List (= scope= flags=0 words=[] bindings=[('right_element', {[DQ [VarSub right_array bracket_op=(Index {A Atom NODE_ARITH_WORD {[VarSub index]}})]]})]) (If (DBracket {B2 BINARY_INT_GT {[VarSub right_element]} {[LIT_CHARS 0]}}) (Com {[LIT_CHARS return]} {[LIT_CHARS 1]}) ) (DParen {A1 AS_OP_DPLUS {A Atom NODE_ARITH_WORD {[VarSub index]}} }) ) ) (Com {[LIT_CHARS return]} {[LIT_CHARS 0]}) ) ) (= scope= flags=0 words=[] bindings=[('g_checked_os_version', {[SQ ]})]) (= scope= flags=0 words=[] bindings=[('g_os_version', {[SQ ]})]) (FunctionDef os_version [] (List (If (DBracket {B1 UNARY_STRING_z {[DQ [VarSub g_checked_os_version]]}}) (List (= scope= flags=0 words=[] bindings=[('g_checked_os_version', {[DQ [LIT_CHARS y]]})]) (= scope= flags=0 words=[] bindings=[('g_os_version', {[DQ [ComSub (Com {[LIT_CHARS sw_vers]} {[LIT_CHARS -productVersion]})]]})]) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "g_os_version = "][VarSub g_os_version]]}) ) ) (Com {[LIT_CHARS echo]} {[DQ [VarSub g_os_version]]}) (Com {[LIT_CHARS return]} {[LIT_CHARS 0]}) ) ) (FunctionDef is_os_version_ge [] (List (= scope= flags=0 words=[] bindings=[('check_version', {[DQ [VarSub 1]]})]) (= scope= flags=0 words=[] bindings=[('os_version', {[DQ [ComSub (Com {[LIT_CHARS os_version]})]]})]) (Com {[LIT_CHARS is_version_ge]} {[DQ [VarSub os_version]]} {[DQ [VarSub check_version]]}) ) ) (FunctionDef os_xattr_supports_r [] (Com {[LIT_CHARS is_os_version_ge]} {[LIT_CHARS 10.6]}) ) (= scope= flags=0 words=[] bindings=[('g_checked_ksadmin_version', {[SQ ]})]) (= scope= flags=0 words=[] bindings=[('g_ksadmin_version', {[SQ ]})]) (FunctionDef ksadmin_version [] (List (If (DBracket {B1 UNARY_STRING_z {[DQ [VarSub g_checked_ksadmin_version]]}}) (List (= scope= flags=0 words=[] bindings=[('g_checked_ksadmin_version', {[DQ [LIT_CHARS y]]})]) (= scope= flags=0 words=[] bindings=[('g_ksadmin_version', {[DQ [ComSub (AndOr OP_OR_IF (Com {[LIT_CHARS ksadmin]} {[LIT_CHARS --ksadmin-version]}) (Com {[LIT_CHARS true]}) )]]})]) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "g_ksadmin_version = "][VarSub g_ksadmin_version]]}) ) ) (Com {[LIT_CHARS echo]} {[DQ [VarSub g_ksadmin_version]]}) (Com {[LIT_CHARS return]} {[LIT_CHARS 0]}) ) ) (FunctionDef is_ksadmin_version_ge [] (List (= scope= flags=0 words=[] bindings=[('check_version', {[DQ [VarSub 1]]})]) (= scope= flags=0 words=[] bindings=[('ksadmin_version', {[DQ [ComSub (Com {[LIT_CHARS ksadmin_version]})]]})]) (Com {[LIT_CHARS is_version_ge]} {[DQ [VarSub ksadmin_version]]} {[DQ [VarSub check_version]]}) ) ) (FunctionDef ksadmin_supports_tag [] (List (= scope= flags=0 words=[{[LIT_CHARS ksadmin_version]}] bindings=[]) (= scope= flags=0 words=[] bindings=[('ksadmin_version', {[DQ [ComSub (Com {[LIT_CHARS ksadmin_version]})]]})]) (If (DBracket {B1 UNARY_STRING_n {[DQ [VarSub ksadmin_version]]}}) (Com {[LIT_CHARS return]} {[LIT_CHARS 0]}) ) (Com {[LIT_CHARS return]} {[LIT_CHARS 1]}) ) ) (FunctionDef ksadmin_supports_tagpath_tagkey [] (Com {[LIT_CHARS is_ksadmin_version_ge]} {[LIT_CHARS 1.0.7.1306]}) ) (FunctionDef ksadmin_supports_brandpath_brandkey [] (Com {[LIT_CHARS is_ksadmin_version_ge]} {[LIT_CHARS 1.0.8.1620]}) ) (FunctionDef ksadmin_supports_versionpath_versionkey [] (Com {[LIT_CHARS is_ksadmin_version_ge]} {[LIT_CHARS 1.0.9.2318]}) ) (FunctionDef has_32_bit_only_cpu [] (List (= scope= flags=0 words=[] bindings=[('cpu_64_bit_capable', {[DQ [ComSub (Com redirects=[(FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 2)]{[LIT_CHARS sysctl]} {[LIT_CHARS -n]} {[LIT_CHARS hw.cpu64bit_capable]})]]})]) (DBracket {B? LOGICAL_BINARY_OR {B1 UNARY_STRING_z {[DQ [VarSub cpu_64_bit_capable]]}} {B2 BINARY_INT_EQ {[DQ [VarSub cpu_64_bit_capable]]} {[LIT_CHARS 0]}}}) ) ) (FunctionDef infoplist_read [] (Com {[LIT_CHARS defaults]} {[LIT_CHARS read]} {[DQ [VarSub @]]} more_env=[('__CFPREFERENCES_AVOID_DAEMON', {[LIT_CHARS 1]})] ) ) (FunctionDef mark_32_bit_only_system [] (List (= scope= flags=0 words=[] bindings=[('product_id', {[DQ [VarSub 1]]})]) (= scope= flags=0 words=[] bindings=[('set_e', {[SQ ]})]) (If (DBracket {B2 BINARY_STRING_TILDE_EQUAL {[DQ [VarSub -]]} {[LIT_CHARS e]}}) (List (= scope= flags=0 words=[] bindings=[('set_e', {[DQ [LIT_CHARS y]]})]) (Com {[LIT_CHARS set]} {[LIT_OTHER "+"] [LIT_CHARS e]}) ) ) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "marking 32-bit-only system"]]}) (If (Pipeline! (Com {[LIT_CHARS ksadmin_supports_tagpath_tagkey]}) ) (List (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "couldn't mark 32-bit-only system, no ksadmin support"]]}) (If (DBracket {B1 UNARY_STRING_n {[DQ [VarSub set_e]]}}) (Com {[LIT_CHARS set]} {[LIT_CHARS -e]}) ) (Com {[LIT_CHARS return]} {[LIT_CHARS 0]}) ) ) (= scope= flags=0 words=[] bindings=[('current_tag', {[DQ [ComSub (Com {[LIT_CHARS ksadmin]} {[LIT_CHARS --productid]} {[DQ [VarSub product_id]]} {[LIT_CHARS --print-tag]})]]})]) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "current_tag = "][VarSub current_tag]]}) (If (Com {[LIT_CHARS grep]} {[LIT_CHARS -Eq]} {[LIT_CHARS --]} {[SQ ]} < (HereWordRedirectNode here_word={[DQ [VarSub current_tag]]} 0), > ) (List (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "current tag already has -32bit"]]}) (If (DBracket {B1 UNARY_STRING_n {[DQ [VarSub set_e]]}}) (Com {[LIT_CHARS set]} {[LIT_CHARS -e]}) ) (Com {[LIT_CHARS return]} {[LIT_CHARS 0]}) ) ) (= scope= flags=0 words=[] bindings=[('current_channel', {[DQ [ComSub (Com redirects=[(HereWordRedirectNode here_word={[DQ [VarSub current_tag]]} 0)]{[LIT_CHARS sed]} {[LIT_CHARS -e]} {[SQ ]})]]})]) (= scope= flags=0 words=[] bindings=[('new_tag', {[DQ [VarSub current_channel][LIT_CHARS -32bit]]})]) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "new_tag = "][VarSub new_tag]]}) (If (Pipeline! (Com {[LIT_CHARS ksadmin]} {[LIT_CHARS --productid]} {[DQ [VarSub product_id]]} {[LIT_CHARS --tag]} {[DQ [VarSub new_tag]]} {[LIT_CHARS --tag-path]} {[SQ ]} {[LIT_CHARS --tag-key]} {[SQ ]}) ) (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "ksadmin failed to mark 32-bit-only system"]]}) (ElseTrue) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "marked 32-bit-only system"]]}) ) (If (DBracket {B1 UNARY_STRING_n {[DQ [VarSub set_e]]}}) (Com {[LIT_CHARS set]} {[LIT_CHARS -e]}) ) ) ) (FunctionDef mark_failed_patch_update [] (List (= scope= flags=0 words=[] bindings=[('product_id', {[DQ [VarSub 1]]})]) (= scope= flags=0 words=[] bindings=[('want_full_installer_path', {[DQ [VarSub 2]]})]) (= scope= flags=0 words=[] bindings=[('old_ks_plist', {[DQ [VarSub 3]]})]) (= scope= flags=0 words=[] bindings=[('old_version_app', {[DQ [VarSub 4]]})]) (= scope= flags=0 words=[] bindings=[('system_ticket', {[DQ [VarSub 5]]})]) (= scope= flags=0 words=[] bindings=[('set_e', {[SQ ]})]) (If (DBracket {B2 BINARY_STRING_TILDE_EQUAL {[DQ [VarSub -]]} {[LIT_CHARS e]}}) (List (= scope= flags=0 words=[] bindings=[('set_e', {[DQ [LIT_CHARS y]]})]) (Com {[LIT_CHARS set]} {[LIT_OTHER "+"] [LIT_CHARS e]}) ) ) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "marking failed patch update"]]}) (= scope= flags=0 words=[{[LIT_CHARS channel]}] bindings=[]) (= scope= flags=0 words=[] bindings=[('channel', {[DQ [ComSub (Com redirects=[(FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 2)]{[LIT_CHARS infoplist_read]} {[DQ [VarSub old_ks_plist]]} {[DQ [VarSub KS_CHANNEL_KEY]]})]]})]) (= scope= flags=0 words=[] bindings=[('tag', {[DQ [VarSub channel]]})]) (= scope= flags=0 words=[] bindings=[('tag_key', {[DQ [VarSub KS_CHANNEL_KEY]]})]) (If (Com {[LIT_CHARS has_32_bit_only_cpu]}) (List (= scope= flags=0 words=[] bindings=[('tag', {[DQ [VarSub tag][LIT_CHARS -32bit]]})]) (= scope= flags=0 words=[] bindings=[('tag_key', {[DQ [VarSub tag_key][LIT_CHARS -32bit]]})]) ) ) (= scope= flags=0 words=[] bindings=[('tag', {[DQ [VarSub tag][LIT_CHARS -full]]})]) (= scope= flags=0 words=[] bindings=[('tag_key', {[DQ [VarSub tag_key][LIT_CHARS -full]]})]) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "tag = "][VarSub tag]]}) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "tag_key = "][VarSub tag_key]]}) (= scope= flags=0 words=[] bindings=[('read_tag', {[DQ [ComSub (Com redirects=[(FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 2)]{[LIT_CHARS infoplist_read]} {[DQ [VarSub old_ks_plist]]} {[DQ [VarSub tag_key]]})]]})]) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "read_tag = "][VarSub read_tag]]}) (If (DBracket {B1 UNARY_STRING_z {[DQ [VarSub read_tag]]}}) (List (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "couldn't mark failed patch update"]]}) (If (DBracket {B1 UNARY_STRING_n {[DQ [VarSub set_e]]}}) (Com {[LIT_CHARS set]} {[LIT_CHARS -e]}) ) (Com {[LIT_CHARS return]} {[LIT_CHARS 0]}) ) ) (Com {[LIT_CHARS rm]} {[LIT_CHARS -f]} {[DQ [VarSub want_full_installer_path]]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 2), > ) (Com {[LIT_CHARS echo]} {[DQ [VarSub old_version_app]]} < (FilenameRedirectNode filename={[DQ [VarSub want_full_installer_path]]} "> 1), > ) (= scope= flags=0 words=[] bindings=[('chmod_mode', {[DQ [LIT_CHARS 644]]})]) (If (AndOr OP_AND_IF (DBracket {B1 UNARY_STRING_z {[DQ [VarSub system_ticket]]}}) (AndOr OP_AND_IF (DBracket {B2 BINARY_STRING_EQUAL {[DQ [VarSub want_full_installer_path transform_ops=[Slice {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 0]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 14]}}]]]} {[DQ [LIT_CHARS /Applications/]]}}) (Com {[LIT_CHARS chgrp]} {[LIT_CHARS admin]} {[DQ [VarSub want_full_installer_path]]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 2), > ) ) ) (= scope= flags=0 words=[] bindings=[('chmod_mode', {[DQ [LIT_CHARS 664]]})]) ) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "chmod_mode = "][VarSub chmod_mode]]}) (Com {[LIT_CHARS chmod]} {[DQ [VarSub chmod_mode]]} {[DQ [VarSub want_full_installer_path]]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 2), > ) (= scope= flags=0 words=[] bindings=[('old_ks_plist_path', {[DQ [VarSub old_ks_plist][LIT_CHARS .plist]]})]) (= scope= flags=0 words=[] bindings=[('ksadmin_args', {[Array {OP_NEWLINE "\n"} {[LIT_CHARS --productid]} {[DQ [VarSub product_id]]} {OP_NEWLINE "\n"}]})]) (If (Com {[LIT_CHARS ksadmin_supports_tag]}) (= scope= flags=0 words=[] bindings=[('ksadmin_args+', {[Array {OP_NEWLINE "\n"} {[LIT_CHARS --tag]} {[DQ [VarSub tag]]} {OP_NEWLINE "\n"}]})]) ) (If (Com {[LIT_CHARS ksadmin_supports_tagpath_tagkey]}) (= scope= flags=0 words=[] bindings=[('ksadmin_args+', {[Array {OP_NEWLINE "\n"} {[LIT_CHARS --tag-path]} {[DQ [VarSub old_ks_plist_path]]} {OP_NEWLINE "\n"} {[LIT_CHARS --tag-key]} {[DQ [VarSub tag_key]]} {OP_NEWLINE "\n"}]})]) ) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "ksadmin_args = "][VarSub ksadmin_args bracket_op=(Index {A Atom NODE_ARITH_WORD {AS_OP_STAR "*"}})]]}) (If (Pipeline! (Com {[LIT_CHARS ksadmin]} {[DQ [VarSub ksadmin_args bracket_op=(Index {A Atom NODE_ARITH_WORD {AS_OP_AT "@"}})]]}) ) (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "ksadmin failed to mark failed patch update"]]}) (ElseTrue) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "marked failed patch update"]]}) ) (If (DBracket {B1 UNARY_STRING_n {[DQ [VarSub set_e]]}}) (Com {[LIT_CHARS set]} {[LIT_CHARS -e]}) ) ) ) (FunctionDef usage [] (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "usage: "][VarSub ME][LIT_CHARS " update_dmg_mount_point"]]} < (DescriptorRedirectNode target={[LIT_CHARS 2]} &"> 1), > ) ) (FunctionDef main [] (List (= scope= flags=0 words=[] bindings=[('update_dmg_mount_point', {[DQ [VarSub 1]]})]) (Com {[LIT_CHARS set]} {[LIT_CHARS -e]}) (Com {[LIT_CHARS trap]} {[LIT_CHARS cleanup]} {[LIT_CHARS EXIT]} {[LIT_CHARS HUP]} {[LIT_CHARS INT]} {[LIT_CHARS QUIT]} {[LIT_CHARS TERM]}) (= scope= flags=2 words=[] bindings=[('PRODUCT_NAME', {[DQ [LIT_CHARS "Google Chrome"]]})]) (= scope= flags=2 words=[] bindings=[('APP_DIR', {[DQ [VarSub PRODUCT_NAME][LIT_CHARS .app]]})]) (= scope= flags=2 words=[] bindings=[('ALTERNATE_APP_DIR', {[DQ [VarSub PRODUCT_NAME][LIT_CHARS " Canary.app"]]})]) (= scope= flags=2 words=[] bindings=[('FRAMEWORK_NAME', {[DQ [VarSub PRODUCT_NAME][LIT_CHARS " Framework"]]})]) (= scope= flags=2 words=[] bindings=[('FRAMEWORK_DIR', {[DQ [VarSub FRAMEWORK_NAME][LIT_CHARS .framework]]})]) (= scope= flags=2 words=[] bindings=[('PATCH_DIR', {[DQ [LIT_CHARS .patch]]})]) (= scope= flags=2 words=[] bindings=[('CONTENTS_DIR', {[DQ [LIT_CHARS Contents]]})]) (= scope= flags=2 words=[] bindings=[('APP_PLIST', {[DQ [VarSub CONTENTS_DIR][LIT_CHARS /Info]]})]) (= scope= flags=2 words=[] bindings=[('VERSIONS_DIR', {[DQ [VarSub CONTENTS_DIR][LIT_CHARS /Versions]]})]) (= scope= flags=2 words=[] bindings=[('UNROOTED_BRAND_PLIST', {[DQ [LIT_CHARS "Library/Google/Google Chrome Brand"]]})]) (= scope= flags=2 words=[] bindings=[('UNROOTED_DEBUG_FILE', {[DQ [LIT_CHARS "Library/Google/Google Chrome Updater Debug"]]})]) (= scope= flags=2 words=[] bindings=[('APP_VERSION_KEY', {[DQ [LIT_CHARS CFBundleShortVersionString]]})]) (= scope= flags=2 words=[] bindings=[('APP_BUNDLEID_KEY', {[DQ [LIT_CHARS CFBundleIdentifier]]})]) (= scope= flags=2 words=[] bindings=[('KS_VERSION_KEY', {[DQ [LIT_CHARS KSVersion]]})]) (= scope= flags=2 words=[] bindings=[('KS_PRODUCT_KEY', {[DQ [LIT_CHARS KSProductID]]})]) (= scope= flags=2 words=[] bindings=[('KS_URL_KEY', {[DQ [LIT_CHARS KSUpdateURL]]})]) (= scope= flags=2 words=[] bindings=[('KS_BRAND_KEY', {[DQ [LIT_CHARS KSBrandID]]})]) (= scope= flags=2 words=[] bindings=[('QUARANTINE_ATTR', {[DQ [LIT_CHARS com.apple.quarantine]]})]) (= scope= flags=2 words=[] bindings=[('RSYNC_FLAGS', {[DQ [LIT_CHARS -Ilprt]]})]) (If (AndOr OP_OR_IF (DBracket {B1 UNARY_FILE_e {[DQ [LIT_CHARS /][VarSub UNROOTED_DEBUG_FILE]]}}) (DBracket {B1 UNARY_FILE_e {[LIT_TILDE "~"] [LIT_CHARS /] [DQ [VarSub UNROOTED_DEBUG_FILE]]}}) ) (= scope= flags=1 words=[] bindings=[('GOOGLE_CHROME_UPDATER_DEBUG', {[DQ [LIT_CHARS y]]})]) ) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "update_dmg_mount_point = "][VarSub update_dmg_mount_point]]}) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "checking update"]]}) (If (AndOr OP_OR_IF (DBracket {B1 UNARY_STRING_z {[DQ [VarSub update_dmg_mount_point]]}}) (AndOr OP_OR_IF (DBracket {B2 BINARY_STRING_NOT_EQUAL {[DQ [VarSub update_dmg_mount_point transform_ops=[Slice {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 0]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 1]}}]]]} {[DQ [LIT_CHARS /]]}}) (Pipeline! (DBracket {B1 UNARY_FILE_d {[DQ [VarSub update_dmg_mount_point]]}}) ) ) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "update_dmg_mount_point must be an absolute path to a directory"]]}) (Com {[LIT_CHARS usage]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 2]}) ) ) (= scope= flags=0 words=[] bindings=[('patch_dir', {[DQ [VarSub update_dmg_mount_point][LIT_CHARS /][VarSub PATCH_DIR]]})]) (If (DBracket {B2 BINARY_STRING_NOT_EQUAL {[DQ [VarSub patch_dir transform_ops=[Slice {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 0]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 1]}}]]]} {[DQ [LIT_CHARS /]]}}) (List (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "patch_dir = "][VarSub patch_dir]]}) (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "patch_dir must be an absolute path"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 2]}) ) ) (= scope= flags=0 words=[] bindings=[('is_patch', {[SQ ]})]) (= scope= flags=0 words=[] bindings=[('dirpatcher', {[SQ ]})]) (If (DBracket {B1 UNARY_FILE_d {[DQ [VarSub patch_dir]]}}) (List (= scope= flags=0 words=[] bindings=[('is_patch', {[DQ [LIT_CHARS y]]})]) (= scope= flags=0 words=[] bindings=[('dirpatcher', {[DQ [VarSub patch_dir][LIT_CHARS /dirpatcher.sh]]})]) (If (Pipeline! (DBracket {B1 UNARY_FILE_x {[DQ [VarSub dirpatcher]]}}) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "couldn't locate dirpatcher"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 6]}) ) ) ) (DBracket {B1 UNARY_FILE_e {[DQ [VarSub patch_dir]]}}) (List (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "patch_dir = "][VarSub patch_dir]]}) (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "patch_dir must be a directory"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 2]}) ) (ElseTrue) (= scope= flags=0 words=[] bindings=[('patch_dir', {[SQ ]})]) ) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "patch_dir = "][VarSub patch_dir]]}) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "is_patch = "][VarSub is_patch]]}) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "dirpatcher = "][VarSub dirpatcher]]}) (= scope= flags=0 words=[] bindings=[('update_app', {[SQ ]})]) (= scope= flags=0 words=[] bindings=[('update_version_app_old', {[SQ ]})]) (= scope= flags=0 words=[] bindings=[('patch_app_dir', {[SQ ]})]) (= scope= flags=0 words=[] bindings=[('patch_versioned_dir', {[SQ ]})]) (= scope= flags=0 words=[{[LIT_CHARS update_version_app]}, {[LIT_CHARS update_version_ks]}, {[LIT_CHARS product_id]}] bindings=[]) (If (DBracket {B1 UNARY_STRING_z {[DQ [VarSub is_patch]]}}) (List (= scope= flags=0 words=[] bindings=[('update_app', {[DQ [VarSub update_dmg_mount_point][LIT_CHARS /][VarSub APP_DIR]]})]) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "update_app = "][VarSub update_app]]}) (If (DBracket {B2 BINARY_STRING_NOT_EQUAL {[DQ [VarSub update_app transform_ops=[Slice {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 0]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 1]}}]]]} {[DQ [LIT_CHARS /]]}}) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "update_app must be an absolute path"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 2]}) ) ) (If (Pipeline! (DBracket {B1 UNARY_FILE_d {[DQ [VarSub update_app]]}}) ) (List (= scope= flags=0 words=[] bindings=[('update_app', {[DQ [VarSub update_dmg_mount_point][LIT_CHARS /][VarSub ALTERNATE_APP_DIR]]})]) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "update_app = "][VarSub update_app]]}) (If (DBracket {B2 BINARY_STRING_NOT_EQUAL {[DQ [VarSub update_app transform_ops=[Slice {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 0]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 1]}}]]]} {[DQ [LIT_CHARS /]]}}) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "update_app (alternate) must be an absolute path"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 2]}) ) ) (If (Pipeline! (DBracket {B1 UNARY_FILE_d {[DQ [VarSub update_app]]}}) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "update_app must be a directory"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 2]}) ) ) ) ) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "reading update values"]]}) (= scope= flags=0 words=[] bindings=[('update_app_plist', {[DQ [VarSub update_app][LIT_CHARS /][VarSub APP_PLIST]]})]) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "update_app_plist = "][VarSub update_app_plist]]}) (If (AndOr OP_OR_IF (Pipeline! (= scope= flags=0 words=[] bindings=[('update_version_app', {[DQ [ComSub (Com {[LIT_CHARS infoplist_read]} {[DQ [VarSub update_app_plist]]} {[DQ [VarSub APP_VERSION_KEY]]})]]})]) ) (DBracket {B1 UNARY_STRING_z {[DQ [VarSub update_version_app]]}}) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "couldn't determine update_version_app"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 2]}) ) ) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "update_version_app = "][VarSub update_version_app]]}) (= scope= flags=0 words=[] bindings=[('update_ks_plist', {[DQ [VarSub update_app_plist]]})]) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "update_ks_plist = "][VarSub update_ks_plist]]}) (If (AndOr OP_OR_IF (Pipeline! (= scope= flags=0 words=[] bindings=[('update_version_ks', {[DQ [ComSub (Com {[LIT_CHARS infoplist_read]} {[DQ [VarSub update_ks_plist]]} {[DQ [VarSub KS_VERSION_KEY]]})]]})]) ) (DBracket {B1 UNARY_STRING_z {[DQ [VarSub update_version_ks]]}}) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "couldn't determine update_version_ks"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 2]}) ) ) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "update_version_ks = "][VarSub update_version_ks]]}) (If (AndOr OP_OR_IF (Pipeline! (= scope= flags=0 words=[] bindings=[('product_id', {[DQ [ComSub (Com {[LIT_CHARS infoplist_read]} {[DQ [VarSub update_ks_plist]]} {[DQ [VarSub KS_PRODUCT_KEY]]})]]})]) ) (DBracket {B1 UNARY_STRING_z {[DQ [VarSub product_id]]}}) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "couldn't determine product_id"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 2]}) ) ) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "product_id = "][VarSub product_id]]}) ) (ElseTrue) (List (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "reading update values"]]}) (If (AndOr OP_OR_IF (Pipeline! (= scope= flags=0 words=[] bindings=[('update_version_app_old', {[ComSub (Com redirects=[(FilenameRedirectNode filename={[DQ [VarSub patch_dir][LIT_CHARS /old_app_version]]} 0)])]})]) ) (DBracket {B1 UNARY_STRING_z {[DQ [VarSub update_version_app_old]]}}) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "couldn't determine update_version_app_old"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 2]}) ) ) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "update_version_app_old = "][VarSub update_version_app_old]]}) (If (AndOr OP_OR_IF (Pipeline! (= scope= flags=0 words=[] bindings=[('update_version_app', {[ComSub (Com redirects=[(FilenameRedirectNode filename={[DQ [VarSub patch_dir][LIT_CHARS /new_app_version]]} 0)])]})]) ) (DBracket {B1 UNARY_STRING_z {[DQ [VarSub update_version_app]]}}) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "couldn't determine update_version_app"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 2]}) ) ) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "update_version_app = "][VarSub update_version_app]]}) (If (AndOr OP_OR_IF (Pipeline! (= scope= flags=0 words=[] bindings=[('update_version_ks', {[ComSub (Com redirects=[(FilenameRedirectNode filename={[DQ [VarSub patch_dir][LIT_CHARS /new_ks_version]]} 0)])]})]) ) (DBracket {B1 UNARY_STRING_z {[DQ [VarSub update_version_ks]]}}) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "couldn't determine update_version_ks"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 2]}) ) ) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "update_version_ks = "][VarSub update_version_ks]]}) (If (AndOr OP_OR_IF (Pipeline! (= scope= flags=0 words=[] bindings=[('product_id', {[ComSub (Com redirects=[(FilenameRedirectNode filename={[DQ [VarSub patch_dir][LIT_CHARS /ks_product]]} 0)])]})]) ) (DBracket {B1 UNARY_STRING_z {[DQ [VarSub product_id]]}}) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "couldn't determine product_id"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 2]}) ) ) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "product_id = "][VarSub product_id]]}) (= scope= flags=0 words=[] bindings=[('patch_app_dir', {[DQ [VarSub patch_dir][LIT_CHARS /application.dirpatch]]})]) (If (Pipeline! (DBracket {B1 UNARY_FILE_d {[DQ [VarSub patch_app_dir]]}}) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "couldn't locate patch_app_dir"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 6]}) ) ) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "patch_app_dir = "][VarSub patch_app_dir]]}) (= scope= flags=0 words=[] bindings=[('patch_versioned_dir', {[DQ [VarSub patch_dir][LIT_CHARS /version_][VarSub update_version_app_old][LIT_CHARS _][VarSub update_version_app][LIT_CHARS .dirpatch]]})]) (If (Pipeline! (DBracket {B1 UNARY_FILE_d {[DQ [VarSub patch_versioned_dir]]}}) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "couldn't locate patch_versioned_dir"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 6]}) ) ) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "patch_versioned_dir = "][VarSub patch_versioned_dir]]}) ) ) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "checking Keystone"]]}) (= scope= flags=0 words=[{[LIT_CHARS ksadmin_path]}] bindings=[]) (If (AndOr OP_OR_IF (Pipeline! (= scope= flags=0 words=[] bindings=[('ksadmin_path', {[DQ [ComSub (Com {[LIT_CHARS type]} {[LIT_CHARS -p]} {[LIT_CHARS ksadmin]})]]})]) ) (DBracket {B1 UNARY_STRING_z {[DQ [VarSub ksadmin_path]]}}) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "couldn't locate ksadmin_path"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 3]}) ) ) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "ksadmin_path = "][VarSub ksadmin_path]]}) (AndOr OP_OR_IF (Com {[LIT_CHARS ksadmin_version]} < (DescriptorRedirectNode target={[LIT_CHARS /dev/null]} &"> 1), > ) (Com {[LIT_CHARS true]}) ) (= scope= flags=0 words=[{[LIT_CHARS ksadmin_version_string]}] bindings=[]) (= scope= flags=0 words=[] bindings=[('ksadmin_version_string', {[DQ [ComSub (AndOr OP_OR_IF (Com redirects=[(FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 2)]{[LIT_CHARS ksadmin_version]}) (Com {[LIT_CHARS true]}) )]]})]) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "ksadmin_version_string = "][VarSub ksadmin_version_string]]}) (= scope= flags=0 words=[{[LIT_CHARS installed_app]}] bindings=[]) (If (AndOr OP_OR_IF (Pipeline! (= scope= flags=0 words=[] bindings=[('installed_app', {[DQ [ComSub (Pipeline (Com {[LIT_CHARS ksadmin]} {[LIT_CHARS -pP]} {[DQ [VarSub product_id]]}) (Com {[LIT_CHARS sed]} {[LIT_CHARS -Ene]} {[DQ [LIT_CHARS "s%^[[:space:]]+xc="][\ LIT_ESCAPED_CHAR "\\$"][LIT_CHARS "%"][\ LIT_ESCAPED_CHAR "\\\\"][LIT_CHARS "1%p"]]}) )]]})]) ) (DBracket {B1 UNARY_STRING_z {[DQ [VarSub installed_app]]}}) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "couldn't locate installed_app"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 3]}) ) ) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "installed_app = "][VarSub installed_app]]}) (= scope= flags=0 words=[] bindings=[('want_full_installer_path', {[DQ [VarSub installed_app][LIT_CHARS /.want_full_installer]]})]) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "want_full_installer_path = "][VarSub want_full_installer_path]]}) (If (AndOr OP_OR_IF (DBracket {B2 BINARY_STRING_NOT_EQUAL {[DQ [VarSub installed_app transform_ops=[Slice {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 0]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 1]}}]]]} {[DQ [LIT_CHARS /]]}}) (Pipeline! (DBracket {B1 UNARY_FILE_d {[DQ [VarSub installed_app]]}}) ) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "installed_app must be an absolute path to a directory"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 3]}) ) ) (= scope= flags=0 words=[] bindings=[('system_ticket', {[SQ ]})]) (If (DBracket {B2 BINARY_INT_EQ {[VarSub EUID]} {[LIT_CHARS 0]}}) (= scope= flags=0 words=[] bindings=[('system_ticket', {[DQ [LIT_CHARS y]]})]) ) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "system_ticket = "][VarSub system_ticket]]}) (If (AndOr OP_AND_IF (DBracket {B1 UNARY_STRING_z {[DQ [VarSub system_ticket]]}}) (Com {[LIT_CHARS ksadmin]} {[LIT_CHARS -S]} {[LIT_CHARS --print-tickets]} {[LIT_CHARS --productid]} {[DQ [VarSub product_id]]} < (DescriptorRedirectNode target={[LIT_CHARS /dev/null]} &"> 1), > ) ) (List (AndOr OP_OR_IF (Com {[LIT_CHARS ksadmin]} {[LIT_CHARS --delete]} {[LIT_CHARS --productid]} {[DQ [VarSub product_id]]}) (Com {[LIT_CHARS true]}) ) (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "can't update on a user ticket when a system ticket is also present"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 4]}) ) ) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "reading install values"]]}) (= scope= flags=0 words=[] bindings=[('installed_app_plist', {[DQ [VarSub installed_app][LIT_CHARS /][VarSub APP_PLIST]]})]) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "installed_app_plist = "][VarSub installed_app_plist]]}) (= scope= flags=0 words=[] bindings=[('installed_app_plist_path', {[DQ [VarSub installed_app_plist][LIT_CHARS .plist]]})]) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "installed_app_plist_path = "][VarSub installed_app_plist_path]]}) (= scope= flags=0 words=[{[LIT_CHARS old_version_app]}] bindings=[]) (= scope= flags=0 words=[] bindings=[('old_version_app', {[DQ [ComSub (AndOr OP_OR_IF (Com {[LIT_CHARS infoplist_read]} {[DQ [VarSub installed_app_plist]]} {[DQ [VarSub APP_VERSION_KEY]]}) (Com {[LIT_CHARS true]}) )]]})]) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "old_version_app = "][VarSub old_version_app]]}) (If (DBracket {B1 UNARY_STRING_n {[DQ [VarSub is_patch]]}}) (If (DBracket {B1 UNARY_STRING_z {[DQ [VarSub old_version_app]]}}) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "old_version_app required for patch"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 6]}) ) (DBracket {B2 BINARY_STRING_NOT_EQUAL {[DQ [VarSub old_version_app]]} {[DQ [VarSub update_version_app_old]]}}) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "this patch does not apply to the installed version"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 6]}) ) ) ) (= scope= flags=0 words=[] bindings=[('installed_versions_dir', {[DQ [VarSub installed_app][LIT_CHARS /][VarSub VERSIONS_DIR]]})]) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "installed_versions_dir = "][VarSub installed_versions_dir]]}) (= scope= flags=0 words=[{[LIT_CHARS old_versioned_dir]}] bindings=[]) (If (DBracket {B1 UNARY_STRING_n {[DQ [VarSub old_version_app]]}}) (= scope= flags=0 words=[] bindings=[('old_versioned_dir', {[DQ [VarSub installed_versions_dir][LIT_CHARS /][VarSub old_version_app]]})]) ) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "old_versioned_dir = "][VarSub old_versioned_dir]]}) (= scope= flags=0 words=[] bindings=[('old_ks_plist', {[DQ [VarSub installed_app_plist]]})]) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "old_ks_plist = "][VarSub old_ks_plist]]}) (= scope= flags=0 words=[{[LIT_CHARS old_brand]}] bindings=[]) (= scope= flags=0 words=[] bindings=[('old_brand', {[DQ [ComSub (AndOr OP_OR_IF (Com redirects=[(FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 2)]{[LIT_CHARS infoplist_read]} {[DQ [VarSub old_ks_plist]]} {[DQ [VarSub KS_BRAND_KEY]]}) (Com {[LIT_CHARS true]}) )]]})]) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "old_brand = "][VarSub old_brand]]}) (= scope= flags=0 words=[] bindings=[('update_versioned_dir', {[SQ ]})]) (If (DBracket {B1 UNARY_STRING_z {[DQ [VarSub is_patch]]}}) (List (= scope= flags=0 words=[] bindings=[('update_versioned_dir', {[DQ [VarSub update_app][LIT_CHARS /][VarSub VERSIONS_DIR][LIT_CHARS /][VarSub update_version_app]]})]) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "update_versioned_dir = "][VarSub update_versioned_dir]]}) ) ) (If (Com {[LIT_CHARS has_32_bit_only_cpu]}) (List (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "system is 32-bit-only"]]}) (= scope= flags=0 words=[{[LIT_CHARS test_binary]}] bindings=[]) (If (DBracket {B1 UNARY_STRING_z {[DQ [VarSub is_patch]]}}) (List (= scope= flags=0 words=[] bindings=[('update_framework_dir', {[DQ [VarSub update_versioned_dir][LIT_CHARS /][VarSub FRAMEWORK_DIR]]})]) (= scope= flags=0 words=[] bindings=[('test_binary', {[DQ [VarSub update_framework_dir][LIT_CHARS /][VarSub FRAMEWORK_NAME]]})]) ) (ElseTrue) (= scope= flags=0 words=[] bindings=[('test_binary', {[DQ [VarSub patch_dir][LIT_CHARS /goobspatch]]})]) ) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "test_binary = "][VarSub test_binary]]}) (If (Pipeline! (Com {[LIT_CHARS file]} {[DQ [VarSub test_binary]]}) (Com {[LIT_CHARS grep]} {[LIT_CHARS -q]} {[SQ ]}) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "can't install non-32-bit update on 32-bit-only system"]]}) (Com {[LIT_CHARS mark_32_bit_only_system]} {[DQ [VarSub product_id]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 14]}) ) (ElseTrue) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "update will run on a 32-bit-only system"]]}) ) ) ) (Com {[LIT_CHARS ensure_writable_symlinks_recursive]} {[DQ [VarSub installed_app]]}) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "creating installed_versions_dir"]]}) (If (Pipeline! (Com {[LIT_CHARS mkdir]} {[LIT_CHARS -p]} {[DQ [VarSub installed_versions_dir]]}) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "mkdir of installed_versions_dir failed"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 5]}) ) ) (= scope= flags=0 words=[{[LIT_CHARS new_versioned_dir]}] bindings=[]) (= scope= flags=0 words=[] bindings=[('new_versioned_dir', {[DQ [VarSub installed_versions_dir][LIT_CHARS /][VarSub update_version_app]]})]) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "new_versioned_dir = "][VarSub new_versioned_dir]]}) (If (AndOr OP_AND_IF (DBracket {B1 UNARY_FILE_e {[DQ [VarSub new_versioned_dir]]}}) (Subshell (AndOr OP_OR_IF (DBracket {B1 UNARY_FILE_L {[DQ [VarSub new_versioned_dir]]}}) (Pipeline! (DBracket {B1 UNARY_FILE_d {[DQ [VarSub new_versioned_dir]]}}) ) ) ) ) (List (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "removing non-directory in place of versioned directory"]]}) (AndOr OP_OR_IF (Com {[LIT_CHARS rm]} {[LIT_CHARS -f]} {[DQ [VarSub new_versioned_dir]]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 2), > ) (Com {[LIT_CHARS true]}) ) ) ) (If (DBracket {B1 UNARY_STRING_n {[DQ [VarSub is_patch]]}}) (List (= scope= flags=0 words=[{[LIT_CHARS versioned_dir_target]}] bindings=[]) (If (Pipeline! (DBracket {B1 UNARY_FILE_e {[DQ [VarSub new_versioned_dir]]}}) ) (List (= scope= flags=0 words=[] bindings=[('versioned_dir_target', {[DQ [VarSub new_versioned_dir]]})]) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "versioned_dir_target = "][VarSub versioned_dir_target]]}) ) (ElseTrue) (List (Com {[LIT_CHARS ensure_temp_dir]}) (= scope= flags=0 words=[] bindings=[('versioned_dir_target', {[DQ [VarSub g_temp_dir][LIT_CHARS /][VarSub update_version_app]]})]) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "versioned_dir_target = "][VarSub versioned_dir_target]]}) (= scope= flags=0 words=[] bindings=[('update_versioned_dir', {[DQ [VarSub versioned_dir_target]]})]) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "update_versioned_dir = "][VarSub update_versioned_dir]]}) ) ) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "dirpatching versioned directory"]]}) (If (Pipeline! (Com {[DQ [VarSub dirpatcher]]} {[DQ [VarSub old_versioned_dir]]} {[DQ [VarSub patch_versioned_dir]]} {[DQ [VarSub versioned_dir_target]]}) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "dirpatcher of versioned directory failed, status "][VarSub PIPESTATUS bracket_op=(Index {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 0]}})]]}) (Com {[LIT_CHARS mark_failed_patch_update]} {[DQ [VarSub product_id]]} {[DQ [VarSub want_full_installer_path]]} {[DQ [VarSub old_ks_plist]]} {[DQ [VarSub old_version_app]]} {[DQ [VarSub system_ticket]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 12]}) ) ) ) ) (If (DBracket {B1 UNARY_STRING_n {[DQ [VarSub update_versioned_dir]]}}) (List (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "rsyncing versioned directory"]]}) (If (Pipeline! (Com {[LIT_CHARS rsync]} {[VarSub RSYNC_FLAGS]} {[LIT_CHARS --delete-before]} {[DQ [VarSub update_versioned_dir][LIT_CHARS /]]} {[DQ [VarSub new_versioned_dir]]}) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "rsync of versioned directory failed, status "][VarSub PIPESTATUS bracket_op=(Index {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 0]}})]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 7]}) ) ) ) ) (If (DBracket {B1 UNARY_STRING_n {[DQ [VarSub is_patch]]}}) (List (If (DBracket {B1 UNARY_STRING_n {[DQ [VarSub update_versioned_dir]]}}) (List (AndOr OP_OR_IF (Com {[LIT_CHARS rm]} {[LIT_CHARS -rf]} {[DQ [VarSub update_versioned_dir]]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 2), > ) (Com {[LIT_CHARS true]}) ) (= scope= flags=0 words=[] bindings=[('update_versioned_dir', {[SQ ]})]) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "update_versioned_dir = "][VarSub update_versioned_dir]]}) ) ) (Com {[LIT_CHARS ensure_temp_dir]}) (= scope= flags=0 words=[] bindings=[('update_app', {[DQ [VarSub g_temp_dir][LIT_CHARS /][VarSub APP_DIR]]})]) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "update_app = "][VarSub update_app]]}) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "dirpatching app directory"]]}) (If (Pipeline! (Com {[DQ [VarSub dirpatcher]]} {[DQ [VarSub installed_app]]} {[DQ [VarSub patch_app_dir]]} {[DQ [VarSub update_app]]}) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "dirpatcher of app directory failed, status "][VarSub PIPESTATUS bracket_op=(Index {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 0]}})]]}) (Com {[LIT_CHARS mark_failed_patch_update]} {[DQ [VarSub product_id]]} {[DQ [VarSub want_full_installer_path]]} {[DQ [VarSub old_ks_plist]]} {[DQ [VarSub old_version_app]]} {[DQ [VarSub system_ticket]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 13]}) ) ) ) ) (= scope= flags=0 words=[] bindings=[('needs_touch', {[SQ ]})]) (If (DBracket {B2 BINARY_FILE_NT {[DQ [VarSub installed_app]]} {[DQ [VarSub update_app]]}}) (= scope= flags=0 words=[] bindings=[('needs_touch', {[DQ [LIT_CHARS y]]})]) ) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "needs_touch = "][VarSub needs_touch]]}) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "rsyncing app directory"]]}) (If (Pipeline! (Com {[LIT_CHARS rsync]} {[VarSub RSYNC_FLAGS]} {[LIT_CHARS --delete-after]} {[LIT_CHARS --exclude]} {[DQ [LIT_CHARS /][VarSub VERSIONS_DIR][LIT_CHARS "/*"]]} {[DQ [VarSub update_app][LIT_CHARS /]]} {[DQ [VarSub installed_app]]}) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "rsync of app directory failed, status "][VarSub PIPESTATUS bracket_op=(Index {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 0]}})]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 8]}) ) ) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "rsyncs complete"]]}) (If (DBracket {B1 UNARY_STRING_n {[DQ [VarSub is_patch]]}}) (List (AndOr OP_OR_IF (Com {[LIT_CHARS rm]} {[LIT_CHARS -rf]} {[DQ [VarSub update_app]]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 2), > ) (Com {[LIT_CHARS true]}) ) (= scope= flags=0 words=[] bindings=[('update_app', {[SQ ]})]) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "update_app = "][VarSub update_app]]}) ) ) (If (DBracket {B1 UNARY_STRING_n {[DQ [VarSub g_temp_dir]]}}) (List (AndOr OP_OR_IF (Com {[LIT_CHARS rm]} {[LIT_CHARS -rf]} {[DQ [VarSub g_temp_dir]]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 2), > ) (Com {[LIT_CHARS true]}) ) (= scope= flags=0 words=[] bindings=[('g_temp_dir', {[SQ ]})]) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "g_temp_dir = "][VarSub g_temp_dir]]}) ) ) (AndOr OP_OR_IF (Com {[LIT_CHARS rm]} {[LIT_CHARS -f]} {[DQ [VarSub want_full_installer_path]]}) (Com {[LIT_CHARS true]}) ) (If (DBracket {B1 UNARY_STRING_n {[DQ [VarSub needs_touch]]}}) (AndOr OP_OR_IF (Com {[LIT_CHARS touch]} {[LIT_CHARS -cf]} {[DQ [VarSub installed_app]]}) (Com {[LIT_CHARS true]}) ) ) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "reading new values"]]}) (= scope= flags=0 words=[{[LIT_CHARS new_version_app]}] bindings=[]) (If (AndOr OP_OR_IF (Pipeline! (= scope= flags=0 words=[] bindings=[('new_version_app', {[DQ [ComSub (Com {[LIT_CHARS infoplist_read]} {[DQ [VarSub installed_app_plist]]} {[DQ [VarSub APP_VERSION_KEY]]})]]})]) ) (DBracket {B1 UNARY_STRING_z {[DQ [VarSub new_version_app]]}}) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "couldn't determine new_version_app"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 9]}) ) ) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "new_version_app = "][VarSub new_version_app]]}) (= scope= flags=0 words=[] bindings=[('new_versioned_dir', {[DQ [VarSub installed_versions_dir][LIT_CHARS /][VarSub new_version_app]]})]) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "new_versioned_dir = "][VarSub new_versioned_dir]]}) (= scope= flags=0 words=[] bindings=[('new_ks_plist', {[DQ [VarSub installed_app_plist]]})]) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "new_ks_plist = "][VarSub new_ks_plist]]}) (= scope= flags=0 words=[{[LIT_CHARS new_version_ks]}] bindings=[]) (If (AndOr OP_OR_IF (Pipeline! (= scope= flags=0 words=[] bindings=[('new_version_ks', {[DQ [ComSub (Com {[LIT_CHARS infoplist_read]} {[DQ [VarSub new_ks_plist]]} {[DQ [VarSub KS_VERSION_KEY]]})]]})]) ) (DBracket {B1 UNARY_STRING_z {[DQ [VarSub new_version_ks]]}}) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "couldn't determine new_version_ks"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 9]}) ) ) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "new_version_ks = "][VarSub new_version_ks]]}) (= scope= flags=0 words=[{[LIT_CHARS update_url]}] bindings=[]) (If (AndOr OP_OR_IF (Pipeline! (= scope= flags=0 words=[] bindings=[('update_url', {[DQ [ComSub (Com {[LIT_CHARS infoplist_read]} {[DQ [VarSub new_ks_plist]]} {[DQ [VarSub KS_URL_KEY]]})]]})]) ) (DBracket {B1 UNARY_STRING_z {[DQ [VarSub update_url]]}}) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "couldn't determine update_url"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 9]}) ) ) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "update_url = "][VarSub update_url]]}) (= scope= flags=0 words=[{[LIT_CHARS channel]}] bindings=[]) (= scope= flags=0 words=[] bindings=[('channel', {[DQ [ComSub (AndOr OP_OR_IF (Com redirects=[(FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 2)]{[LIT_CHARS infoplist_read]} {[DQ [VarSub new_ks_plist]]} {[DQ [VarSub KS_CHANNEL_KEY]]}) (Com {[LIT_CHARS true]}) )]]})]) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "channel = "][VarSub channel]]}) (= scope= flags=0 words=[] bindings=[('tag', {[DQ [VarSub channel]]})]) (= scope= flags=0 words=[] bindings=[('tag_key', {[DQ [VarSub KS_CHANNEL_KEY]]})]) (If (Com {[LIT_CHARS has_32_bit_only_cpu]}) (List (= scope= flags=0 words=[] bindings=[('tag', {[DQ [VarSub tag][LIT_CHARS -32bit]]})]) (= scope= flags=0 words=[] bindings=[('tag_key', {[DQ [VarSub tag_key][LIT_CHARS -32bit]]})]) ) ) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "tag = "][VarSub tag]]}) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "tag_key = "][VarSub tag_key]]}) (If (DBracket {B2 BINARY_STRING_NOT_EQUAL {[DQ [VarSub new_version_ks]]} {[DQ [VarSub update_version_ks]]}}) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "new_version_ks and update_version_ks do not match"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 10]}) ) ) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "notifying LaunchServices"]]}) (= scope= flags=0 words=[] bindings=[('coreservices', {[DQ [LIT_CHARS /System/Library/Frameworks/CoreServices.framework]]})]) (= scope= flags=0 words=[] bindings=[('launchservices', {[DQ [VarSub coreservices][LIT_CHARS /Frameworks/LaunchServices.framework]]})]) (= scope= flags=0 words=[] bindings=[('lsregister', {[DQ [VarSub launchservices][LIT_CHARS /Support/lsregister]]})]) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "coreservices = "][VarSub coreservices]]}) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "launchservices = "][VarSub launchservices]]}) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "lsregister = "][VarSub lsregister]]}) (AndOr OP_OR_IF (Com {[DQ [VarSub lsregister]]} {[LIT_CHARS -f]} {[DQ [VarSub installed_app]]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 1), > ) (Com {[LIT_CHARS true]}) ) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "handling brand code"]]}) (= scope= flags=0 words=[] bindings=[('set_brand_file_access', {[SQ ]})]) (= scope= flags=0 words=[{[LIT_CHARS brand_plist]}] bindings=[]) (If (DBracket {B1 UNARY_STRING_n {[DQ [VarSub system_ticket]]}}) (List (= scope= flags=0 words=[] bindings=[('set_brand_file_access', {[DQ [LIT_CHARS y]]})]) (= scope= flags=0 words=[] bindings=[('brand_plist', {[DQ [LIT_CHARS /][VarSub UNROOTED_BRAND_PLIST]]})]) ) (ElseTrue) (= scope= flags=0 words=[] bindings=[('brand_plist', {[TildeSub ''] [LIT_CHARS /] [DQ [VarSub UNROOTED_BRAND_PLIST]]})]) ) (= scope= flags=0 words=[] bindings=[('brand_plist_path', {[DQ [VarSub brand_plist][LIT_CHARS .plist]]})]) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "set_brand_file_access = "][VarSub set_brand_file_access]]}) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "brand_plist = "][VarSub brand_plist]]}) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "brand_plist_path = "][VarSub brand_plist_path]]}) (= scope= flags=0 words=[{[LIT_CHARS ksadmin_brand_plist_path]}] bindings=[]) (= scope= flags=0 words=[{[LIT_CHARS ksadmin_brand_key]}] bindings=[]) (If (AndOr OP_OR_IF (DBracket {B2 BINARY_STRING_EQUAL {[DQ [VarSub channel]]} {[DQ [LIT_CHARS beta]]}}) (DBracket {B2 BINARY_STRING_EQUAL {[DQ [VarSub channel]]} {[DQ [LIT_CHARS dev]]}}) ) (List (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "defeating brand code on channel "][VarSub channel]]}) (AndOr OP_OR_IF (Com {[LIT_CHARS rm]} {[LIT_CHARS -f]} {[DQ [VarSub brand_plist_path]]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 2), > ) (Com {[LIT_CHARS true]}) ) ) (DBracket {B1 UNARY_STRING_n {[DQ [VarSub channel]]}}) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "skipping brand code on channel "][VarSub channel]]}) (ElseTrue) (List (If (DBracket {B1 UNARY_STRING_n {[DQ [VarSub old_brand]]}}) (List (= scope= flags=0 words=[{[LIT_CHARS brand_dir]}] bindings=[]) (= scope= flags=0 words=[] bindings=[('brand_dir', {[DQ [ComSub (Com {[LIT_CHARS dirname]} {[DQ [VarSub brand_plist_path]]})]]})]) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "brand_dir = "][VarSub brand_dir]]}) (If (Pipeline! (Com {[LIT_CHARS mkdir]} {[LIT_CHARS -p]} {[DQ [VarSub brand_dir]]}) ) (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "couldn't mkdir brand_dir, continuing"]]}) (ElseTrue) (If (Pipeline! (Com {[LIT_CHARS defaults]} {[LIT_CHARS write]} {[DQ [VarSub brand_plist]]} {[DQ [VarSub KS_BRAND_KEY]]} {[LIT_CHARS -string]} {[DQ [VarSub old_brand]]}) ) (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "couldn't write brand_plist, continuing"]]}) (DBracket {B1 UNARY_STRING_n {[DQ [VarSub set_brand_file_access]]}}) (If (Pipeline! (Com {[LIT_CHARS chown]} {[DQ [LIT_CHARS "root:wheel"]]} {[DQ [VarSub brand_plist_path]]}) ) (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "couldn't chown brand_plist_path, continuing"]]}) (ElseTrue) (If (Pipeline! (Com {[LIT_CHARS chmod]} {[LIT_CHARS 644]} {[DQ [VarSub brand_plist_path]]}) ) (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "couldn't chmod brand_plist_path, continuing"]]}) ) ) ) ) ) ) (= scope= flags=0 words=[] bindings=[('ksadmin_brand_plist_path', {[DQ [VarSub brand_plist_path]]})]) (= scope= flags=0 words=[] bindings=[('ksadmin_brand_key', {[DQ [VarSub KS_BRAND_KEY]]})]) (If (DBracket {B! {B1 UNARY_FILE_f {[DQ [VarSub ksadmin_brand_plist_path]]}}}) (List (= scope= flags=0 words=[] bindings=[('ksadmin_brand_plist_path', {[SQ ]})]) (= scope= flags=0 words=[] bindings=[('ksadmin_brand_key', {[SQ ]})]) ) ) ) ) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "ksadmin_brand_plist_path = "][VarSub ksadmin_brand_plist_path]]}) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "ksadmin_brand_key = "][VarSub ksadmin_brand_key]]}) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "notifying Keystone"]]}) (= scope= flags=0 words=[] bindings=[('ksadmin_args', {[Array {OP_NEWLINE "\n"} {[LIT_CHARS --register]} {OP_NEWLINE "\n"} {[LIT_CHARS --productid]} {[DQ [VarSub product_id]]} {OP_NEWLINE "\n"} {[LIT_CHARS --version]} {[DQ [VarSub new_version_ks]]} {OP_NEWLINE "\n"} {[LIT_CHARS --xcpath]} {[DQ [VarSub installed_app]]} {OP_NEWLINE "\n"} {[LIT_CHARS --url]} {[DQ [VarSub update_url]]} {OP_NEWLINE "\n"}]})]) (If (Com {[LIT_CHARS ksadmin_supports_tag]}) (= scope= flags=0 words=[] bindings=[('ksadmin_args+', {[Array {OP_NEWLINE "\n"} {[LIT_CHARS --tag]} {[DQ [VarSub tag]]} {OP_NEWLINE "\n"}]})]) ) (If (Com {[LIT_CHARS ksadmin_supports_tagpath_tagkey]}) (= scope= flags=0 words=[] bindings=[('ksadmin_args+', {[Array {OP_NEWLINE "\n"} {[LIT_CHARS --tag-path]} {[DQ [VarSub installed_app_plist_path]]} {OP_NEWLINE "\n"} {[LIT_CHARS --tag-key]} {[DQ [VarSub tag_key]]} {OP_NEWLINE "\n"}]})]) ) (If (Com {[LIT_CHARS ksadmin_supports_brandpath_brandkey]}) (= scope= flags=0 words=[] bindings=[('ksadmin_args+', {[Array {OP_NEWLINE "\n"} {[LIT_CHARS --brand-path]} {[DQ [VarSub ksadmin_brand_plist_path]]} {OP_NEWLINE "\n"} {[LIT_CHARS --brand-key]} {[DQ [VarSub ksadmin_brand_key]]} {OP_NEWLINE "\n"}]})]) ) (If (Com {[LIT_CHARS ksadmin_supports_versionpath_versionkey]}) (= scope= flags=0 words=[] bindings=[('ksadmin_args+', {[Array {OP_NEWLINE "\n"} {[LIT_CHARS --version-path]} {[DQ [VarSub installed_app_plist_path]]} {OP_NEWLINE "\n"} {[LIT_CHARS --version-key]} {[DQ [VarSub KS_VERSION_KEY]]} {OP_NEWLINE "\n"}]})]) ) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "ksadmin_args = "][VarSub ksadmin_args bracket_op=(Index {A Atom NODE_ARITH_WORD {AS_OP_STAR "*"}})]]}) (If (Pipeline! (Com {[LIT_CHARS ksadmin]} {[DQ [VarSub ksadmin_args bracket_op=(Index {A Atom NODE_ARITH_WORD {AS_OP_AT "@"}})]]}) ) (List (Com {[LIT_CHARS err]} {[DQ [LIT_CHARS "ksadmin failed"]]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 11]}) ) ) (Com {[LIT_CHARS set]} {[LIT_OTHER "+"] [LIT_CHARS e]}) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "cleaning up old versioned directories"]]}) (= scope= flags=0 words=[{[LIT_CHARS versioned_dir]}] bindings=[]) (For versioned_dir [{[DQ [VarSub installed_versions_dir][LIT_CHARS /]] [LIT_OTHER "*"]}]) (List (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "versioned_dir = "][VarSub versioned_dir]]}) (If (AndOr OP_OR_IF (DBracket {B2 BINARY_STRING_EQUAL {[DQ [VarSub versioned_dir]]} {[DQ [VarSub new_versioned_dir]]}}) (DBracket {B2 BINARY_STRING_EQUAL {[DQ [VarSub versioned_dir]]} {[DQ [VarSub old_versioned_dir]]}}) ) (List (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "versioned_dir is new_versioned_dir or old_versioned_dir, skipping"]]}) (Com {[LIT_CHARS continue]}) ) ) (= scope= flags=0 words=[] bindings=[('ps_string', {[DQ [VarSub versioned_dir][LIT_CHARS /]]})]) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "ps_string = "][VarSub ps_string]]}) (= scope= flags=0 words=[] bindings=[('lsof_file', {[DQ [VarSub versioned_dir][LIT_CHARS /][VarSub FRAMEWORK_DIR][LIT_CHARS /][VarSub FRAMEWORK_NAME]]})]) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "lsof_file = "][VarSub lsof_file]]}) (If (AndOr OP_AND_IF (Subshell (Pipeline! (Com {[LIT_CHARS ps]} {[LIT_CHARS -ewwo]} {[LIT_VAR_LIKE "comm="] =}) (Com {[LIT_CHARS cut]} {[LIT_CHARS -c]} {[DQ [LIT_CHARS 1-][VarSub ps_string transform_ops=[(#len)]]]}) (Com {[LIT_CHARS grep]} {[LIT_CHARS -Fqx]} {[DQ [VarSub ps_string]]}) ) ) (Subshell (Pipeline! (Com {[LIT_CHARS lsof]} {[DQ [VarSub lsof_file]]} < (DescriptorRedirectNode target={[LIT_CHARS /dev/null]} &"> 1), > ) ) ) ) (List (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "versioned_dir doesn't appear to be in use, removing"]]}) (Com {[LIT_CHARS rm]} {[LIT_CHARS -rf]} {[DQ [VarSub versioned_dir]]}) ) (ElseTrue) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "versioned_dir is in use, skipping"]]}) ) ) ) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "setting permissions"]]}) (= scope= flags=0 words=[] bindings=[('chmod_mode', {[DQ [LIT_CHARS "a+rX,u+w,go-w"]]})]) (If (DBracket {B1 UNARY_STRING_z {[DQ [VarSub system_ticket]]}}) (If (AndOr OP_AND_IF (DBracket {B2 BINARY_STRING_EQUAL {[DQ [VarSub installed_app transform_ops=[Slice {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 0]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 14]}}]]]} {[DQ [LIT_CHARS /Applications/]]}}) (Com {[LIT_CHARS chgrp]} {[LIT_CHARS -Rh]} {[LIT_CHARS admin]} {[DQ [VarSub installed_app]]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 2), > ) ) (= scope= flags=0 words=[] bindings=[('chmod_mode', {[DQ [LIT_CHARS "a+rX,ug+w,o-w"]]})]) ) (ElseTrue) (Com {[LIT_CHARS chown]} {[LIT_CHARS -Rh]} {[LIT_CHARS root] [LIT_OTHER ":"] [LIT_CHARS wheel]} {[DQ [VarSub installed_app]]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 2), > ) ) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "chmod_mode = "][VarSub chmod_mode]]}) (Com {[LIT_CHARS chmod]} {[LIT_CHARS -R]} {[DQ [VarSub chmod_mode]]} {[DQ [VarSub installed_app]]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 2), > ) (Com {[LIT_CHARS find]} {[DQ [VarSub installed_app]]} {[LIT_CHARS -type]} {[LIT_CHARS l]} {[LIT_CHARS -exec]} {[LIT_CHARS chmod]} {[LIT_CHARS -h]} {[DQ [VarSub chmod_mode]]} {[LIT_LBRACE "{"] [LIT_RBRACE "}"]} {[LIT_OTHER "+"]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 2), > ) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "lifting quarantine"]]}) (If (Com {[LIT_CHARS os_xattr_supports_r]}) (Com {[LIT_CHARS xattr]} {[LIT_CHARS -d]} {[LIT_CHARS -r]} {[DQ [VarSub QUARANTINE_ATTR]]} {[DQ [VarSub installed_app]]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 2), > ) (ElseTrue) (Com {[LIT_CHARS find]} {[DQ [VarSub installed_app]]} {[LIT_CHARS -exec]} {[LIT_CHARS xattr]} {[LIT_CHARS -d]} {[DQ [VarSub QUARANTINE_ATTR]]} {[LIT_LBRACE "{"] [LIT_RBRACE "}"]} {[LIT_OTHER "+"]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 2), > ) ) (Com {[LIT_CHARS note]} {[DQ [LIT_CHARS "done!"]]}) (Com {[LIT_CHARS trap]} {[LIT_CHARS -]} {[LIT_CHARS EXIT]}) (Com {[LIT_CHARS return]} {[LIT_CHARS 0]}) ) ) (If (DBracket {B2 BINARY_INT_LT {[VarSub #]} {[LIT_CHARS 1]}}) (List (Com {[LIT_CHARS usage]}) (Com {[LIT_CHARS exit]} {[LIT_CHARS 2]}) ) ) (Com {[LIT_CHARS main]} {[DQ [VarSub @]]}) (Com {[LIT_CHARS exit]} {[VarSub ?]}) )