Please Translate Liquidity Heatmap (Nephew_Sam_ from Trading View thank you!!!
Forums › ProRealTime forum Italiano › Supporto ProBuilder › Please Translate Liquidity Heatmap (Nephew_Sam_ from Trading View thank you!!!
- This topic has 2 replies, 2 voices, and was last updated 5 days ago by
roccafragius.
Viewing 3 posts - 1 through 3 (of 3 total)
-
-
10/01/2025 at 6:51 PM #252077// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/// © Nephew_Sam_//@version=5indicator(‘Liquidity Heatmap (Nephew_Sam_)’, overlay=true, max_bars_back=500, max_lines_count=500, max_boxes_count=500, max_labels_count=500)// ————— INPUTS —————var GRP1 = “•••••••••• INTRADAY TIMEFRAMES ••••••••••”// 1ltimeframe1Show = input.bool(true, title=”, inline=’1′, group=GRP1)ltimeframe1 = input.timeframe(’15’, title=”, inline=’1′, group=GRP1)lleftBars1 = input.int(defval=7, title=’Left’, minval=2, maxval=20, group=GRP1, inline=’1′)lrightBars1 = input.int(defval=7, title=’Right’, minval=2, maxval=20, group=GRP1, inline=’1′, tooltip=”Highest/lowest point in x right and left bars.”)// 2ltimeframe2Show = input.bool(true, title=”, inline=’2′, group=GRP1)ltimeframe2 = input.timeframe(’30’, title=”, inline=’2′, group=GRP1)lleftBars2 = input.int(defval=7, title=’Left’, minval=2, maxval=20, group=GRP1, inline=’2′)lrightBars2 = input.int(defval=7, title=’Right’, minval=2, maxval=20, group=GRP1, inline=’2′, tooltip=”Highest/lowest point in x right and left bars.”)// 3ltimeframe3Show = input.bool(true, title=”, inline=’3′, group=GRP1)ltimeframe3 = input.timeframe(’60’, title=”, inline=’3′, group=GRP1)lleftBars3 = input.int(defval=7, title=’Left’, minval=2, maxval=20, group=GRP1, inline=’3′)lrightBars3 = input.int(defval=6, title=’Right’, minval=2, maxval=20, group=GRP1, inline=’3′, tooltip=”Highest/lowest point in x right and left bars.”)// 4ltimeframe4Show = input.bool(true, title=”, inline=’4′, group=GRP1)ltimeframe4 = input.timeframe(‘120′, title=”, inline=’4’, group=GRP1)lleftBars4 = input.int(defval=7, title=’Left’, minval=2, maxval=20, group=GRP1, inline=’4′)lrightBars4 = input.int(defval=6, title=’Right’, minval=2, maxval=20, group=GRP1, inline=’4′, tooltip=”Highest/lowest point in x right and left bars.”)// 5ltimeframe5Show = input.bool(true, title=”, inline=’5′, group=GRP1)ltimeframe5 = input.timeframe(‘240′, title=”, inline=’5’, group=GRP1)lleftBars5 = input.int(defval=6, title=’Left’, minval=2, maxval=20, group=GRP1, inline=’5′)lrightBars5 = input.int(defval=6, title=’Right’, minval=2, maxval=20, group=GRP1, inline=’5′, tooltip=”Highest/lowest point in x right and left bars.”)// 6ltimeframe6Show = input.bool(true, title=”, inline=’6′, group=GRP1)ltimeframe6 = input.timeframe(‘D’, title=”, inline=’6′, group=GRP1)lleftBars6 = input.int(defval=5, title=’Left’, minval=2, maxval=20, group=GRP1, inline=’6′)lrightBars6 = input.int(defval=5, title=’Right’, minval=2, maxval=20, group=GRP1, inline=’6′, tooltip=”Highest/lowest point in x right and left bars.”)var GRP2 = “•••••••••• HIGHER TIMEFRAMES (> 4HR) ••••••••••”// 1htimeframe1Show = input.bool(true, title=”, inline=’1′, group=GRP2)htimeframe1 = input.timeframe(‘480′, title=”, inline=’1’, group=GRP2)hleftBars1 = input.int(defval=7, title=’Left’, minval=2, maxval=20, group=GRP2, inline=’1′)hrightBars1 = input.int(defval=7, title=’Right’, minval=2, maxval=20, group=GRP2, inline=’1′, tooltip=”Highest/lowest point in x right and left bars.”)// 2htimeframe2Show = input.bool(true, title=”, inline=’2′, group=GRP2)htimeframe2 = input.timeframe(‘D’, title=”, inline=’2′, group=GRP2)hleftBars2 = input.int(defval=7, title=’Left’, minval=2, maxval=20, group=GRP2, inline=’2′)hrightBars2 = input.int(defval=7, title=’Right’, minval=2, maxval=20, group=GRP2, inline=’2′, tooltip=”Highest/lowest point in x right and left bars.”)// 3htimeframe3Show = input.bool(true, title=”, inline=’3′, group=GRP2)htimeframe3 = input.timeframe(‘3D’, title=”, inline=’3′, group=GRP2)hleftBars3 = input.int(defval=7, title=’Left’, minval=2, maxval=20, group=GRP2, inline=’3′)hrightBars3 = input.int(defval=6, title=’Right’, minval=2, maxval=20, group=GRP2, inline=’3′, tooltip=”Highest/lowest point in x right and left bars.”)// 4htimeframe4Show = input.bool(true, title=”, inline=’4′, group=GRP2)htimeframe4 = input.timeframe(‘W’, title=”, inline=’4′, group=GRP2)hleftBars4 = input.int(defval=7, title=’Left’, minval=2, maxval=20, group=GRP2, inline=’4′)hrightBars4 = input.int(defval=6, title=’Right’, minval=2, maxval=20, group=GRP2, inline=’4′, tooltip=”Highest/lowest point in x right and left bars.”)// 5htimeframe5Show = input.bool(true, title=”, inline=’5′, group=GRP2)htimeframe5 = input.timeframe(‘M’, title=”, inline=’5′, group=GRP2)hleftBars5 = input.int(defval=6, title=’Left’, minval=2, maxval=20, group=GRP2, inline=’5′)hrightBars5 = input.int(defval=6, title=’Right’, minval=2, maxval=20, group=GRP2, inline=’5′, tooltip=”Highest/lowest point in x right and left bars.”)// 6htimeframe6Show = input.bool(false, title=”, inline=’6′, group=GRP2)htimeframe6 = input.timeframe(‘2M’, title=”, inline=’6′, group=GRP2)hleftBars6 = input.int(defval=5, title=’Left’, minval=2, maxval=20, group=GRP2, inline=’6′)hrightBars6 = input.int(defval=5, title=’Right’, minval=2, maxval=20, group=GRP2, inline=’6′, tooltip=”Highest/lowest point in x right and left bars.”)var GRP3 = “•••••••••• Other Settings ••••••••••”hideLTF = input.bool(true, “Hide lines lower than enabled timeframes?”, group = GRP3)// ————— INPUTS —————// ————— COLORS AND LENGTH —————topColor1 = color.new(color.red, 70)bottomColor1 = color.new(color.green, 70)lineLength1 = 6topColor2 = color.new(color.red, 60)bottomColor2 = color.new(color.green, 60)lineLength2 = 10topColor3 = color.new(color.red, 50)bottomColor3 = color.new(color.green, 50)lineLength3 = 10topColor4 = color.new(color.red, 40)bottomColor4 = color.new(color.green, 40)lineLength4 = 10topColor5 = color.new(color.red, 30)bottomColor5 = color.new(color.green, 30)lineLength5 = 15topColor6 = color.new(color.red, 20)bottomColor6 = color.new(color.green, 20)lineLength6 = 15// ————— COLORS AND LENGTH —————// ————— FUNCTIONS —————getPivotData(lb, rb) =>ph = ta.pivothigh(lb, rb)phtimestart = ph ? time[rb-1] : napl = ta.pivotlow(lb, rb)pltimestart = pl ? time[rb-1] : na[ph, phtimestart, pl, pltimestart]getLineStyle(_style) =>_linestyle = _style == “Solid” ? line.style_solid : _style == “Dashed” ? line.style_dashed : line.style_dotted_linestyleresolutionInMinutes(tf = “”) =>chartTf = timeframe.multiplier * (timeframe.isseconds ? 1. / 60 : timeframe.isminutes ? 1. : timeframe.isdaily ? 60. * 24 : timeframe.isweekly ? 60. * 24 * 7 : timeframe.ismonthly ? 60. * 24 * 30.4375 : na)float result = tf == “” ? chartTf : request.security(syminfo.tickerid, tf, chartTf)f_timeFrom(length, _units) =>int _timeFrom = na_unit = str.replace_all(_units, ‘s’, ”)_timeFrom := int(time + resolutionInMinutes() * 60 * 1000 * length)_timeFromnotLowerTimeframe(tf) =>_cond = hideLTF ? resolutionInMinutes() < resolutionInMinutes(tf) : true_cond// ▓ ▒ ░ ░generateText(_n = 5, _large = false) =>_symbol = “░”_text = “”for i = _n to 0_text := _text + ” “for i = _n to 0_text := _text + _symbolif _large_text := _text + “\n” + _text_text// ————— FUNCTIONS —————isLtf = resolutionInMinutes() < resolutionInMinutes(“240”)// ————— Calculate Pivots —————[phchart, phtimestartchart, plchart, pltimestartchart] = request.security(syminfo.tickerid, “5”, getPivotData(6, 6), lookahead = barmerge.lookahead_on)[lph1, lphtimestart1, lpl1, lpltimestart1] = request.security(syminfo.tickerid, ltimeframe1, getPivotData(lleftBars1, lrightBars1), lookahead = barmerge.lookahead_on)[lph2, lphtimestart2, lpl2, lpltimestart2] = request.security(syminfo.tickerid, ltimeframe2, getPivotData(lleftBars2, lrightBars2), lookahead = barmerge.lookahead_on)[lph3, lphtimestart3, lpl3, lpltimestart3] = request.security(syminfo.tickerid, ltimeframe3, getPivotData(lleftBars3, lrightBars3), lookahead = barmerge.lookahead_on)[lph4, lphtimestart4, lpl4, lpltimestart4] = request.security(syminfo.tickerid, ltimeframe4, getPivotData(lleftBars4, lrightBars4), lookahead = barmerge.lookahead_on)[lph5, lphtimestart5, lpl5, lpltimestart5] = request.security(syminfo.tickerid, ltimeframe5, getPivotData(lleftBars5, lrightBars5), lookahead = barmerge.lookahead_on)[lph6, lphtimestart6, lpl6, lpltimestart6] = request.security(syminfo.tickerid, ltimeframe6, getPivotData(lleftBars6, lrightBars6), lookahead = barmerge.lookahead_on)[hph1, hphtimestart1, hpl1, hpltimestart1] = request.security(syminfo.tickerid, htimeframe1, getPivotData(hleftBars1, hrightBars1), lookahead = barmerge.lookahead_on)[hph2, hphtimestart2, hpl2, hpltimestart2] = request.security(syminfo.tickerid, htimeframe2, getPivotData(hleftBars2, hrightBars2), lookahead = barmerge.lookahead_on)[hph3, hphtimestart3, hpl3, hpltimestart3] = request.security(syminfo.tickerid, htimeframe3, getPivotData(hleftBars3, hrightBars3), lookahead = barmerge.lookahead_on)[hph4, hphtimestart4, hpl4, hpltimestart4] = request.security(syminfo.tickerid, htimeframe4, getPivotData(hleftBars4, hrightBars4), lookahead = barmerge.lookahead_on)[hph5, hphtimestart5, hpl5, hpltimestart5] = request.security(syminfo.tickerid, htimeframe5, getPivotData(hleftBars5, hrightBars5), lookahead = barmerge.lookahead_on)[hph6, hphtimestart6, hpl6, hpltimestart6] = request.security(syminfo.tickerid, htimeframe6, getPivotData(hleftBars6, hrightBars6), lookahead = barmerge.lookahead_on)ph1 = isLtf ? lph1 : hph1phtimestart1 = isLtf ? lphtimestart1 : hphtimestart1pl1 = isLtf ? lpl1 : hpl1pltimestart1 = isLtf ? lpltimestart1 : hpltimestart1ph2 = isLtf ? lph2 : hph2phtimestart2 = isLtf ? lphtimestart2 : hphtimestart2pl2 = isLtf ? lpl2 : hpl2pltimestart2 = isLtf ? lpltimestart2 : hpltimestart2ph3 = isLtf ? lph3 : hph3phtimestart3 = isLtf ? lphtimestart3 : hphtimestart3pl3 = isLtf ? lpl3 : hpl3pltimestart3 = isLtf ? lpltimestart3 : hpltimestart3ph4 = isLtf ? lph4 : hph4phtimestart4 = isLtf ? lphtimestart4 : hphtimestart4pl4 = isLtf ? lpl4 : hpl4pltimestart4 = isLtf ? lpltimestart4 : hpltimestart4ph5 = isLtf ? lph5 : hph5phtimestart5 = isLtf ? lphtimestart5 : hphtimestart5pl5 = isLtf ? lpl5 : hpl5pltimestart5 = isLtf ? lpltimestart5 : hpltimestart5ph6 = isLtf ? lph6 : hph6phtimestart6 = isLtf ? lphtimestart6 : hphtimestart6pl6 = isLtf ? lpl6 : hpl6pltimestart6 = isLtf ? lpltimestart6 : hpltimestart6pivothighchart = na(phchart[1]) and phchart ? phchart : napivotlowchart = na(plchart[1]) and plchart ? plchart : napivothigh1 = na(ph1[1]) and ph1 ? ph1 : napivotlow1 = na(pl1[1]) and pl1 ? pl1 : napivothigh2 = na(ph2[1]) and ph2 ? ph2 : napivotlow2 = na(pl2[1]) and pl2 ? pl2 : napivothigh3 = na(ph3[1]) and ph3 ? ph3 : napivotlow3 = na(pl3[1]) and pl3 ? pl3 : napivothigh4 = na(ph4[1]) and ph4 ? ph4 : napivotlow4 = na(pl4[1]) and pl4 ? pl4 : napivothigh5 = na(ph5[1]) and ph5 ? ph5 : napivotlow5 = na(pl5[1]) and pl5 ? pl5 : napivothigh6 = na(ph6[1]) and ph6 ? ph6 : napivotlow6 = na(pl6[1]) and pl6 ? pl6 : na// ————— Calculate Pivots —————// ————— Add to array —————var float[] pivothighs1 = array.new_float(0)var float[] pivotlows1 = array.new_float(0)var float[] pivothighs2 = array.new_float(0)var float[] pivotlows2 = array.new_float(0)var float[] pivothighs3 = array.new_float(0)var float[] pivotlows3 = array.new_float(0)var float[] pivothighs4 = array.new_float(0)var float[] pivotlows4 = array.new_float(0)var float[] pivothighs5 = array.new_float(0)var float[] pivotlows5 = array.new_float(0)var float[] pivothighs6 = array.new_float(0)var float[] pivotlows6 = array.new_float(0)// ————— Add to array —————// ————— Plot pivot points —————// if barstate.islast// label.new(bar_index, high, str.tostring(resolutionInMinutes()) +”\n”+ str.tostring(resolutionInMinutes(“3”)))// ONLY LOW TIMEFRAME > 3showTimeframe1 = isLtf ? ltimeframe1Show : htimeframe1ShowvalidTimeframe1 = isLtf ? notLowerTimeframe(ltimeframe1) : notLowerTimeframe(htimeframe1)if showTimeframe1 and pivothighchart and resolutionInMinutes() <= resolutionInMinutes(“3”)label.new(phtimestartchart, phchart, xloc=xloc.bar_time, text=generateText(12), style=label.style_none, textcolor=topColor1)if showTimeframe1 and pivotlowchart and resolutionInMinutes() <= resolutionInMinutes(“3”)label.new(pltimestartchart, plchart, xloc=xloc.bar_time, text=generateText(12), style=label.style_none, textcolor=bottomColor1)// Timeframe 1if showTimeframe1 and pivothigh1 and validTimeframe1label.new(phtimestart1, ph1, xloc=xloc.bar_time, text=generateText(lineLength1), style=label.style_none, textcolor=topColor1)if showTimeframe1 and pivotlow1 and validTimeframe1label.new(pltimestart1, pl1, xloc=xloc.bar_time, text=generateText(lineLength1), style=label.style_none, textcolor=bottomColor1)// Timeframe 2showTimeframe2 = isLtf ? ltimeframe2Show : htimeframe2ShowvalidTimeframe2 = isLtf ? notLowerTimeframe(ltimeframe2) : notLowerTimeframe(htimeframe2)if showTimeframe2 and pivothigh2 and validTimeframe2label.new(phtimestart2, ph2, xloc=xloc.bar_time, text=generateText(lineLength2), style=label.style_none, textcolor=topColor2)if showTimeframe2 and pivotlow2 and validTimeframe2label.new(pltimestart2, pl2, xloc=xloc.bar_time, text=generateText(lineLength2), style=label.style_none, textcolor=bottomColor2)// Timeframe 3showTimeframe3 = isLtf ? ltimeframe3Show : htimeframe3ShowvalidTimeframe3 = isLtf ? notLowerTimeframe(ltimeframe3) : notLowerTimeframe(htimeframe3)if showTimeframe3 and pivothigh3 and validTimeframe3label.new(phtimestart3, ph3, xloc=xloc.bar_time, text=generateText(lineLength3), style=label.style_none, textcolor=topColor3)if showTimeframe3 and pivotlow3 and validTimeframe3label.new(pltimestart3, pl3, xloc=xloc.bar_time, text=generateText(lineLength3), style=label.style_none, textcolor=bottomColor3)// Timeframe 4showTimeframe4 = isLtf ? ltimeframe4Show : htimeframe4ShowvalidTimeframe4 = isLtf ? notLowerTimeframe(ltimeframe4) : notLowerTimeframe(htimeframe4)if showTimeframe4 and pivothigh4 and validTimeframe4label.new(phtimestart4, ph4, xloc=xloc.bar_time, text=generateText(lineLength4), style=label.style_none, textcolor=topColor4)if showTimeframe4 and pivotlow4 and validTimeframe4label.new(pltimestart4, pl4, xloc=xloc.bar_time, text=generateText(lineLength4), style=label.style_none, textcolor=bottomColor4)// Timeframe 5showTimeframe5 = isLtf ? ltimeframe5Show : htimeframe5ShowvalidTimeframe5 = isLtf ? notLowerTimeframe(ltimeframe5) : notLowerTimeframe(htimeframe5)if showTimeframe5 and pivothigh5 and validTimeframe5label.new(phtimestart5, ph5, xloc=xloc.bar_time, text=generateText(lineLength5, true), style=label.style_none, textcolor=topColor5)if showTimeframe5 and pivotlow5 and validTimeframe5label.new(pltimestart5, pl5, xloc=xloc.bar_time, text=generateText(lineLength5, true), style=label.style_none, textcolor=bottomColor5)// Timeframe 6showTimeframe6 = isLtf ? ltimeframe6Show : htimeframe6ShowvalidTimeframe6 = isLtf ? notLowerTimeframe(ltimeframe6) : notLowerTimeframe(htimeframe6)if showTimeframe6 and pivothigh6 and validTimeframe6label.new(phtimestart6, ph6, xloc=xloc.bar_time, text=generateText(lineLength6, true), style=label.style_none, textcolor=topColor6)if showTimeframe6 and pivotlow6 and validTimeframe6label.new(pltimestart6, pl6, xloc=xloc.bar_time, text=generateText(lineLength6, true), style=label.style_none, textcolor=bottomColor6)// ————— Plot pivot points —————// ————— Equal highs —————// WATERMARKif barstate.islast_table = table.new(“bottom_left”, 1, 1)table.cell(_table, 0, 0, text=”@Nephew_Sam_”, text_size=size.small, text_color=color.new(color.gray, 50))10/03/2025 at 10:09 AM #252137
Questo codice è complicato perché non abbiamo gli stessi strumenti in ProRealTime.
Quello che le passo è un modo per affrontarlo e calcolare i pivot a 15 minuti, 30 minuti e 1 ora.
Può regolare i timeframe a sua convenienza.123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115DEFPARAM DrawOnLastBarOnly = true// Parámetros de usuarioleftBars = 7rightBars = 7src1 = lowsrc2 = high// ======================// Pivotes en 1h// ======================TIMEFRAME(1 hour, updateonclose)if src2 < src2[rightbars] and highest[rightbars](src2)<=src2[rightbars] and src2[rightbars]>highest[leftbars](src2)[rightbars+1] thencheckHigh1H=1ph60=src2[rightBars]phIdx60=barindex[rightBars]endifif src1 > src1[rightbars] and lowest[rightbars](src1) >= src1[rightbars] and src1[rightbars] < lowest[leftbars](src1)[rightbars+1] thenpl60=src1[rightBars]plIdx60=barindex[rightBars]endif// ======================// Pivotes en 30m// ======================TIMEFRAME(30 minutes, updateonclose)if src2 < src2[rightbars] and highest[rightbars](src2)<=src2[rightbars] and src2[rightbars]>highest[leftbars](src2)[rightbars+1] thenph30=src2[rightBars]phIdx30=barindex[rightBars]endifif src1 > src1[rightbars] and lowest[rightbars](src1) >= src1[rightbars] and src1[rightbars] < lowest[leftbars](src1)[rightbars+1] thenpl30=src1[rightBars]plIdx30=barindex[rightBars]endif// ======================// Pivotes en 15m// ======================TIMEFRAME(15 minutes)atr=averagetruerange[14](close)if src2 < src2[rightbars] and highest[rightbars](src2)<=src2[rightbars] and src2[rightbars]>highest[leftbars](src2)[rightbars+1] thenph15=src2[rightBars]phIdx15=barindex[rightBars]$phigh15[r+1]=ph15$phighIdx15[r+1]=phIdx15$phighIdxRight15[r+1]=barindexr=r+1endifif src1 > src1[rightbars] and lowest[rightbars](src1) >= src1[rightbars] and src1[rightbars] < lowest[leftbars](src1)[rightbars+1] thenpl15=src1[rightBars]plIdx15=barindex[rightBars]$plow15[t+1]=pl15$plowIdx15[t+1]=plIdx15$plowIdxRight15[t+1]=barindext=t+1endifif ph30<>ph30[1] then$phigh30[m+1]=ph30$phighIdx30[m+1]=barindex[rightBars*2]$phighIdxRight30[m+1]=barindexm=m+1endifif pl30<>pl30[1] then$plow30[q+1]=pl30$plowIdx30[q+1]=barindex[rightBars*2]$plowIdxRight30[q+1]=barindexq=q+1endifif ph60<>ph60[1] then$phigh60[n+1]=ph60$phighIdx60[n+1]=barindex[rightBars*4]$phighIdxRight60[n+1]=barindexn=n+1endifif pl60<>pl60[1] then$plow60[z+1]=pl60$plowIdx60[z+1]=barindex[rightBars*4]$plowIdxRight60[z+1]=barindexz=z+1endif// ======================// Dibujo de pivotes// ======================timeframe(default)if islastbarupdate thenfor i=1 to t dodrawpoint($plowIdx15[i],$plow15[i],1)coloured("blue")drawrectangle($plowIdx15[i]-3,$plow15[i]+0.5*atr,$plowIdxRight15[i],$plow15[i]-0.5*atr)coloured("blue")fillcolor("blue",150)nextfor i=1 to r dodrawpoint($phighIdx15[i],$phigh15[i],1)coloured("red")drawrectangle($phighIdx15[i]-3,$phigh15[i]+0.5*atr,$phighIdxRight15[i],$phigh15[i]-0.5*atr)coloured("red")fillcolor("red",150)nextfor i=1 to q dodrawrectangle($plowIdx30[i],$plow30[i]+0.75*atr,$plowIdxRight30[i],$plow30[i]-0.75*atr)coloured("blue")fillcolor("blue",90)nextfor i=1 to m dodrawrectangle($phighIdx30[i],$phigh30[i]+0.75*atr,$phighIdxRight30[i],$phigh30[i]-0.75*atr)coloured("red")fillcolor("red",90)nextfor i=1 to z dodrawrectangle($plowIdx60[i],$plow60[i]+atr,$plowIdxRight60[i],$plow60[i]-atr)coloured("blue")fillcolor("blue",45)nextfor i=1 to n dodrawrectangle($phighIdx60[i],$phigh60[i]+atr,$phighIdxRight60[i],$phigh60[i]-atr)coloured("red")fillcolor("red",45)nextendifRETURN10/16/2025 at 6:33 PM #252683 -
AuthorPosts
Viewing 3 posts - 1 through 3 (of 3 total)