
// Make newform 648.4.a.l in Magma, downloaded from the LMFDB on 17 April 2024.
// To make the character of type GrpDrchElt, type "MakeCharacter_648_a();"
// To make the coeffs of the qexp of the newform in the Hecke field type "qexpCoeffs();"
// To make the newform (type ModFrm), type "MakeNewformModFrm_648_4_a_l();".
// This may take a long time!  To see verbose output, uncomment the SetVerbose lines below.
// The precision argument determines an initial guess on how many Fourier coefficients to use.
// This guess is increased enough to uniquely determine the newform.
// To make the Hecke irreducible modular symbols subspace (type ModSym)
// containing the newform, type "MakeNewformModSym_648_4_a_l();".
// This may take a long time!  To see verbose output, uncomment the SetVerbose line below.
// The default sign is -1.  You can change this with the optional parameter "sign".
function ConvertToHeckeField(input: pass_field := false, Kf := [])
    if not pass_field then
        poly := [12, 81, 4, -19, -1, 1];
        Kf := NumberField(Polynomial([elt : elt in poly]));
        AssignNames(~Kf, ["nu"]);
    end if;
    Rf_num := [[1, 0, 0, 0, 0], [-19, 43, -14, -7, 2], [27, 49, -20, -7, 2], [58, 126, -60, -18, 6], [60, 290, -88, -38, 10]];
    Rf_basisdens := [1, 1, 1, 1, 1];
    Rf_basisnums := ChangeUniverse([[z : z in elt] : elt in Rf_num], Kf);
    Rfbasis := [Rf_basisnums[i]/Rf_basisdens[i] : i in [1..Degree(Kf)]];
    inp_vec := Vector(Rfbasis)*ChangeRing(Transpose(Matrix([[elt : elt in row] : row in input])),Kf);
    return Eltseq(inp_vec);
end function;


// To make the character of type GrpDrchElt, type "MakeCharacter_648_a();"
function MakeCharacter_648_a()
    N := 648;
    order := 1;
    char_gens := [487, 325, 569];
    v := [1, 1, 1];
    // chi(gens[i]) = zeta^v[i]
    assert UnitGenerators(DirichletGroup(N)) eq char_gens;
    F := CyclotomicField(order);
    chi := DirichletCharacterFromValuesOnUnitGenerators(DirichletGroup(N,F),[F|F.1^e:e in v]);
    return MinimalBaseRingCharacter(chi);
end function;

function MakeCharacter_648_a_Hecke(Kf)
    return MakeCharacter_648_a();
end function;


