def __init__(self): self["rc"] = MultiPixmap() self["arrowdown"] = MovingPixmap() self["arrowdown2"] = MovingPixmap() self["arrowup"] = MovingPixmap() self["arrowup2"] = MovingPixmap() config.misc.rcused = ConfigInteger(default = 1) self.rcheight = 500 self.rcheighthalf = 250 self.selectpics = [] # self.selectpics.append((self.rcheighthalf, ["arrowdown", "arrowdown2"], (-18,-70))) # self.selectpics.append((self.rcheight, ["arrowup", "arrowup2"], (-18,0))) # [iq from enigma import eSystemInfo if eSystemInfo.getInstance().getModel().startswith('TM-TWIN') or eSystemInfo.getInstance().getModel().startswith('TM-2T'): self.selectpics.append((self.rcheighthalf, ["arrowdown", "arrowdown2"], (-23,-98))) self.selectpics.append((self.rcheight, ["arrowup", "arrowup2"], (-23,0))) elif eSystemInfo.getInstance().getModel() == 'IOS-100HD': self.selectpics.append((self.rcheighthalf, ["arrowdown", "arrowdown2"], (-18,-160))) self.selectpics.append((self.rcheight, ["arrowup", "arrowup2"], (-18,-95))) else: self.selectpics.append((self.rcheighthalf, ["arrowdown", "arrowdown2"], (-18,-70))) self.selectpics.append((self.rcheight, ["arrowup", "arrowup2"], (-18,-0))) # iq] self.readPositions() self.clearSelectedKeys() self.onShown.append(self.initRc)
def InitUsageConfig(): boxtype = "tmtwin" if eSystemInfo.getInstance().getModel().startswith("TM-SINGLE"): boxtype = "tmsingle" elif eSystemInfo.getInstance().getModel().startswith("TM-2T"): boxtype = "tm2t" elif eSystemInfo.getInstance().getModel().startswith("IOS-100HD"): boxtype = "ios100" config.misc.boxtype = ConfigText(default = boxtype) config.usage = ConfigSubsection(); config.usage.showdish = ConfigYesNo(default = True) config.usage.multibouquet = ConfigYesNo(default = True) config.usage.multiepg_ask_bouquet = ConfigYesNo(default = False) config.usage.quickzap_bouquet_change = ConfigYesNo(default = False) config.usage.e1like_radio_mode = ConfigYesNo(default = True) choicelist = [] for i in range(1, 12): choicelist.append(("%d" % i, ngettext("%d second", "%d seconds", i) % i)) config.usage.infobar_timeout = ConfigSelection(default = "5", choices = [("0", _("no timeout"))] + choicelist) config.usage.show_infobar_on_zap = ConfigYesNo(default = True) config.usage.show_infobar_on_skip = ConfigYesNo(default = True) config.usage.show_infobar_on_event_change = ConfigYesNo(default = False) config.usage.show_second_infobar = ConfigSelection(default = None, choices = [(None, _("None")), ("0", _("no timeout"))] + choicelist) config.usage.show_spinner = ConfigYesNo(default = True) config.usage.enable_tt_caching = ConfigYesNo(default = True) choicelist = [] for i in (10, 30): choicelist.append(("%d" % i, ngettext("%d second", "%d seconds", i) % i)) for i in (60, 120, 300, 600, 1200, 1800): m = i / 60 choicelist.append(("%d" % i, ngettext("%d minute", "%d minutes", m) % m)) for i in (3600, 7200, 14400): h = i / 3600 choicelist.append(("%d" % i, ngettext("%d hour", "%d hours", h) % h)) config.usage.hdd_standby = ConfigSelection(default = "300", choices = [("0", _("no standby"))] + choicelist) config.usage.output_12V = ConfigSelection(default = "do not change", choices = [ ("do not change", _("do not change")), ("off", _("off")), ("on", _("on")) ]) config.usage.pip_zero_button = ConfigSelection(default = "standard", choices = [ ("standard", _("standard")), ("swap", _("swap PiP and main picture")), ("swapstop", _("move PiP to main picture")), ("stop", _("stop PiP")) ]) config.usage.default_path = ConfigText(default = resolveFilename(SCOPE_HDD)) config.usage.timer_path = ConfigText(default = "<default>") config.usage.instantrec_path = ConfigText(default = "<default>") config.usage.timeshift_path = ConfigText(default = "/media/hdd/") config.usage.allowed_timeshift_paths = ConfigLocations(default = ["/media/hdd/"]) config.usage.movielist_trashcan = ConfigYesNo(default=True) config.usage.movielist_trashcan_days = ConfigNumber(default=8) config.usage.movielist_trashcan_reserve = ConfigNumber(default=40) config.usage.on_movie_start = ConfigSelection(default = "resume", choices = [ ("ask", _("Ask user")), ("resume", _("Resume from last position")), ("beginning", _("Start from the beginning")) ]) config.usage.on_movie_stop = ConfigSelection(default = "movielist", choices = [ ("ask", _("Ask user")), ("movielist", _("Return to movie list")), ("quit", _("Return to previous service")) ]) config.usage.on_movie_eof = ConfigSelection(default = "movielist", choices = [ ("ask", _("Ask user")), ("movielist", _("Return to movie list")), ("quit", _("Return to previous service")), ("pause", _("Pause movie at end")) ]) config.usage.setup_level = ConfigSelection(default = "expert", choices = [ ("simple", _("Simple")), ("intermediate", _("Intermediate")), ("expert", _("Expert")) ]) config.usage.on_long_powerpress = ConfigSelection(default = "show_menu", choices = [ ("show_menu", _("show shutdown menu")), ("shutdown", _("immediate shutdown")), ("standby", _("Standby")) ] ) config.usage.on_short_powerpress = ConfigSelection(default = "standby", choices = [ ("show_menu", _("show shutdown menu")), ("shutdown", _("immediate shutdown")), ("standby", _("Standby")) ] ) config.usage.alternatives_priority = ConfigSelection(default = "0", choices = [ ("0", "DVB-S/-C/-T"), ("1", "DVB-S/-T/-C"), ("2", "DVB-C/-S/-T"), ("3", "DVB-C/-T/-S"), ("4", "DVB-T/-C/-S"), ("5", "DVB-T/-S/-C") ]) nims = [("-1", _("auto"))] for x in nimmanager.nim_slots: nims.append((str(x.slot), x.getSlotName())) config.usage.frontend_priority = ConfigSelection(default = "-1", choices = nims) config.misc.disable_background_scan = ConfigYesNo(default = False) config.usage.show_event_progress_in_servicelist = ConfigYesNo(default = True) config.usage.show_channel_numbers_in_servicelist = ConfigYesNo(default = True) config.usage.blinking_display_clock_during_recording = ConfigYesNo(default = False) config.usage.show_message_when_recording_starts = ConfigYesNo(default = True) config.usage.load_length_of_movies_in_moviellist = ConfigYesNo(default = True) config.usage.show_icons_in_movielist = ConfigSelection(default = 'i', choices = [ ('o', _("Off")), ('p', _("Progress")), ('s', _("Progress Small")), ('i', _("Icons")), ]) config.usage.movielist_unseen = ConfigYesNo(default = False) config.usage.swap_snr_on_osd = ConfigYesNo(default = False) def SpinnerOnOffChanged(configElement): setSpinnerOnOff(int(configElement.value)) config.usage.show_spinner.addNotifier(SpinnerOnOffChanged) def EnableTtCachingChanged(configElement): setEnableTtCachingOnOff(int(configElement.value)) config.usage.enable_tt_caching.addNotifier(EnableTtCachingChanged) def TunerTypePriorityOrderChanged(configElement): setTunerTypePriorityOrder(int(configElement.value)) config.usage.alternatives_priority.addNotifier(TunerTypePriorityOrderChanged, immediate_feedback=False) def PreferredTunerChanged(configElement): setPreferredTuner(int(configElement.value)) config.usage.frontend_priority.addNotifier(PreferredTunerChanged) config.usage.hide_zap_errors = ConfigYesNo(default = False) config.usage.hide_ci_messages = ConfigYesNo(default = False) config.usage.show_cryptoinfo = ConfigYesNo(default = True) config.usage.show_eit_nownext = ConfigYesNo(default = True) config.epg = ConfigSubsection() config.epg.eit = ConfigYesNo(default = True) config.epg.mhw = ConfigYesNo(default = False) config.epg.freesat = ConfigYesNo(default = True) config.epg.viasat = ConfigYesNo(default = True) config.epg.netmed = ConfigYesNo(default = True) config.misc.showradiopic = ConfigYesNo(default = True) def EpgSettingsChanged(configElement): from enigma import eEPGCache mask = 0xffffffff if not config.epg.eit.value: mask &= ~(eEPGCache.NOWNEXT | eEPGCache.SCHEDULE | eEPGCache.SCHEDULE_OTHER) if not config.epg.mhw.value: mask &= ~eEPGCache.MHW if not config.epg.freesat.value: mask &= ~(eEPGCache.FREESAT_NOWNEXT | eEPGCache.FREESAT_SCHEDULE | eEPGCache.FREESAT_SCHEDULE_OTHER) if not config.epg.viasat.value: mask &= ~eEPGCache.VIASAT if not config.epg.netmed.value: mask &= ~(eEPGCache.NETMED_SCHEDULE | eEPGCache.NETMED_SCHEDULE_OTHER) eEPGCache.getInstance().setEpgSources(mask) config.epg.eit.addNotifier(EpgSettingsChanged) config.epg.mhw.addNotifier(EpgSettingsChanged) config.epg.freesat.addNotifier(EpgSettingsChanged) config.epg.viasat.addNotifier(EpgSettingsChanged) config.epg.netmed.addNotifier(EpgSettingsChanged) config.epg.histminutes = ConfigSelectionNumber(min = 0, max = 120, stepwidth = 15, default = 0, wraparound = True) def EpgHistorySecondsChanged(configElement): from enigma import eEPGCache eEPGCache.getInstance().setEpgHistorySeconds(config.epg.histminutes.getValue()*60) config.epg.histminutes.addNotifier(EpgHistorySecondsChanged) def setHDDStandby(configElement): for hdd in harddiskmanager.HDDList(): hdd[1].setIdleTime(int(configElement.value)) config.usage.hdd_standby.addNotifier(setHDDStandby, immediate_feedback=False) def set12VOutput(configElement): if configElement.value == "on": enigma.Misc_Options.getInstance().set_12V_output(1) elif configElement.value == "off": enigma.Misc_Options.getInstance().set_12V_output(0) config.usage.output_12V.addNotifier(set12VOutput, immediate_feedback=False) SystemInfo["12V_Output"] = enigma.Misc_Options.getInstance().detected_12V_output() config.usage.keymap = ConfigText(default = eEnv.resolve("${datadir}/enigma2/keymap.xml")) config.seek = ConfigSubsection() config.seek.selfdefined_13 = ConfigNumber(default=15) config.seek.selfdefined_46 = ConfigNumber(default=60) config.seek.selfdefined_79 = ConfigNumber(default=300) config.seek.speeds_forward = ConfigSet(default=[2, 4, 8, 16, 32, 64, 128], choices=[2, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128]) config.seek.speeds_backward = ConfigSet(default=[2, 4, 8, 16, 32, 64, 128], choices=[1, 2, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128]) config.seek.speeds_slowmotion = ConfigSet(default=[2, 4, 8], choices=[2, 4, 6, 8, 12, 16, 25]) config.seek.enter_forward = ConfigSelection(default = "2", choices = ["2", "4", "6", "8", "12", "16", "24", "32", "48", "64", "96", "128"]) config.seek.enter_backward = ConfigSelection(default = "1", choices = ["1", "2", "4", "6", "8", "12", "16", "24", "32", "48", "64", "96", "128"]) config.seek.on_pause = ConfigSelection(default = "play", choices = [ ("play", _("Play")), ("step", _("Singlestep (GOP)")), ("last", _("Last speed")) ]) config.crash = ConfigSubsection() config.crash.details = ConfigYesNo(default = False) config.usage.timerlist_finished_timer_position = ConfigSelection(default = "end", choices = [("beginning", _("at beginning")), ("end", _("at end"))]) def updateEnterForward(configElement): if not configElement.value: configElement.value = [2] updateChoices(config.seek.enter_forward, configElement.value) config.seek.speeds_forward.addNotifier(updateEnterForward, immediate_feedback = False) def updateEnterBackward(configElement): if not configElement.value: configElement.value = [2] updateChoices(config.seek.enter_backward, configElement.value) config.seek.speeds_backward.addNotifier(updateEnterBackward, immediate_feedback = False) def updateFlushSize(el): enigma.setFlushSize(int(el.value)) print "[SETTING] getFlushSize=", enigma.getFlushSize() config.misc.flush_size = ConfigSelection(default = "0", choices = [ ("0", "Off"), ("524288", "512kB"), ("1048576", "1 MB"), ("2097152", "2 MB"), ("4194304", "4 MB")]) config.misc.flush_size.addNotifier(updateFlushSize, immediate_feedback = False) def updateEraseSpeed(el): enigma.eBackgroundFileEraser.getInstance().setEraseSpeed(int(el.value)) def updateEraseFlags(el): enigma.eBackgroundFileEraser.getInstance().setEraseFlags(int(el.value)) config.misc.erase_speed = ConfigSelection(default="20", choices = [ ("10", "10 MB/s"), ("20", "20 MB/s"), ("50", "50 MB/s"), ("100", "100 MB/s")]) config.misc.erase_speed.addNotifier(updateEraseSpeed, immediate_feedback = False) config.misc.erase_flags = ConfigSelection(default="1", choices = [ ("0", _("Disable")), ("1", _("Internal hdd only")), ("3", _("Everywhere"))]) config.misc.erase_flags.addNotifier(updateEraseFlags, immediate_feedback = False) SystemInfo["ZapMode"] = os.path.exists("/proc/stb/video/zapmode") if SystemInfo["ZapMode"]: def setZapmode(el): try: file = open("/proc/stb/video/zapmode", "w") file.write(el.value) file.close() except: pass config.misc.zapmode = ConfigSelection(default = "mute", choices = [ ("mute", _("Black screen")), ("hold", _("Hold screen")), ("mutetilllock", _("Black screen till locked")), ("holdtilllock", _("Hold till locked"))]) config.misc.zapmode.addNotifier(setZapmode, immediate_feedback = False) config.subtitles = ConfigSubsection() config.subtitles.ttx_subtitle_colors = ConfigSelection(default = "1", choices = [ ("0", _("original")), ("1", _("white")), ("2", _("yellow")) ]) config.subtitles.ttx_subtitle_original_position = ConfigYesNo(default = False) config.subtitles.subtitle_position = ConfigSelection( choices = ["0", "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "150", "200", "250", "300", "350", "400", "450"], default = "50") config.subtitles.subtitle_alignment = ConfigSelection(choices = [("left", _("left")), ("center", _("center")), ("right", _("right"))], default = "center") config.subtitles.subtitle_rewrap = ConfigYesNo(default = False) config.subtitles.subtitle_borderwidth = ConfigSelection(choices = ["1", "2", "3", "4", "5"], default = "3") config.subtitles.subtitle_fontsize = ConfigSelection(choices = ["16", "18", "20", "22", "24", "26", "28", "30", "32", "34", "36", "38", "40", "42", "44", "46", "48", "50", "52", "54"], default = "34") choicelist = [] for i in range(45000, 945000, 45000): choicelist.append(("%d" % i, "%2.1f sec" % (i / 90000.))) config.subtitles.subtitle_noPTSrecordingdelay = ConfigSelection(default = "315000", choices = [("0", _("No Delay"))] + choicelist) config.subtitles.dvb_subtitles_yellow = ConfigYesNo(default = False) config.subtitles.dvb_subtitles_original_position = ConfigSelection(default = "0", choices = [("0", _("original")), ("1", _("fixed")), ("2", _("relative"))]) config.subtitles.dvb_subtitles_centered = ConfigYesNo(default = False) config.subtitles.dvb_subtitles_backtrans = ConfigSelection(default = "0", choices = [ ("0", _("no transparency")), ("25", "10%"), ("50", "20%"), ("75", "30%"), ("100", "40%"), ("125", "50%"), ("150", "60%"), ("175", "70%"), ("200", "80%"), ("225", "90%"), ("255", _("full transparency"))]) config.subtitles.pango_subtitles_yellow = ConfigYesNo(default = False) config.autolanguage = ConfigSubsection() audio_language_choices=[ ("---", _("None")), ("orj dos ory org esl qaa und mis mul ORY ORJ Audio_ORJ", _("Original")), ("ara", _("Arabic")), ("eus baq", _("Basque")), ("bul", _("Bulgarian")), ("hrv", _("Croatian")), ("ces cze", _("Czech")), ("dan", _("Danish")), ("dut ndl", _("Dutch")), ("eng qaa", _("English")), ("est", _("Estonian")), ("fin", _("Finnish")), ("fra fre", _("French")), ("deu ger", _("German")), ("ell gre", _("Greek")), ("heb", _("Hebrew")), ("hun", _("Hungarian")), ("ita", _("Italian")), ("lat", _("Latvian")), ("lit", _("Lithuanian")), ("ltz", _("Letzeburgesch")), ("nor", _("Norwegian")), ("pol", _("Polish")), ("por", _("Portuguese")), ("fas per", _("Persian")), ("ron rum", _("Romanian")), ("rus", _("Russian")), ("srp", _("Serbian")), ("slk slo", _("Slovak")), ("slv", _("Slovenian")), ("spa", _("Spanish")), ("swe", _("Swedish")), ("tha", _("Thai")), ("tur Audio_TUR", _("Turkish"))] def setEpgLanguage(configElement): enigma.eServiceEvent.setEPGLanguage(configElement.value) config.autolanguage.audio_epglanguage = ConfigSelection(audio_language_choices[:1] + audio_language_choices [2:], default="---") config.autolanguage.audio_epglanguage.addNotifier(setEpgLanguage) def setEpgLanguageAlternative(configElement): enigma.eServiceEvent.setEPGLanguageAlternative(configElement.value) config.autolanguage.audio_epglanguage_alternative = ConfigSelection(audio_language_choices[:1] + audio_language_choices [2:], default="---") config.autolanguage.audio_epglanguage_alternative.addNotifier(setEpgLanguageAlternative) config.autolanguage.audio_autoselect1 = ConfigSelection(choices=audio_language_choices, default="---") config.autolanguage.audio_autoselect2 = ConfigSelection(choices=audio_language_choices, default="---") config.autolanguage.audio_autoselect3 = ConfigSelection(choices=audio_language_choices, default="---") config.autolanguage.audio_autoselect4 = ConfigSelection(choices=audio_language_choices, default="---") config.autolanguage.audio_defaultac3 = ConfigYesNo(default = False) config.autolanguage.audio_usecache = ConfigYesNo(default = True) subtitle_language_choices = audio_language_choices[:1] + audio_language_choices [2:] config.autolanguage.subtitle_autoselect1 = ConfigSelection(choices=subtitle_language_choices, default="---") config.autolanguage.subtitle_autoselect2 = ConfigSelection(choices=subtitle_language_choices, default="---") config.autolanguage.subtitle_autoselect3 = ConfigSelection(choices=subtitle_language_choices, default="---") config.autolanguage.subtitle_autoselect4 = ConfigSelection(choices=subtitle_language_choices, default="---") config.autolanguage.subtitle_hearingimpaired = ConfigYesNo(default = False) config.autolanguage.subtitle_defaultimpaired = ConfigYesNo(default = False) config.autolanguage.subtitle_defaultdvb = ConfigYesNo(default = False) config.autolanguage.subtitle_usecache = ConfigYesNo(default = True) config.autolanguage.equal_languages = ConfigSelection(default = "15", choices = [ ("0", "None"),("1", "1"),("2", "2"),("3", "1,2"), ("4", "3"),("5", "1,3"),("6", "2,3"),("7", "1,2,3"), ("8", "4"),("9", "1,4"),("10", "2,4"),("11", "1,2,4"), ("12", "3,4"),("13", "1,3,4"),("14", "2,3,4"),("15", "All")]) # [ iqteam config.fan_config = ConfigSubsection() config.fan_config.offset = ConfigNumber(default = 0) config.fan_config.default = ConfigNumber(default = 5) config.fan_config.increment = ConfigNumber(default = 5) config.fan_config.configured = ConfigYesNo(default = False) config.swupdate = ConfigSubsection() config.swupdate.folderprefix = ConfigText(default='', fixed_size=False) config.swupdate.downloadlocation = ConfigSelection(choices = []) config.vfd_scroll = ConfigYesNo(default = False) config.usage.background_hddjob = ConfigYesNo(default = False) # [iq] # iqteam ] config.streaming = ConfigSubsection() config.streaming.stream_ecm = ConfigYesNo(default = False) config.streaming.descramble = ConfigYesNo(default = True) config.streaming.stream_eit = ConfigYesNo(default = True) config.streaming.stream_ait = ConfigYesNo(default = True)
def __init__(self, session, type = 0, iface='eth0'): Screen.__init__(self, session) self.session = session self.type = type # update type self.iface = iface self.drawProgressBarTimer = eTimer() self.drawProgressBarTimer.callback.append(self.drawProgressBar) self.checkEnvTimer = eTimer() self.checkEnvTimer.callback.append(self.checkEnv) self.progressSpin = [ "% /", "% |", "% -" ] if self.iface == 'wlan0' or self.iface == 'ath0' or self.iface == 'ra0': lan = "Wireless" else: lan = "Integrated Ethernet" self.imageInfo = { self.INTERNET_UPDATE : { "title" : "SW Update - "+lan, "imagedir" : "NEW/"+eSystemInfo.getInstance().getModel()+"_REL" }, self.INTERNET_SR_UPDATE : { "title" : "SR SW Update - "+lan, "imagedir" : "NEW/"+eSystemInfo.getInstance().getModel()+"SR_REL" }, self.INTERNET_UPDATE_BETA : { "title" : "SW Update (BETA) - "+lan, "imagedir" : "NEW/"+eSystemInfo.getInstance().getModel() }, self.INTERNET_SR_UPDATE_BETA : { "title" : "SR SW Update (BETA) - "+lan, "imagedir" : "NEW/"+eSystemInfo.getInstance().getModel()+"SR" } } self.setTitle(self.imageInfo[self.type]["title"]) self.swList = [] self.hddList = [] self["menulist"] = MenuList(self.swList) self["menulist"].hide() self["percent"] = Label(_(" ")) self["run"] = Label(_(" ")) self["prog"] = Label(_(" ")) self["top"] = Label(_(" ")) self["bottom"] = Label(_(" ")) self["text"] = Label(_("Downloading list information. Please wait...")) # self["key_blue"] = Button(_("Backup location : " + config.swupdate.downloadlocation.value)) self["key_blue"] = Button(_("Backup location : ")) self["actions"] = ActionMap(["MinuteInputActions", "ColorActions"], { "cancel": self.cancel, "ok": self.ok, "up": self.up, "down": self.down, "blue": self.toggleHddSW, },-1) self.requiredSize = -1 self.serverAlive = False self.showingHddList = False self.downloadingSW = False self.depSWList = [ "cfe", "kernel" ] self.existDepSWList = [] self.downloadedSW = {} def progressBar(configElement): num = int(configElement.value) if num > 0: self["run"].setText(_(self.progressSpin[num%3])) self["prog"].setText("[" + "="*(40*num/100) + "]") self["percent"].setText(_("%d" % num)) else: self["run"].setText(_(" ")) self["prog"].setText(_(" ")) self["percent"].setText(_(" ")) def progressAction(configElement): num = int(configElement.value) if num == -1: self.drawProgressBarTimer.stop() MiniFTP_Thread.getInstance().Stop_Thread(); self.downloadingSW = False self.hiddenSWNum = 0 self.downloadedSW = {} self.removeDownloadDir() elif num < 100: self.drawProgressBarTimer.start(1000, True) elif num == 100: self.drawProgressBarTimer.stop() MiniFTP_Thread.getInstance().Stop_Thread(); self.downloadingSW = False if len(self.existDepSWList): self.download(extStr=self.existDepSWList.pop()) else: if self.downloadedSWSizeOk(): self.session.openWithCallback(self.downloadBurn, UpdateModeChoice) else: self.session.open(MessageBox, _("Failed while checking downloaded SW!\nTry again please."), MessageBox.TYPE_ERROR) self.downloadCancel(True) config.progress = NoSave(ConfigSelectionNumber(-1, 100, 1, default = -1)) config.progress.addNotifier(progressBar, False) config.progress.addNotifier(progressAction, False) def downloadLocation(configElement): if "key_blue" in self: self["key_blue"].setText(_("Backup location : " + configElement.value)) config.swupdate.downloadlocation.addNotifier(downloadLocation) self.checkEnvTimer.start(1000, True)