Builds a custom portfolio of US listed ETFs from construction choices about the portfolio, and shows the rule it applied. Two forms. Weights (ETFIQ custom construction rule, version 2): pass weights, the user's own percent for each asset class, adding to exactly 100, for example {"us-stocks": 40, "international-stocks": 15, "us-bonds": 25, "gold": 10, "reits": 10}. The asset classes: us-stocks, us-small-stocks, international-stocks (broad, market-cap-weighted index funds only), international-dividend-stocks, international-esg-stocks, international-factor-stocks, international-ipo-stocks (each only when the user asks for that tilt), emerging-markets-stocks, reits, us-bonds (core, intermediate), us-bonds-short, us-bonds-long, us-corporate-bonds, government-bonds-short, government-bonds-intermediate, government-bonds-long, tips, high-yield-bonds, cash (Treasury bills), gold, commodities (broad), alternatives. Defaults: cheapest funds, one fund per asset class, no fee ceiling; the answer's defaults.line names the ones used. Band (version 1): pass band, include and funds, and the rule sets the weights (stocks at the band's point, international, broad market-cap-weighted funds only, 40% of stocks outside themes, themes 10% of stocks, commodities and alternatives 5% each from bonds, US bonds the rest). In each asset class or sleeve the cheapest (or largest) funds that file N-PORT (a gold trust: its 10-Q or 10-K), hold at least $100 million and have three years of prices, each fund's fee with its filing date. Weights given in words go to the weights form mapped to the ids above. Only two things have no default, and each is refused with its kind: weights that do not add to 100 (kind weights-total) and an asset class with no id here (kind unknown-class). With neither weights nor a band, the tool needs one of them; the bands by stock share are conservative: more than 15% and up to 30% stocks; moderately-conservative: more than 30% and up to 50%; moderate: more than 50% and up to 70%; moderately-aggressive: more than 70% and up to 85%; aggressive: more than 85%. The tool takes nothing about the person: an argument giving their age, income, savings, net worth, goals, time horizon, tax situation, risk tolerance, employment or family is refused (kind person), and weights and bands are the user's choices about the portfolio, not facts about someone. Whether a portfolio suits someone, or whether to buy or sell it, is not something ETFIQ answers, and the not-advice line says so. Its returns field carries the portfolio's hypothetical returns (ETFIQ custom rule, version 3: the weights reset at every month end, as the ETFIQ benchmarks are): total return, return a year, volatility and month-end drawdown over 1Y, 3Y, 5Y, 10Y and since the first month end all its funds share, a window given only where every fund has prices across it; returns.common.sentence says where the history starts and why. They are hypothetical: no window is extended, and no return is estimated beyond the ones given. compare_to_benchmark takes the answer's compare.arguments to set the portfolio beside an ETFIQ benchmark. Every response carries the not-advice line in not_advice, written to be shown with the portfolio.