function ExtendMultiplicatively(weight, aps, character)
    prec := NextPrime(NthPrime(#aps)) - 1; // we will able to figure out a_0 ... a_prec
    primes := PrimesUpTo(prec);
    prime_powers := primes;
    assert #primes eq #aps;
    log_prec := Floor(Log(prec)/Log(2)); // prec < 2^(log_prec+1)
    F := Universe(aps);
    FXY<X, Y> := PolynomialRing(F, 2);
    // 1/(1 - a_p T + p^(weight - 1) * char(p) T^2) = 1 + a_p T + a_{p^2} T^2 + ...
    R<T> := PowerSeriesRing(FXY : Precision := log_prec + 1);
    recursion := Coefficients(1/(1 - X*T + Y*T^2));
    coeffs := [F!0: i in [1..(prec+1)]];
    coeffs[1] := 1; //a_1
    for i := 1 to #primes do
        p := primes[i];
        coeffs[p] := aps[i];
        b := p^(weight - 1) * F!character(p);
        r := 2;
        p_power := p * p;
        //deals with powers of p
        while p_power le prec do
            Append(~prime_powers, p_power);
            coeffs[p_power] := Evaluate(recursion[r + 1], [aps[i], b]);
            p_power *:= p;
            r +:= 1;
        end while;    
    end for;
    Sort(~prime_powers);
    for pp in prime_powers do
        for k := 1 to Floor(prec/pp) do
            if GCD(k, pp) eq 1 then
                coeffs[pp*k] := coeffs[pp]*coeffs[k];
            end if;
        end for;
    end for;
    return coeffs;
end function;


function qexpCoeffs()
    // To make the coeffs of the qexp of the newform in the Hecke field type "qexpCoeffs();"
    weight := 4;
    raw_aps := [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [1, 0, 1, 0, 0], [1, 1, 0, 0, 0], [-5, 0, 2, 0, -1], [7, 2, 1, -1, 1], [6, 0, 3, -1, 1], [12, -1, -2, 1, -2], [17, 1, 2, 3, 1], [23, -6, 1, 1, -1], [49, -1, -6, -3, 1], [72, -6, 12, -3, -5], [33, -2, -4, 1, -1], [161, 0, -8, -1, 6], [-99, -7, -8, 2, -10], [68, -10, -16, 7, -7], [-121, 6, -12, 5, 0], [267, -2, 23, 5, -13], [305, -6, -2, 6, -15], [-170, -18, -18, 1, 3], [390, 8, -23, -3, 3], [359, 17, -18, -17, 3], [-215, -23, -6, 2, 8], [464, 22, 14, 17, -9], [577, -2, -48, -7, 11], [617, 8, 21, 6, 26], [631, -17, 24, 16, -16], [-640, 3, 54, 7, -16], [556, 30, -12, -21, 29], [469, 30, 25, 2, -22], [400, -30, -92, 6, -4], [-653, -13, 26, -6, 0], [725, -46, 20, -9, -31], [555, -16, 80, -7, 26], [619, -30, 9, 1, 31], [99, 11, -86, 31, -19], [181, -8, 85, -2, 2], [76, -48, 72, -16, -24], [-457, 77, -36, -6, 20], [361, -60, -125, 44, -52], [-1912, -20, -116, 2, 6], [-308, 70, -86, -15, 7], [97, -55, -108, 4, 24], [-719, 38, 72, -63, -21], [1386, 28, -6, -68, -12], [-926, 76, 22, -47, -19], [-783, 129, 112, -29, 27], [-647, -147, -44, 60, -4], [-3041, -44, 86, 30, -27], [-739, -60, -157, 68, 28], [528, 90, 119, -32, 64], [801, -87, 110, -13, -35], [-1821, 56, -62, -28, 64], [-232, -103, -50, 65, -12], [-245, -4, 240, 30, -38], [807, 19, -26, -7, 47], [288, -86, -160, 105, -97], [-1692, -8, -12, -6, 26], [-2283, -20, 15, -22, -50], [-1445, 8, -145, -57, 69], [-1873, -121, -54, 44, -6], [1633, 176, -57, -158, 30], [-912, 113, -30, 77, 64], [-1195, 49, -338, 5, 11], [-997, -168, -26, 4, 4], [2083, 62, 37, 115, 77], [-1629, 75, -40, -79, 73], [-1669, 132, -116, -86, -18], [981, 218, -6, 20, 19], [-1847, -124, 17, 70, -182], [2513, 18, -254, -69, 93], [6116, 114, -176, -68, 10], [-381, 205, 202, -31, 177], [-1861, -62, -387, 85, 43], [1346, -3, -16, 6, 29], [4071, -219, -24, 138, -144], [-6251, 100, -173, -98, 106], [1700, -154, 160, 11, -147], [3101, -22, -268, 3, 49], [3571, 32, -214, -56, 272], [-6371, 133, -372, 93, 65], [2099, 10, -1, 85, -45], [4420, -154, 112, -36, 214], [354, -388, -477, 21, 35], [2003, -131, 158, 5, -183], [-7195, -40, 188, -79, 48], [-4062, 12, 35, 61, 107], [3537, 190, 540, -27, 219], [2655, 122, -3, 33, -97], [565, 3, 158, -173, 179], [4036, -35, 286, -285, 34], [8279, 91, 2, -227, 103], [8036, -178, -40, 112, -46], [-1665, -184, 308, 35, -204], [3727, -226, -140, 277, -172], [3682, 62, -62, 31, -95], [3423, -198, 175, 189, -341], [2708, 506, 177, -124, -40], [674, -14, -530, -171, -189], [-14, 316, 474, 156, 52], [7923, 310, -934, -126, 175], [-8248, -6, 258, -229, 213], [4529, -586, -770, 10, -95], [4083, 296, -314, -72, 360], [153, 476, -514, -64, 245], [7234, 440, -327, 75, 57], [985, 344, -792, 59, 266], [-6604, -54, -350, 59, -35], [10839, 309, 60, -294, 52], [-2943, -6, 186, -317, -143], [5387, 221, 764, -292, 274], [10756, -178, -132, 171, 253], [3829, 414, -642, -283, 511], [6483, -518, 386, 158, -381], [652, -188, -484, -74, 378], [1035, 520, 214, 44, -40], [9673, -512, -106, 312, -147], [5220, 310, -744, -168, -78], [645, -96, -173, 0, 64], [-16901, 231, -876, 149, 69], [845, -796, -919, 134, 18], [-5625, -296, -565, -163, -377], [1329, -1056, 241, 46, -382], [10376, 631, 206, 399, 4], [-12955, -639, 326, 96, -346], [-7588, 374, 34, -99, 67], [-3755, -452, -1331, -28, 396], [3336, 228, 1312, 40, 228], [9775, 35, 30, -227, 587], [3355, -122, -647, -79, 175], [334, 253, 1032, -460, 691], [-3329, 79, -192, 196, -28], [-2649, -243, 216, -294, -112], [-9082, -424, -764, 536, -632], [467, 448, 659, -5, 33], [3025, 858, -935, 64, 412], [-11932, -186, -242, -119, 407], [-5253, 287, 1074, -318, 52], [-9793, 50, -613, 73, 503], [-2790, 16, 999, 285, 351], [1356, -631, 602, 435, -578], [-16729, 430, 877, -31, -57], [-4863, 95, -1642, 133, 349], [-16800, -228, -1092, -238, 406], [1600, -446, 302, -317, -403], [15821, -1345, -1360, 552, -550], [4655, 1078, -1055, 49, -265], [1567, -332, -973, 501, -297], [6101, -136, 1722, -30, 291], [-4988, -28, -1372, 398, -270], [-5857, -886, -217, -435, -349], [-3752, -250, -1322, 201, -593], [-16004, -63, -1730, 379, 198], [24717, 43, 346, 279, 603], [-14183, -2, 440, 145, 282], [3747, -343, 498, -411, -7], [7108, 1082, -1088, -100, 1170], [-161, 272, 899, -687, 931], [15884, -646, -222, 147, 197], [27377, 212, -703, 192, -336], [4111, -338, 446, 984, -451], [17258, -888, -585, 325, -609], [10797, -1299, -634, 293, -873], [-20834, -162, 170, 455, 105], [10703, -932, 450, 50, -30], [-16613, -155, -738, -327, 325], [-31924, -284, -724, -318, -266], [-5447, -528, -1119, 138, -18], [-2668, 970, 1118, -449, 217], [-13709, -438, -1185, 135, -23], [-9567, -350, 1016, -287, 574], [-20617, -950, 1207, 617, -265], [-1083, 615, -630, -865, 815], [-10811, 822, 1518, -447, -261], [-3621, 407, -984, 346, -346], [15413, -1014, 1077, -570, -226], [-9039, -136, -1216, 343, -34], [23760, -318, 614, 207, 153], [9584, 756, 1792, -88, 436], [20441, 332, -207, 278, -326], [13961, 817, 2388, -56, 4], [-29271, -560, -1920, 435, 238], [2709, -548, 279, 700, -892], [-12774, -540, -483, -237, 365], [11603, 207, 3200, -290, -814], [11223, 1694, 823, -985, 193], [19330, -484, 270, 416, -344], [-14011, -55, -194, 384, -282], [-17345, -484, 650, -226, -454], [840, 1180, 1592, 832, 452], [20542, 996, -1023, -39, -109], [-6589, 1252, 1354, -808, 883], [-18848, 511, 98, 307, 72], [24761, -636, 437, 122, -410], [-21100, 1061, 2150, -573, -534], [995, 52, 808, 742, -242], [-1483, 38, 226, -563, -373], [-4551, 316, -1259, -1150, 822], [26539, 68, -332, 306, -578], [12808, -1178, 132, 42, 492], [12241, 380, -417, 738, -810], [-7739, 709, 2576, 242, 890], [-5283, -252, -1771, -190, 86], [13019, 332, 504, 1054, -102], [-30972, 365, -902, -85, -494], [10020, 126, -1766, -855, 295], [17396, -676, 1316, -658, -198], [-14925, 1120, 1824, -623, 542], [-225, 424, -2556, -636, 80], [15163, 764, -1088, -1075, 1266], [-586, -480, -221, 1255, -631], [-2537, 1398, -247, -937, 1641], [17909, -71, -180, 354, 138], [-12525, -1781, -1536, -591, 353], [1831, -167, -68, 686, 492], [-17993, -628, -1730, 282, 390], [6121, -409, 682, -543, 837], [-4947, 338, -1908, -93, -935], [484, -2506, 2136, 112, -1302], [23947, -378, -1037, -169, 905], [3439, 1566, -895, 259, -507], [67827, 269, 584, 728, -878], [26341, -358, -108, -185, 13], [-7708, -926, 2208, 1288, -58], [19119, 774, -1460, -411, 204], [389, 1260, 4787, -162, -294], [-13591, 822, 333, -260, -456], [-9924, -176, 2356, 142, -810], [-1045, 835, 3322, -13, -1199], [13607, 1659, -116, 59, 843], [-4111, -460, -2273, 1098, 118], [49380, 88, -2816, -52, 716], [-31719, 453, -1474, -181, 17], [-22529, -216, 3144, 852, -960], [41191, 1091, -2356, 19, 1083], [-1607, -1299, -2444, -596, -540], [32179, 692, 1215, -945, 677], [-27084, -1834, 1082, 477, -2397], [1343, -1430, 2828, -491, 1100], [-13200, 894, 348, -362, -240], [14313, 1364, 544, 119, 470], [-45848, -332, -1052, -562, 682], [-39877, 73, -584, -264, -1282], [1384, -1006, -514, -25, -63], [21065, 1514, 1198, -1101, 717], [-14855, -2289, -708, 1510, -424], [50080, 1548, 1184, -36, 16], [27557, 694, 1626, 1052, -1261], [17901, -1335, -232, 1249, 397], [-6948, 582, 4072, 56, 370], [38503, 994, 2057, 1215, -471], [13350, 1580, 981, -55, 2051], [25921, -1773, -4554, 721, -163], [49921, -1034, 2781, -224, 196], [19025, -1004, 255, 1052, 52], [25018, -1793, 1276, -396, -1055], [-60676, 1814, 1572, -553, -175], [42715, -1485, -4776, 189, -171], [-29846, -2348, 3518, 528, -1016], [-5490, -1460, -6497, -697, 133], [-14057, -2323, -1906, 1571, -493], [37925, 1626, -1524, -845, 44], [-31275, 1468, 4113, -790, 646], [30988, 1790, -2742, -395, 947], [-33513, 1160, 2111, -783, -1133], [-13125, 2748, 3482, -1468, -341], [19344, -486, 1292, 533, -1181], [-44421, -1340, 408, 1350, -594], [-17271, -410, -3994, -1062, 581], [-29525, -70, -1063, 1281, -705], [-58217, 2922, 2739, -891, -93], [-760, 1668, 3196, -1542, 214], [-17625, -760, -916, 504, -260], [-54505, -1769, 2348, 240, -532], [1157, 3398, -822, -611, 1563], [-3520, -3196, 1616, -376, -1100], [50007, -569, 3266, -1184, 942], [-21097, 2314, -3455, 1249, 111], [-19562, 656, 1597, 1337, 623], [-5881, -1508, 1982, -582, -895], [-12433, -1189, -4580, 280, -1008], [10211, 2163, 1564, -118, 158], [28731, 135, 4370, -713, 969], [-43183, 144, -625, 312, -536], [-4221, 3894, -312, 299, 998], [-19530, 1192, 1290, -1621, 315], [1128, -1306, 2458, 1597, -1173], [-6203, 188, 821, 982, 418], [-7983, -1973, 284, 1974, -468], [37064, -1722, -4473, -108, -952], [46139, -1010, -553, -1011, -1133], [65922, -2423, 20, 274, 1333], [-41561, 1080, -4244, 36, 1872], [64045, -208, -1246, 1054, -1633], [12413, 1008, 1029, -1460, 1804], [19161, 4132, 375, 566, 282], [-53505, -1561, -598, 2173, -1397], [-50565, 162, 8033, 639, -207], [-42500, -1008, -896, -1084, -852], [1757, -3891, -2034, 1464, 234], [-45081, -2932, 1014, 382, -318], [15436, 3622, -2734, -115, 2755], [40800, 2408, -616, -584, 2352], [5455, -1245, 78, 288, -970], [-65825, 1667, 1186, -152, 266], [37176, 2502, -238, -1339, 2067], [71715, -149, 1816, 913, 1881], [41513, -2164, -3923, -1168, -1376], [3807, 3915, 1024, -3448, 2228], [-50600, -2982, 1392, 2257, -297], [2353, -1317, 3992, 74, -2004], [-16208, 4554, -2984, -475, 1547], [-22631, -1614, 193, 2188, -2656], [32025, -371, 3272, -421, 1599], [-51980, -1376, -4476, 2686, -538], [27394, 1580, 3525, 111, -1071], [10027, -508, 4826, -188, -5], [-31879, 2015, 618, -3063, 1853], [1331, -3556, 1632, -1414, -1754], [-10897, -2056, 4007, -363, -1233], [-6161, 3142, -5722, 424, 1333], [36939, -3048, -1794, 2128, -2472], [-25860, -3066, 2928, 791, -1575], [29172, -2274, -5144, -980, 126], [-22065, -132, -3049, -47, 971], [-65172, 1838, 2697, 848, 1512], [482, 1697, -3652, 618, 389], [-57349, -1234, 2890, -1002, -1], [-33935, 5327, -464, -1882, 3580], [644, -522, -7686, -515, 403], [-55555, 1472, 2277, -1556, 1980], [-26267, 520, -6731, 1878, -1830], [76005, 631, -1396, 472, -1810], [-19455, 3778, 384, -2279, 2802], [-74660, 1923, 1066, -2011, 774], [84772, 1680, 104, 8, 464], [5134, -1272, 3100, 1848, 944], [44309, -258, -4374, -395, 179], [42489, -1542, -3458, 2567, -1907], [-5478, 4930, -5006, -485, 2105], [31323, 3706, -2501, -1867, 5027], [-92691, 3042, 3469, -738, 1830], [9869, 2396, -4407, 198, -926], [-48583, 1363, -5804, -958, 1000], [68847, -2134, -4615, 477, -69], [11594, 4177, 1268, -2370, 1257], [12760, 1994, -596, -1403, -509], [32117, -3358, -2684, -1109, -1112], [-74965, -1719, -4374, 1705, -2867], [-62218, 2648, 308, 560, 96], [-29215, 2409, 1176, -1181, 2379], [53030, 572, 7155, -2785, -267], [87919, -1518, 1601, -1125, -515], [16059, 3685, 3250, -1835, 2717], [17739, 1810, -3365, -2361, 969], [-7046, 4312, 1492, -1444, -1260], [-121619, 947, 2326, -841, 207], [-68876, 3288, 1736, -1808, 1344], [82497, 3458, -279, -2520, 1428], [-85833, -1993, 3470, 845, -1177], [29783, -626, 4937, 1933, -1421], [58895, 208, 4784, -1144, -556], [34386, -2058, -7830, -1269, 213], [-63245, -2376, -3334, 2404, -2493], [34752, -2955, -3774, 481, 1136], [21005, 3638, 2538, 561, -2221], [57135, 4218, 1211, -1869, 541], [4486, -2308, -5374, -1597, 95], [-33446, -888, -2277, 9, 91], [-55781, -481, -6324, 597, -1963], [86832, -197, 3254, -281, -376], [-37729, -2207, -7176, 2770, 1668], [101339, 2162, -785, 1225, -1401], [-14909, -301, -1988, -2638, 2430], [17020, -2402, -6594, 2633, -3153], [60113, 1384, 542, 716, 1729], [-11870, -1240, -770, -1031, 1753], [4156, 1074, -518, -657, -1511], [184354, 1580, 319, -311, -465], [67599, -3852, -7593, 1529, -3501], [-9359, 3140, 3267, -56, 2048], [30659, 5768, 2514, -2344, 1984], [-15252, 204, 3284, -1674, -862], [29257, -190, -6502, -2777, 809], [53335, 2784, -5084, -2661, 432], [-28032, 7124, 2248, -2104, 2884], [8377, -399, 2516, -1552, -892], [78065, -2544, 1473, 960, -2280], [-79120, 3048, 180, 1358, -138], [68975, -2575, 8312, -1950, 988], [29309, 3710, -3830, 1009, 959], [-64225, -2714, -45, -1809, -1535], [12206, -1625, -6324, -874, -1309], [89861, 2012, -1332, 1221, 420], [70633, 5281, -5968, -1140, 4468], [8039, 2508, -4189, -2155, 1735], [-3706, 5466, 7454, -1895, -97], [-18039, -4946, -7096, 4621, -213], [-52405, -2628, -1656, 573, -3790], [45015, -3378, -8013, 1405, -2197], [-33843, -440, -305, -1152, -1992], [114570, -1540, 3107, 2201, -3513], [9497, -977, -1998, 3753, -1803], [-136697, -212, -1337, -799, -3061], [-88394, 1640, 6036, -1048, 1608], [-1898, 4286, 1310, 1073, 131], [56465, -180, 1827, -2320, 2376], [105515, 368, 1110, 468, -512], [23653, 4352, -6174, -1146, 3787], [-48899, 1581, -3474, 1544, 586], [-11639, 1810, -578, 851, 1781], [-85987, -5196, -4773, -1198, 214], [-46418, -247, 2060, -528, -3365], [-148989, -3292, 1994, 456, -633], [-3053, 1224, 10015, 2735, -307], [136080, -1966, -4034, 483, -2435], [-88284, -914, 728, 1204, -5258], [20811, -77, 4922, -1917, 3057], [-55042, 2416, 8171, 731, -2771], [-14601, -223, -8212, -2522, 388], [42173, -3536, -8895, -944, 272], [-16652, -4354, -2752, 2655, -231], [43173, 451, -9580, -708, -2498], [-146017, -3554, -2964, 169, 492], [25488, -4298, 1586, 869, 3107], [33311, -4630, -589, 785, -689], [33121, 1774, 9072, -107, 1578], [1384, -7682, 5770, 33, -809], [-15644, -5224, -10264, 880, 1776], [-27453, 1741, 8694, -2587, 2281]];
    aps := ConvertToHeckeField(raw_aps);
    chi := MakeCharacter_648_a_Hecke(Universe(aps));
    return ExtendMultiplicatively(weight, aps, chi);
end function;


// To make the newform (type ModFrm), type "MakeNewformModFrm_648_4_a_l();".
// This may take a long time!  To see verbose output, uncomment the SetVerbose lines below.
// The precision argument determines an initial guess on how many Fourier coefficients to use.
// This guess is increased enough to uniquely determine the newform.
function MakeNewformModFrm_648_4_a_l(:prec:=5)
    chi := MakeCharacter_648_a();
    f_vec := qexpCoeffs();
    Kf := Universe(f_vec);
    // SetVerbose("ModularForms", true);
    // SetVerbose("ModularSymbols", true);
    S := CuspidalSubspace(ModularForms(chi, 4));
    S := BaseChange(S, Kf);
    maxprec := NextPrime(2999) - 1;
    while true do
        trunc_vec := Vector(Kf, [0] cat [f_vec[i]: i in [1..prec]]);
        B := Basis(S, prec + 1);
        S_basismat := Matrix([AbsEltseq(g): g in B]);
        if Rank(S_basismat) eq Min(NumberOfRows(S_basismat), NumberOfColumns(S_basismat)) then
            S_basismat := ChangeRing(S_basismat,Kf);
            f_lincom := Solution(S_basismat,trunc_vec);
            f := &+[f_lincom[i]*Basis(S)[i] : i in [1..#Basis(S)]];
            return f;
        end if;
        error if prec eq maxprec, "Unable to distinguish newform within newspace";
        prec := Min(Ceiling(1.25 * prec), maxprec);
    end while;
end function;


// To make the Hecke irreducible modular symbols subspace (type ModSym)
// containing the newform, type "MakeNewformModSym_648_4_a_l();".
// This may take a long time!  To see verbose output, uncomment the SetVerbose line below.
// The default sign is -1.  You can change this with the optional parameter "sign".
function MakeNewformModSym_648_4_a_l( : sign := -1)
    R<x> := PolynomialRing(Rationals());
    chi := MakeCharacter_648_a();
    // SetVerbose("ModularSymbols", true);
    Snew := NewSubspace(CuspidalSubspace(ModularSymbols(chi,4,sign)));
    Vf := Kernel([<5,R![86528, 36176, 1097, -461, -5, 1]>],Snew);
    return Vf;
end function;