From 30dbb7820d620cec0c4d4d80e3f5d73948280d71 Mon Sep 17 00:00:00 2001 From: Aras Pranckevicius Date: Wed, 11 Sep 2024 17:56:22 +0200 Subject: [PATCH] Cleanup: VSE effects never have 3 inputs, remove seq3 handling "seq3" input for VSE effect strips has been there ever since "initial revision" commit in 2002, with comment "pointers voor effecten" even. But it has never been used, so remove all code that pretends to do something with it. Pull Request: https://projects.blender.org/blender/blender/pulls/127401 --- .../editors/space_sequencer/sequencer_add.cc | 10 +-- .../editors/space_sequencer/sequencer_edit.cc | 82 +++---------------- .../space_sequencer/sequencer_intern.hh | 1 - .../space_sequencer/sequencer_select.cc | 3 - source/blender/makesdna/DNA_sequence_types.h | 7 +- .../blender/makesrna/intern/rna_sequencer.cc | 10 --- .../makesrna/intern/rna_sequencer_api.cc | 23 ++---- source/blender/sequencer/SEQ_add.hh | 1 - source/blender/sequencer/intern/iterator.cc | 7 +- source/blender/sequencer/intern/sequencer.cc | 9 -- source/blender/sequencer/intern/strip_add.cc | 1 - source/blender/sequencer/intern/strip_edit.cc | 7 -- .../sequencer/intern/strip_relations.cc | 3 +- .../sequencer/intern/strip_transform.cc | 7 +- 14 files changed, 27 insertions(+), 144 deletions(-) diff --git a/source/blender/editors/space_sequencer/sequencer_add.cc b/source/blender/editors/space_sequencer/sequencer_add.cc index 477ca1d0b8d..cfd580de73f 100644 --- a/source/blender/editors/space_sequencer/sequencer_add.cc +++ b/source/blender/editors/space_sequencer/sequencer_add.cc @@ -1436,10 +1436,8 @@ static int sequencer_add_effect_strip_exec(bContext *C, wmOperator *op) load_data_init_from_operator(&load_data, C, op); load_data.effect.type = RNA_enum_get(op->ptr, "type"); - Sequence *seq1, *seq2, *seq3; - if (!seq_effect_find_selected( - scene, nullptr, load_data.effect.type, &seq1, &seq2, &seq3, &error_msg)) - { + Sequence *seq1, *seq2; + if (!seq_effect_find_selected(scene, nullptr, load_data.effect.type, &seq1, &seq2, &error_msg)) { BKE_report(op->reports, RPT_ERROR, error_msg); return OPERATOR_CANCELLED; } @@ -1450,13 +1448,11 @@ static int sequencer_add_effect_strip_exec(bContext *C, wmOperator *op) load_data.effect.seq1 = seq1; load_data.effect.seq2 = seq2; - load_data.effect.seq3 = seq3; /* Set channel. If unset, use lowest free one above strips. */ if (!RNA_struct_property_is_set(op->ptr, "channel")) { if (seq1 != nullptr) { - int chan = max_iii( - seq1 ? seq1->machine : 0, seq2 ? seq2->machine : 0, seq3 ? seq3->machine : 0); + int chan = max_ii(seq1 ? seq1->machine : 0, seq2 ? seq2->machine : 0); if (chan < MAXSEQ) { load_data.channel = chan; } diff --git a/source/blender/editors/space_sequencer/sequencer_edit.cc b/source/blender/editors/space_sequencer/sequencer_edit.cc index b506a138216..dd8c3e85b09 100644 --- a/source/blender/editors/space_sequencer/sequencer_edit.cc +++ b/source/blender/editors/space_sequencer/sequencer_edit.cc @@ -406,12 +406,6 @@ static int sequencer_snap_exec(bContext *C, wmOperator *op) scene, seq, (snap_frame - SEQ_time_left_handle_frame_get(scene, seq))); } } - else if (seq->seq3 && (seq->seq3->flag & SELECT)) { - if (!either_handle_selected) { - SEQ_offset_animdata( - scene, seq, (snap_frame - SEQ_time_left_handle_frame_get(scene, seq))); - } - } } } @@ -1206,11 +1200,10 @@ int seq_effect_find_selected(Scene *scene, int type, Sequence **r_selseq1, Sequence **r_selseq2, - Sequence **r_selseq3, const char **r_error_str) { Editing *ed = SEQ_editing_get(scene); - Sequence *seq1 = nullptr, *seq2 = nullptr, *seq3 = nullptr; + Sequence *seq1 = nullptr, *seq2 = nullptr; *r_error_str = nullptr; @@ -1219,7 +1212,7 @@ int seq_effect_find_selected(Scene *scene, } if (SEQ_effect_get_num_inputs(type) == 0) { - *r_selseq1 = *r_selseq2 = *r_selseq3 = nullptr; + *r_selseq1 = *r_selseq2 = nullptr; return 1; } @@ -1236,25 +1229,14 @@ int seq_effect_find_selected(Scene *scene, else if (seq1 == nullptr) { seq1 = seq; } - else if (seq3 == nullptr) { - seq3 = seq; - } else { - *r_error_str = N_("Cannot apply effect to more than 3 sequence strips"); + *r_error_str = N_("Cannot apply effect to more than 2 sequence strips"); return 0; } } } } - /* Make sequence selection a little bit more intuitive - * for 3 strips: the last-strip should be seq3. */ - if (seq3 != nullptr && seq2 != nullptr) { - Sequence *tmp = seq2; - seq2 = seq3; - seq3 = tmp; - } - switch (SEQ_effect_get_num_inputs(type)) { case 1: if (seq2 == nullptr) { @@ -1264,34 +1246,24 @@ int seq_effect_find_selected(Scene *scene, if (seq1 == nullptr) { seq1 = seq2; } - if (seq3 == nullptr) { - seq3 = seq2; - } ATTR_FALLTHROUGH; case 2: if (seq1 == nullptr || seq2 == nullptr) { *r_error_str = N_("2 selected sequence strips are needed"); return 0; } - if (seq3 == nullptr) { - seq3 = seq2; - } break; } - if (seq1 == nullptr && seq2 == nullptr && seq3 == nullptr) { + if (seq1 == nullptr && seq2 == nullptr) { *r_error_str = N_("TODO: in what cases does this happen?"); return 0; } *r_selseq1 = seq1; *r_selseq2 = seq2; - *r_selseq3 = seq3; /* TODO(Richard): This function needs some refactoring, this is just quick hack for #73828. */ - if (SEQ_effect_get_num_inputs(type) < 3) { - *r_selseq3 = nullptr; - } if (SEQ_effect_get_num_inputs(type) < 2) { *r_selseq2 = nullptr; } @@ -1302,7 +1274,7 @@ int seq_effect_find_selected(Scene *scene, static int sequencer_reassign_inputs_exec(bContext *C, wmOperator *op) { Scene *scene = CTX_data_scene(C); - Sequence *seq1, *seq2, *seq3, *last_seq = SEQ_select_active_get(scene); + Sequence *seq1, *seq2, *last_seq = SEQ_select_active_get(scene); const char *error_msg; if (SEQ_effect_get_num_inputs(last_seq->type) == 0) { @@ -1310,8 +1282,7 @@ static int sequencer_reassign_inputs_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } - if (!seq_effect_find_selected( - scene, last_seq, last_seq->type, &seq1, &seq2, &seq3, &error_msg) || + if (!seq_effect_find_selected(scene, last_seq, last_seq->type, &seq1, &seq2, &error_msg) || SEQ_effect_get_num_inputs(last_seq->type) == 0) { BKE_report(op->reports, RPT_ERROR, error_msg); @@ -1319,8 +1290,7 @@ static int sequencer_reassign_inputs_exec(bContext *C, wmOperator *op) } /* Check if reassigning would create recursivity. */ if (SEQ_relations_render_loop_check(seq1, last_seq) || - SEQ_relations_render_loop_check(seq2, last_seq) || - SEQ_relations_render_loop_check(seq3, last_seq)) + SEQ_relations_render_loop_check(seq2, last_seq)) { BKE_report(op->reports, RPT_ERROR, "Cannot reassign inputs: recursion detected"); return OPERATOR_CANCELLED; @@ -1328,7 +1298,6 @@ static int sequencer_reassign_inputs_exec(bContext *C, wmOperator *op) last_seq->seq1 = seq1; last_seq->seq2 = seq2; - last_seq->seq3 = seq3; int old_start = last_seq->start; @@ -1407,7 +1376,7 @@ void SEQUENCER_OT_swap_inputs(wmOperatorType *ot) /* Identifiers. */ ot->name = "Swap Inputs"; ot->idname = "SEQUENCER_OT_swap_inputs"; - ot->description = "Swap the first two inputs for the effect strip"; + ot->description = "Swap the two inputs of the effect strip"; /* Api callbacks. */ ot->exec = sequencer_swap_inputs_exec; @@ -2363,7 +2332,7 @@ static Sequence *find_next_prev_sequence(Scene *scene, Sequence *test, int lr, i static bool seq_is_parent(const Sequence *par, const Sequence *seq) { - return ((par->seq1 == seq) || (par->seq2 == seq) || (par->seq3 == seq)); + return ((par->seq1 == seq) || (par->seq2 == seq)); } static int sequencer_swap_exec(bContext *C, wmOperator *op) @@ -2384,13 +2353,11 @@ static int sequencer_swap_exec(bContext *C, wmOperator *op) if (seq) { /* Disallow effect strips. */ - if (SEQ_effect_get_num_inputs(seq->type) >= 1 && - (seq->effectdata || seq->seq1 || seq->seq2 || seq->seq3)) - { + if (SEQ_effect_get_num_inputs(seq->type) >= 1 && (seq->effectdata || seq->seq1 || seq->seq2)) { return OPERATOR_CANCELLED; } if ((SEQ_effect_get_num_inputs(active_seq->type) >= 1) && - (active_seq->effectdata || active_seq->seq1 || active_seq->seq2 || active_seq->seq3)) + (active_seq->effectdata || active_seq->seq1 || active_seq->seq2)) { return OPERATOR_CANCELLED; } @@ -2650,34 +2617,12 @@ void SEQUENCER_OT_swap_data(wmOperatorType *ot) /** \name Change Effect Input Operator * \{ */ -static const EnumPropertyItem prop_change_effect_input_types[] = { - {0, "A_B", 0, "A " BLI_STR_UTF8_RIGHTWARDS_ARROW " B", ""}, - {1, "B_C", 0, "B " BLI_STR_UTF8_RIGHTWARDS_ARROW " C", ""}, - {2, "A_C", 0, "A " BLI_STR_UTF8_RIGHTWARDS_ARROW " C", ""}, - {0, nullptr, 0, nullptr, nullptr}, -}; - static int sequencer_change_effect_input_exec(bContext *C, wmOperator *op) { Scene *scene = CTX_data_scene(C); Sequence *seq = SEQ_select_active_get(scene); - Sequence **seq_1, **seq_2; - - switch (RNA_enum_get(op->ptr, "swap")) { - case 0: - seq_1 = &seq->seq1; - seq_2 = &seq->seq2; - break; - case 1: - seq_1 = &seq->seq2; - seq_2 = &seq->seq3; - break; - default: /* 2 */ - seq_1 = &seq->seq1; - seq_2 = &seq->seq3; - break; - } + Sequence **seq_1 = &seq->seq1, **seq_2 = &seq->seq2; if (*seq_1 == nullptr || *seq_2 == nullptr) { BKE_report(op->reports, RPT_ERROR, "One of the effect inputs is unset, cannot swap"); @@ -2704,9 +2649,6 @@ void SEQUENCER_OT_change_effect_input(wmOperatorType *ot) /* Flags. */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - - ot->prop = RNA_def_enum( - ot->srna, "swap", prop_change_effect_input_types, 0, "Swap", "The effect inputs to swap"); } /** \} */ diff --git a/source/blender/editors/space_sequencer/sequencer_intern.hh b/source/blender/editors/space_sequencer/sequencer_intern.hh index 24e74b34229..8d86c846b83 100644 --- a/source/blender/editors/space_sequencer/sequencer_intern.hh +++ b/source/blender/editors/space_sequencer/sequencer_intern.hh @@ -177,7 +177,6 @@ int seq_effect_find_selected(Scene *scene, int type, Sequence **r_selseq1, Sequence **r_selseq2, - Sequence **r_selseq3, const char **r_error_str); /* Operator helpers. */ diff --git a/source/blender/editors/space_sequencer/sequencer_select.cc b/source/blender/editors/space_sequencer/sequencer_select.cc index a7498395c97..aa022776090 100644 --- a/source/blender/editors/space_sequencer/sequencer_select.cc +++ b/source/blender/editors/space_sequencer/sequencer_select.cc @@ -2422,9 +2422,6 @@ static bool select_grouped_effect(blender::Span strips, if (seq->seq2) { seq->seq2->flag |= SELECT; } - if (seq->seq3) { - seq->seq3->flag |= SELECT; - } changed = true; } } diff --git a/source/blender/makesdna/DNA_sequence_types.h b/source/blender/makesdna/DNA_sequence_types.h index defeb673c17..90852893136 100644 --- a/source/blender/makesdna/DNA_sequence_types.h +++ b/source/blender/makesdna/DNA_sequence_types.h @@ -194,16 +194,14 @@ typedef struct Sequence { float startstill, endstill; /** Machine: the strip channel */ int machine; - int _pad; /** Starting and ending points of the effect strip. Undefined for other strip types. */ int startdisp, enddisp; float sat; float mul; - float _pad1; - short anim_preseek; /* UNUSED. */ /** Stream-index for movie or sound files with several streams. */ short streamindex; + short _pad; /** For multi-camera source selection. */ int multicam_source; /** MOVIECLIP render flags. */ @@ -231,7 +229,7 @@ typedef struct Sequence { float speed_fader; /* pointers for effects: */ - struct Sequence *seq1, *seq2, *seq3; + struct Sequence *seq1, *seq2; /** List of strips for meta-strips. */ ListBase seqbase; @@ -291,7 +289,6 @@ typedef struct Sequence { float speed_factor; struct SeqRetimingKey *retiming_keys; - void *_pad5; int retiming_keys_num; char _pad6[4]; diff --git a/source/blender/makesrna/intern/rna_sequencer.cc b/source/blender/makesrna/intern/rna_sequencer.cc index 700d1a736ae..efb47ac1d29 100644 --- a/source/blender/makesrna/intern/rna_sequencer.cc +++ b/source/blender/makesrna/intern/rna_sequencer.cc @@ -2696,16 +2696,6 @@ static void rna_def_effect_inputs(StructRNA *srna, int count) RNA_def_property_pointer_funcs(prop, nullptr, "rna_Sequence_input_2_set", nullptr, nullptr); RNA_def_property_ui_text(prop, "Input 2", "Second input for the effect strip"); } - -# if 0 - if (count == 3) { - /* Not used by any effects (perhaps one day plugins?). */ - prop = RNA_def_property(srna, "input_3", PROP_POINTER, PROP_NONE); - RNA_def_property_pointer_sdna(prop, nullptr, "seq3"); - RNA_def_property_flag(prop, PROP_EDITABLE | PROP_NEVER_NULL); - RNA_def_property_ui_text(prop, "Input 3", "Third input for the effect strip"); - } -# endif } static void rna_def_color_management(StructRNA *srna) diff --git a/source/blender/makesrna/intern/rna_sequencer_api.cc b/source/blender/makesrna/intern/rna_sequencer_api.cc index 014f7270c56..6522a1a6ca8 100644 --- a/source/blender/makesrna/intern/rna_sequencer_api.cc +++ b/source/blender/makesrna/intern/rna_sequencer_api.cc @@ -450,8 +450,7 @@ static Sequence *rna_Sequences_new_effect(ID *id, int frame_start, int frame_end, Sequence *seq1, - Sequence *seq2, - Sequence *seq3) + Sequence *seq2) { Scene *scene = (Scene *)id; Sequence *seq; @@ -476,17 +475,11 @@ static Sequence *rna_Sequences_new_effect(ID *id, return nullptr; } break; - case 3: - if (seq1 == nullptr || seq2 == nullptr || seq3 == nullptr) { - BKE_report(reports, RPT_ERROR, "Sequences.new_effect: effect takes 3 input sequences"); - return nullptr; - } - break; default: BKE_reportf( reports, RPT_ERROR, - "Sequences.new_effect: effect expects more than 3 inputs (%d, should never happen!)", + "Sequences.new_effect: effect expects more than 2 inputs (%d, should never happen!)", num_inputs); return nullptr; } @@ -497,7 +490,6 @@ static Sequence *rna_Sequences_new_effect(ID *id, load_data.effect.type = type; load_data.effect.seq1 = seq1; load_data.effect.seq2 = seq2; - load_data.effect.seq3 = seq3; seq = SEQ_add_effect_strip(scene, seqbase, &load_data); DEG_id_tag_update(&scene->id, ID_RECALC_SEQUENCER_STRIPS); @@ -515,11 +507,10 @@ static Sequence *rna_Sequences_editing_new_effect(ID *id, int frame_start, int frame_end, Sequence *seq1, - Sequence *seq2, - Sequence *seq3) + Sequence *seq2) { return rna_Sequences_new_effect( - id, &ed->seqbase, reports, name, type, channel, frame_start, frame_end, seq1, seq2, seq3); + id, &ed->seqbase, reports, name, type, channel, frame_start, frame_end, seq1, seq2); } static Sequence *rna_Sequences_meta_new_effect(ID *id, @@ -531,11 +522,10 @@ static Sequence *rna_Sequences_meta_new_effect(ID *id, int frame_start, int frame_end, Sequence *seq1, - Sequence *seq2, - Sequence *seq3) + Sequence *seq2) { return rna_Sequences_new_effect( - id, &seq->seqbase, reports, name, type, channel, frame_start, frame_end, seq1, seq2, seq3); + id, &seq->seqbase, reports, name, type, channel, frame_start, frame_end, seq1, seq2); } static void rna_Sequences_remove( @@ -1075,7 +1065,6 @@ void RNA_api_sequences(BlenderRNA *brna, PropertyRNA *cprop, const bool metastri INT_MAX); RNA_def_pointer(func, "seq1", "Sequence", "", "Sequence 1 for effect"); RNA_def_pointer(func, "seq2", "Sequence", "", "Sequence 2 for effect"); - RNA_def_pointer(func, "seq3", "Sequence", "", "Sequence 3 for effect"); /* return type */ parm = RNA_def_pointer(func, "sequence", "Sequence", "", "New Sequence"); RNA_def_function_return(func, parm); diff --git a/source/blender/sequencer/SEQ_add.hh b/source/blender/sequencer/SEQ_add.hh index 8bd6b6859e7..b0baaee8921 100644 --- a/source/blender/sequencer/SEQ_add.hh +++ b/source/blender/sequencer/SEQ_add.hh @@ -48,7 +48,6 @@ struct SeqLoadData { int end_frame; Sequence *seq1; Sequence *seq2; - Sequence *seq3; } effect; /* Only for effect strips. */ eSeqLoadFlags flags; eSeqImageFitMethod fit_method; diff --git a/source/blender/sequencer/intern/iterator.cc b/source/blender/sequencer/intern/iterator.cc index 0eb0a150cfa..14a78662f99 100644 --- a/source/blender/sequencer/intern/iterator.cc +++ b/source/blender/sequencer/intern/iterator.cc @@ -243,16 +243,11 @@ void SEQ_query_strip_effect_chain(const Scene *scene, if (reference_strip->seq2) { SEQ_query_strip_effect_chain(scene, reference_strip->seq2, seqbase, strips); } - if (reference_strip->seq3) { - SEQ_query_strip_effect_chain(scene, reference_strip->seq3, seqbase, strips); - } } /* Find all strips connected to reference_strip. */ LISTBASE_FOREACH (Sequence *, seq_test, seqbase) { - if (seq_test->seq1 == reference_strip || seq_test->seq2 == reference_strip || - seq_test->seq3 == reference_strip) - { + if (seq_test->seq1 == reference_strip || seq_test->seq2 == reference_strip) { SEQ_query_strip_effect_chain(scene, seq_test, seqbase, strips); } } diff --git a/source/blender/sequencer/intern/sequencer.cc b/source/blender/sequencer/intern/sequencer.cc index 587fcbab329..b72e692e816 100644 --- a/source/blender/sequencer/intern/sequencer.cc +++ b/source/blender/sequencer/intern/sequencer.cc @@ -316,9 +316,6 @@ static void seq_new_fix_links_recursive(Sequence *seq) if (seq->seq2 && seq->seq2->tmp) { seq->seq2 = static_cast(seq->seq2->tmp); } - if (seq->seq3 && seq->seq3->tmp) { - seq->seq3 = static_cast(seq->seq3->tmp); - } } else if (seq->type == SEQ_TYPE_META) { LISTBASE_FOREACH (Sequence *, seqn, &seq->seqbase) { @@ -829,12 +826,6 @@ static bool seq_read_data_cb(Sequence *seq, void *user_data) BLO_read_struct(reader, Sequence, &seq->seq1); BLO_read_struct(reader, Sequence, &seq->seq2); - BLO_read_struct(reader, Sequence, &seq->seq3); - - /* a patch: after introduction of effects with 3 input strips */ - if (seq->seq3 == nullptr) { - seq->seq3 = seq->seq2; - } if (seq->effectdata) { switch (seq->type) { diff --git a/source/blender/sequencer/intern/strip_add.cc b/source/blender/sequencer/intern/strip_add.cc index 8890c89db6b..186ffe486c0 100644 --- a/source/blender/sequencer/intern/strip_add.cc +++ b/source/blender/sequencer/intern/strip_add.cc @@ -167,7 +167,6 @@ Sequence *SEQ_add_effect_strip(Scene *scene, ListBase *seqbase, SeqLoadData *loa sh.init(seq); seq->seq1 = load_data->effect.seq1; seq->seq2 = load_data->effect.seq2; - seq->seq3 = load_data->effect.seq3; if (SEQ_effect_get_num_inputs(seq->type) == 1) { seq->blend_mode = seq->seq1->blend_mode; diff --git a/source/blender/sequencer/intern/strip_edit.cc b/source/blender/sequencer/intern/strip_edit.cc index 14bccb8165c..6779b4262f9 100644 --- a/source/blender/sequencer/intern/strip_edit.cc +++ b/source/blender/sequencer/intern/strip_edit.cc @@ -367,13 +367,6 @@ static bool seq_edit_split_effect_inputs_intersect(const Scene *scene, scene, seq->seq2, timeline_frame); } } - if (seq->seq3) { - input_does_intersect |= seq_edit_split_intersect_check(scene, seq->seq3, timeline_frame); - if ((seq->seq1->type & SEQ_TYPE_EFFECT) != 0) { - input_does_intersect |= seq_edit_split_effect_inputs_intersect( - scene, seq->seq3, timeline_frame); - } - } return input_does_intersect; } diff --git a/source/blender/sequencer/intern/strip_relations.cc b/source/blender/sequencer/intern/strip_relations.cc index 59f030bfb9a..57cc5cbf09c 100644 --- a/source/blender/sequencer/intern/strip_relations.cc +++ b/source/blender/sequencer/intern/strip_relations.cc @@ -379,8 +379,7 @@ bool SEQ_relations_render_loop_check(Sequence *seq_main, Sequence *seq) } if ((seq_main->seq1 && SEQ_relations_render_loop_check(seq_main->seq1, seq)) || - (seq_main->seq2 && SEQ_relations_render_loop_check(seq_main->seq2, seq)) || - (seq_main->seq3 && SEQ_relations_render_loop_check(seq_main->seq3, seq))) + (seq_main->seq2 && SEQ_relations_render_loop_check(seq_main->seq2, seq))) { return true; } diff --git a/source/blender/sequencer/intern/strip_transform.cc b/source/blender/sequencer/intern/strip_transform.cc index 53f6a4accbd..6d8cf102c30 100644 --- a/source/blender/sequencer/intern/strip_transform.cc +++ b/source/blender/sequencer/intern/strip_transform.cc @@ -59,16 +59,13 @@ bool SEQ_transform_seqbase_isolated_sel_check(ListBase *seqbase) if (seq->flag & SELECT) { if ((seq->seq1 && (seq->seq1->flag & SELECT) == 0) || - (seq->seq2 && (seq->seq2->flag & SELECT) == 0) || - (seq->seq3 && (seq->seq3->flag & SELECT) == 0)) + (seq->seq2 && (seq->seq2->flag & SELECT) == 0)) { return false; } } else { - if ((seq->seq1 && (seq->seq1->flag & SELECT)) || (seq->seq2 && (seq->seq2->flag & SELECT)) || - (seq->seq3 && (seq->seq3->flag & SELECT))) - { + if ((seq->seq1 && (seq->seq1->flag & SELECT)) || (seq->seq2 && (seq->seq2->flag & SELECT))) { return false; } }