<!DOCTYPE html>
<html>
<head>
  <meta charset=UTF-8 /><link rel=preconnent href=https://fonts%2egoogleapis%2ecom />
  <link rel=preconnent href=https://fonts%2egstatic%2ecom crossorigin/>
  <link rel=stylesheet href="https://fonts%2egoogleapis%2ecom/css2?family=Fira+Code:wght@300%2e%2e700&family=Noto+Sans:ital,wght@0,100%2e%2e900;1,100%2e%2e900&family=Noto+Serif:ital,wght@0,100%2e%2e900;1,100%2e%2e900&display=swap"/>
  <style>
html {
    --sans-serif-family: "Noto Sans", sans-serif;
    --serif-family: "Noto Serif", serif;
    --monospace-family: "Fira Code", monospace;

    --light-background-color: white;
    --light-deep-background-color: #fafafa;
    --light-text-color: black;
    --light-border-color: #aaa;
    --light-table-border-color: #777;
    --light-del-color: #be1621;
    --light-del-background-color: #fbe6e8;
    --light-ins-color: #17752d;
    --light-ins-background-color: #e4faea;
    --light-para-color: rgb(10, 73, 136);
    --light-a-color: rgb(10, 73, 136);
    --light-a-visited-color: rgb(44, 10, 136);
    --light-a-hover-color: rgb(15, 93, 170);
    --light-mark-color: black;
    --light-mark-background-color: #ffff85;
    --light-abstract-border-color: #707070;
    --light-abstract-background-color: #f0f0f0;
    --light-abstract-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="%23707070"><path d="M660-160h40v-160h-40v160Zm20-200q8 0 14-6t6-14q0-8-6-14t-14-6q-8 0-14 6t-6 14q0 8 6 14t14 6ZM200-800v640-640 200-200Zm80 400h147q11-23 25.5-43t32.5-37H280v80Zm0 160h123q-3-20-3-40t3-40H280v80ZM200-80q-33 0-56.5-23.5T120-160v-640q0-33 23.5-56.5T200-880h320l240 240v92q-19-6-39-9t-41-3v-40H480v-200H200v640h227q11 23 25.5 43T485-80H200Zm480-400q83 0 141.5 58.5T880-280q0 83-58.5 141.5T680-80q-83 0-141.5-58.5T480-280q0-83 58.5-141.5T680-480Z"/></svg>');
    --light-blockquote-border-color: #707070;
    --light-blockquote-background-color: #f0f0f0;
    --light-blockquote-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="%23707070"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M7.17 17c.51 0 .98-.29 1.2-.74l1.42-2.84c.14-.28.21-.58.21-.89V8c0-.55-.45-1-1-1H5c-.55 0-1 .45-1 1v4c0 .55.45 1 1 1h2l-1.03 2.06c-.45.89.2 1.94 1.2 1.94zm10 0c.51 0 .98-.29 1.2-.74l1.42-2.84c.14-.28.21-.58.21-.89V8c0-.55-.45-1-1-1h-4c-.55 0-1 .45-1 1v4c0 .55.45 1 1 1h2l-1.03 2.06c-.45.89.2 1.94 1.2 1.94z"/></svg>');
    --light-bug-block-border-color: #9f7b5d;
    --light-bug-block-background-color: #f0e2d9;
    --light-bug-block-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="%239f7b5d"><path d="M480-120q-64 0-114.5-33T283-240l-95 54-40-69 103-60q-3-11-5-22.5t-4-22.5H120v-80h122q2-12 4-23.5t5-22.5l-103-60 40-69 94 55q8-14 18.5-27.5T322-612q-2-7-2-14v-14q0-24 7-46t19-41l-66-66 56-57 70 68q17-9 35.5-13.5T480-800q20 0 39 5t36 14l69-69 56 57-66 66q12 19 18.5 41t6.5 46v13.5q0 6.5-2 13.5 11 11 21.5 25t18.5 28l95-54 40 69-104 59q3 11 5.5 22.5T718-440h122v80H718q-2 12-4 23.5t-5 22.5l103 60-40 69-95-55q-32 54-82.5 87T480-120Zm-76-546q17-7 36.5-10.5T480-680q20 0 38.5 3t35.5 10q-8-23-28-38t-46-15q-26 0-47 15.5T404-666Zm76 466q73 0 116.5-61T640-400q0-70-40.5-135T480-600q-78 0-119 64.5T320-400q0 78 43.5 139T480-200Zm-40-80v-240h80v240h-80Z"/></svg>');
    --light-decision-block-border-color: #ab6fa2;
    --light-decision-block-background-color: #f4e6f4;
    --light-decision-block-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="%23ab6fa2"><path d="M160-120v-80h480v80H160Zm226-194L160-540l84-86 228 226-86 86Zm254-254L414-796l86-84 226 226-86 86Zm184 408L302-682l56-56 522 522-56 56Z"/></svg>');
    --light-del-block-border-color: #be1621;
    --light-del-block-background-color: #fbe6e8;
    --light-del-block-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="%23be1621"><path d="M280-120q-33 0-56.5-23.5T200-200v-520h-40v-80h200v-40h240v40h200v80h-40v520q0 33-23.5 56.5T680-120H280Zm400-600H280v520h400v-520ZM360-280h80v-360h-80v360Zm160 0h80v-360h-80v360ZM280-720v520-520Z"/></svg>');
    --light-details-border-color: #707070;
    --light-details-background-color: #f0f0f0;
    --light-details-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="%23707070"><path d="M440-280h80v-240h-80v240Zm40-320q17 0 28.5-11.5T520-640q0-17-11.5-28.5T480-680q-17 0-28.5 11.5T440-640q0 17 11.5 28.5T480-600Zm0 520q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z"/></svg>');
    --light-diff-block-border-color: #707070;
    --light-diff-block-background-color: #f0f0f0;
    --light-diff-block-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="%23707070"><path d="M500-520h80v-80h80v-80h-80v-80h-80v80h-80v80h80v80Zm-80 160h240v-80H420v80ZM320-200q-33 0-56.5-23.5T240-280v-560q0-33 23.5-56.5T320-920h280l240 240v400q0 33-23.5 56.5T760-200H320Zm0-80h440v-360L560-840H320v560ZM160-40q-33 0-56.5-23.5T80-120v-560h80v560h440v80H160Zm160-240v-560 560Z"/></svg>');
    --light-example-block-border-color: #6f8aab;
    --light-example-block-background-color: #e6e9f4;
    --light-example-block-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="%236f8aab"><path d="M300-80q-58 0-99-41t-41-99v-520q0-58 41-99t99-41h500v600q-25 0-42.5 17.5T740-220q0 25 17.5 42.5T800-160v80H300Zm-60-267q14-7 29-10t31-3h20v-440h-20q-25 0-42.5 17.5T240-740v393Zm160-13h320v-440H400v440Zm-160 13v-453 453Zm60 187h373q-6-14-9.5-28.5T660-220q0-16 3-31t10-29H300q-26 0-43 17.5T240-220q0 26 17 43t43 17Z"/></svg>');
    --light-important-block-border-color: #b05252;
    --light-important-block-background-color: #f4e6e6;
    --light-important-block-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="%23ab6f6f"><path d="M480-120q-33 0-56.5-23.5T400-200q0-33 23.5-56.5T480-280q33 0 56.5 23.5T560-200q0 33-23.5 56.5T480-120Zm-80-240v-480h160v480H400Z"/></svg>');
    --light-ins-block-border-color: #17752d;
    --light-ins-block-background-color: #e4faea;
    --light-ins-block-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="%2317752d"><path d="M440-240h80v-120h120v-80H520v-120h-80v120H320v80h120v120ZM240-80q-33 0-56.5-23.5T160-160v-640q0-33 23.5-56.5T240-880h320l240 240v480q0 33-23.5 56.5T720-80H240Zm280-520v-200H240v640h480v-440H520ZM240-800v200-200 640-640Z"/></svg>');
    --light-note-block-border-color: #6fab6f;
    --light-note-block-background-color: #e6f4e9;
    --light-note-block-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="%236fab6f"><path d="M440-280h80v-240h-80v240Zm40-320q17 0 28.5-11.5T520-640q0-17-11.5-28.5T480-680q-17 0-28.5 11.5T440-640q0 17 11.5 28.5T480-600Zm0 520q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z"/></svg>');
    --light-tip-block-border-color: #b0a029;
    --light-tip-block-background-color: #f4f4e6;
    --light-tip-block-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="%23b0a029"><path d="M480-80q-33 0-56.5-23.5T400-160h160q0 33-23.5 56.5T480-80ZM320-200v-80h320v80H320Zm10-120q-69-41-109.5-110T180-580q0-125 87.5-212.5T480-880q125 0 212.5 87.5T780-580q0 81-40.5 150T630-320H330Zm24-80h252q45-32 69.5-79T700-580q0-92-64-156t-156-64q-92 0-156 64t-64 156q0 54 24.5 101t69.5 79Zm126 0Z"/></svg>');
    --light-todo-block-border-color: #6faba0;
    --light-todo-block-background-color: #e6f4f3;
    --light-todo-block-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="%236faba0"><path d="M680-80q-83 0-141.5-58.5T480-280q0-83 58.5-141.5T680-480q83 0 141.5 58.5T880-280q0 83-58.5 141.5T680-80Zm67-105 28-28-75-75v-112h-40v128l87 87Zm-547 65q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h167q11-35 43-57.5t70-22.5q40 0 71.5 22.5T594-840h166q33 0 56.5 23.5T840-760v250q-18-13-38-22t-42-16v-212h-80v120H280v-120h-80v560h212q7 22 16 42t22 38H200Zm280-640q17 0 28.5-11.5T520-800q0-17-11.5-28.5T480-840q-17 0-28.5 11.5T440-800q0 17 11.5 28.5T480-760Z"/></svg>');
    --light-warning-block-border-color: #af8141;
    --light-warning-block-background-color: #f4eee6;
    --light-warning-block-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="%23af8141"><path d="M109-120q-11 0-20-5.5T75-140q-5-9-5.5-19.5T75-180l370-640q6-10 15.5-15t19.5-5q10 0 19.5 5t15.5 15l370 640q6 10 5.5 20.5T885-140q-5 9-14 14.5t-20 5.5H109Zm69-80h604L480-720 178-200Zm302-40q17 0 28.5-11.5T520-280q0-17-11.5-28.5T480-320q-17 0-28.5 11.5T440-280q0 17 11.5 28.5T480-240Zm0-120q17 0 28.5-11.5T520-400v-120q0-17-11.5-28.5T480-560q-17 0-28.5 11.5T440-520v120q0 17 11.5 28.5T480-360Zm0-100Z"/></svg>');
    --light-theme-icon: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="black"><path d="M480-360q50 0 85-35t35-85q0-50-35-85t-85-35q-50 0-85 35t-35 85q0 50 35 85t85 35Zm0 80q-83 0-141.5-58.5T280-480q0-83 58.5-141.5T480-680q83 0 141.5 58.5T680-480q0 83-58.5 141.5T480-280ZM200-440H40v-80h160v80Zm720 0H760v-80h160v80ZM440-760v-160h80v160h-80Zm0 720v-160h80v160h-80ZM256-650l-101-97 57-59 96 100-52 56Zm492 496-97-101 53-55 101 97-57 59Zm-98-550 97-101 59 57-100 96-56-52ZM154-212l101-97 55 53-97 101-59-57Zm326-268Z"/></svg>');

    --dark-background-color: #202020;
    --dark-deep-background-color: #1a1a1a;
    --dark-text-color: #f0f0f0;
    --dark-border-color: #505050;
    --dark-table-border-color: #777;
    --dark-del-background-color: #67060c;
    --dark-del-color: #ffdcd7;
    --dark-ins-background-color: #033a16;
    --dark-ins-color: #aff5b4;
    --dark-para-color: #5bc0ff;
    --dark-a-color: #5bc0ff;
    --dark-a-visited-color: #c6a8ff;
    --dark-a-hover-color: #afd7ff;
    --dark-mark-color: #ededa8;
    --dark-mark-background-color: #525230;
    --dark-abstract-border-color: #999999;
    --dark-abstract-background-color: #2c2c2c;
    --dark-abstract-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="%23999999"><path d="M660-160h40v-160h-40v160Zm20-200q8 0 14-6t6-14q0-8-6-14t-14-6q-8 0-14 6t-6 14q0 8 6 14t14 6ZM200-800v640-640 200-200Zm80 400h147q11-23 25.5-43t32.5-37H280v80Zm0 160h123q-3-20-3-40t3-40H280v80ZM200-80q-33 0-56.5-23.5T120-160v-640q0-33 23.5-56.5T200-880h320l240 240v92q-19-6-39-9t-41-3v-40H480v-200H200v640h227q11 23 25.5 43T485-80H200Zm480-400q83 0 141.5 58.5T880-280q0 83-58.5 141.5T680-80q-83 0-141.5-58.5T480-280q0-83 58.5-141.5T680-480Z"/></svg>');
    --dark-blockquote-border-color: #707070;
    --dark-blockquote-background-color: #2c2c2c;
    --dark-blockquote-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="%23707070"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M7.17 17c.51 0 .98-.29 1.2-.74l1.42-2.84c.14-.28.21-.58.21-.89V8c0-.55-.45-1-1-1H5c-.55 0-1 .45-1 1v4c0 .55.45 1 1 1h2l-1.03 2.06c-.45.89.2 1.94 1.2 1.94zm10 0c.51 0 .98-.29 1.2-.74l1.42-2.84c.14-.28.21-.58.21-.89V8c0-.55-.45-1-1-1h-4c-.55 0-1 .45-1 1v4c0 .55.45 1 1 1h2l-1.03 2.06c-.45.89.2 1.94 1.2 1.94z"/></svg>');
    --dark-bug-block-border-color: #ab866f;
    --dark-bug-block-background-color: #373028;
    --dark-bug-block-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="%23ab866f"><path d="M480-120q-64 0-114.5-33T283-240l-95 54-40-69 103-60q-3-11-5-22.5t-4-22.5H120v-80h122q2-12 4-23.5t5-22.5l-103-60 40-69 94 55q8-14 18.5-27.5T322-612q-2-7-2-14v-14q0-24 7-46t19-41l-66-66 56-57 70 68q17-9 35.5-13.5T480-800q20 0 39 5t36 14l69-69 56 57-66 66q12 19 18.5 41t6.5 46v13.5q0 6.5-2 13.5 11 11 21.5 25t18.5 28l95-54 40 69-104 59q3 11 5.5 22.5T718-440h122v80H718q-2 12-4 23.5t-5 22.5l103 60-40 69-95-55q-32 54-82.5 87T480-120Zm-76-546q17-7 36.5-10.5T480-680q20 0 38.5 3t35.5 10q-8-23-28-38t-46-15q-26 0-47 15.5T404-666Zm76 466q73 0 116.5-61T640-400q0-70-40.5-135T480-600q-78 0-119 64.5T320-400q0 78 43.5 139T480-200Zm-40-80v-240h80v240h-80Z"/></svg>');
    --dark-details-border-color: #707070;
    --dark-details-background-color: #2c2c2c;
    --dark-details-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="%23707070"><path d="M440-280h80v-240h-80v240Zm40-320q17 0 28.5-11.5T520-640q0-17-11.5-28.5T480-680q-17 0-28.5 11.5T440-640q0 17 11.5 28.5T480-600Zm0 520q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z"/></svg>');
    --dark-decision-block-border-color: #ab6fa2;
    --dark-decision-block-background-color: #30232d;
    --dark-decision-block-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="%23ab6fa2"><path d="M160-120v-80h480v80H160Zm226-194L160-540l84-86 228 226-86 86Zm254-254L414-796l86-84 226 226-86 86Zm184 408L302-682l56-56 522 522-56 56Z"/></svg>');
    --dark-del-block-border-color: #be5e64;
    --dark-del-block-background-color: #302323;
    --dark-del-block-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="%23be5e64"><path d="M280-120q-33 0-56.5-23.5T200-200v-520h-40v-80h200v-40h240v40h200v80h-40v520q0 33-23.5 56.5T680-120H280Zm400-600H280v520h400v-520ZM360-280h80v-360h-80v360Zm160 0h80v-360h-80v360ZM280-720v520-520Z"/></svg>');
    --dark-diff-block-border-color: #707070;
    --dark-diff-block-background-color: #2c2c2c;
    --dark-diff-block-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="%23707070"><path d="M500-520h80v-80h80v-80h-80v-80h-80v80h-80v80h80v80Zm-80 160h240v-80H420v80ZM320-200q-33 0-56.5-23.5T240-280v-560q0-33 23.5-56.5T320-920h280l240 240v400q0 33-23.5 56.5T760-200H320Zm0-80h440v-360L560-840H320v560ZM160-40q-33 0-56.5-23.5T80-120v-560h80v560h440v80H160Zm160-240v-560 560Z"/></svg>');
    --dark-example-block-border-color: #6f81ab;
    --dark-example-block-background-color: #232630;
    --dark-example-block-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="%236f81ab"><path d="M300-80q-58 0-99-41t-41-99v-520q0-58 41-99t99-41h500v600q-25 0-42.5 17.5T740-220q0 25 17.5 42.5T800-160v80H300Zm-60-267q14-7 29-10t31-3h20v-440h-20q-25 0-42.5 17.5T240-740v393Zm160-13h320v-440H400v440Zm-160 13v-453 453Zm60 187h373q-6-14-9.5-28.5T660-220q0-16 3-31t10-29H300q-26 0-43 17.5T240-220q0 26 17 43t43 17Z"/></svg>');
    --dark-important-block-border-color: #b06262;
    --dark-important-block-background-color: #302323;
    --dark-important-block-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="%23b06262"><path d="M480-120q-33 0-56.5-23.5T400-200q0-33 23.5-56.5T480-280q33 0 56.5 23.5T560-200q0 33-23.5 56.5T480-120Zm-80-240v-480h160v480H400Z"/></svg>');
    --dark-ins-block-border-color: #5bab6d;
    --dark-ins-block-background-color: #233023;
    --dark-ins-block-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="%235bab6d"><path d="M440-240h80v-120h120v-80H520v-120h-80v120H320v80h120v120ZM240-80q-33 0-56.5-23.5T160-160v-640q0-33 23.5-56.5T240-880h320l240 240v480q0 33-23.5 56.5T720-80H240Zm280-520v-200H240v640h480v-440H520ZM240-800v200-200 640-640Z"/></svg>');
    --dark-note-block-border-color: #6fab76;
    --dark-note-block-background-color: #233025;
    --dark-note-block-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="%236fab76"><path d="M440-280h80v-240h-80v240Zm40-320q17 0 28.5-11.5T520-640q0-17-11.5-28.5T480-680q-17 0-28.5 11.5T440-640q0 17 11.5 28.5T480-600Zm0 520q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z"/></svg>');
    --dark-tip-block-border-color: #a2ab6f;
    --dark-tip-block-background-color: #2f3023;
    --dark-tip-block-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="%23a2ab6f"><path d="M480-80q-33 0-56.5-23.5T400-160h160q0 33-23.5 56.5T480-80ZM320-200v-80h320v80H320Zm10-120q-69-41-109.5-110T180-580q0-125 87.5-212.5T480-880q125 0 212.5 87.5T780-580q0 81-40.5 150T630-320H330Zm24-80h252q45-32 69.5-79T700-580q0-92-64-156t-156-64q-92 0-156 64t-64 156q0 54 24.5 101t69.5 79Zm126 0Z"/></svg>');
    --dark-todo-block-border-color: #6fab98;
    --dark-todo-block-background-color: #23302e;
    --dark-todo-block-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="%236fab98"><path d="M680-80q-83 0-141.5-58.5T480-280q0-83 58.5-141.5T680-480q83 0 141.5 58.5T880-280q0 83-58.5 141.5T680-80Zm67-105 28-28-75-75v-112h-40v128l87 87Zm-547 65q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h167q11-35 43-57.5t70-22.5q40 0 71.5 22.5T594-840h166q33 0 56.5 23.5T840-760v250q-18-13-38-22t-42-16v-212h-80v120H280v-120h-80v560h212q7 22 16 42t22 38H200Zm280-640q17 0 28.5-11.5T520-800q0-17-11.5-28.5T480-840q-17 0-28.5 11.5T440-800q0 17 11.5 28.5T480-760Z"/></svg>');
    --dark-warning-block-border-color: #ab9c6f;
    --dark-warning-block-background-color: #302b23;
    --dark-warning-block-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="%23ab9c6f"><path d="M109-120q-11 0-20-5.5T75-140q-5-9-5.5-19.5T75-180l370-640q6-10 15.5-15t19.5-5q10 0 19.5 5t15.5 15l370 640q6 10 5.5 20.5T885-140q-5 9-14 14.5t-20 5.5H109Zm69-80h604L480-720 178-200Zm302-40q17 0 28.5-11.5T520-280q0-17-11.5-28.5T480-320q-17 0-28.5 11.5T440-280q0 17 11.5 28.5T480-240Zm0-120q17 0 28.5-11.5T520-400v-120q0-17-11.5-28.5T480-560q-17 0-28.5 11.5T440-520v120q0 17 11.5 28.5T480-360Zm0-100Z"/></svg>');
    --dark-theme-icon: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="%23f0f0f0"><path d="M480-120q-150 0-255-105T120-480q0-150 105-255t255-105q14 0 27.5 1t26.5 3q-41 29-65.5 75.5T444-660q0 90 63 153t153 63q55 0 101-24.5t75-65.5q2 13 3 26.5t1 27.5q0 150-105 255T480-120Zm0-80q88 0 158-48.5T740-375q-20 5-40 8t-40 3q-123 0-209.5-86.5T364-660q0-20 3-40t8-40q-78 32-126.5 102T200-480q0 116 82 198t198 82Zm-10-270Z"/></svg>');

    --indent: 2.5em;
    --border-radius: 0.25em;
}

/* BEGIN LIGHT AND DARK THEME */

@media (prefers-color-scheme: light) {
    html {
        --background-color: var(--light-background-color);
        --deep-background-color: var(--light-deep-background-color);
        --text-color: var(--light-text-color);
        --border-color: var(--light-border-color);
        --table-border-color: var(--light-table-border-color);
        --del-color: var(--light-del-color);
        --del-background-color: var(--light-del-background-color);
        --ins-color: var(--light-ins-color);
        --ins-background-color: var(--light-ins-background-color);
        --para-color: var(--light-para-color);
        --a-color: var(--light-a-color);
        --a-visited-color: var(--light-a-visited-color);
        --a-hover-color: var(--light-a-hover-color);
        --mark-color: var(--light-mark-color);
        --mark-background-color: var(--light-mark-background-color);
        --abstract-border-color: var(--light-abstract-border-color);
        --abstract-background-color: var(--light-abstract-background-color);
        --abstract-image: var(--light-abstract-image);
        --blockquote-border-color: var(--light-blockquote-border-color);
        --blockquote-background-color: var(--light-blockquote-background-color);
        --blockquote-image: var(--light-blockquote-image);
        --bug-block-border-color: var(--light-bug-block-border-color);
        --bug-block-background-color: var(--light-bug-block-background-color);
        --bug-block-image: var(--light-bug-block-image);
        --decision-block-border-color: var(--light-decision-block-border-color);
        --decision-block-background-color: var(--light-decision-block-background-color);
        --decision-block-image: var(--light-decision-block-image);
        --del-block-border-color: var(--light-del-block-border-color);
        --del-block-background-color: var(--light-del-block-background-color);
        --del-block-image: var(--light-del-block-image);
        --details-border-color: var(--light-details-border-color);
        --details-background-color: var(--light-details-background-color);
        --details-image: var(--light-details-image);
        --diff-block-border-color: var(--light-diff-block-border-color);
        --diff-block-background-color: var(--light-diff-block-background-color);
        --diff-block-image: var(--light-diff-block-image);
        --example-block-border-color: var(--light-example-block-border-color);
        --example-block-background-color: var(--light-example-block-background-color);
        --example-block-image: var(--light-example-block-image);
        --important-block-border-color: var(--light-important-block-border-color);
        --important-block-background-color: var(--light-important-block-background-color);
        --important-block-image: var(--light-important-block-image);
        --ins-block-border-color: var(--light-ins-block-border-color);
        --ins-block-background-color: var(--light-ins-block-background-color);
        --ins-block-image: var(--light-ins-block-image);
        --note-block-border-color: var(--light-note-block-border-color);
        --note-block-background-color: var(--light-note-block-background-color);
        --note-block-image: var(--light-note-block-image);
        --tip-block-border-color: var(--light-tip-block-border-color);
        --tip-block-background-color: var(--light-tip-block-background-color);
        --tip-block-image: var(--light-tip-block-image);
        --todo-block-border-color: var(--light-todo-block-border-color);
        --todo-block-background-color: var(--light-todo-block-background-color);
        --todo-block-image: var(--light-todo-block-image);
        --warning-block-border-color: var(--light-warning-block-border-color);
        --warning-block-background-color: var(--light-warning-block-background-color);
        --warning-block-image: var(--light-warning-block-image);
        --theme-icon: var(--light-theme-icon);
    }
}

@media (prefers-color-scheme: dark) {
    html {
        --background-color: var(--dark-background-color);
        --deep-background-color: var(--dark-deep-background-color);
        --text-color: var(--dark-text-color);
        --border-color: var(--dark-border-color);
        --table-border-color: var(--dark-table-border-color);
        --del-color: var(--dark-del-color);
        --del-background-color: var(--dark-del-background-color);
        --ins-color: var(--dark-ins-color);
        --ins-background-color: var(--dark-ins-background-color);
        --para-color: var(--dark-para-color);
        --a-color: var(--dark-a-color);
        --a-visited-color: var(--dark-a-visited-color);
        --a-hover-color: var(--dark-a-hover-color);
        --mark-color: var(--dark-mark-color);
        --mark-background-color: var(--dark-mark-background-color);
        --abstract-border-color: var(--dark-abstract-border-color);
        --abstract-background-color: var(--dark-abstract-background-color);
        --abstract-image: var(--dark-abstract-image);
        --blockquote-border-color: var(--dark-blockquote-border-color);
        --blockquote-background-color: var(--dark-blockquote-background-color);
        --blockquote-image: var(--dark-blockquote-image);
        --bug-block-border-color: var(--dark-bug-block-border-color);
        --bug-block-background-color: var(--dark-bug-block-background-color);
        --bug-block-image: var(--dark-bug-block-image);
        --decision-block-border-color: var(--dark-decision-block-border-color);
        --decision-block-background-color: var(--dark-decision-block-background-color);
        --decision-block-image: var(--dark-decision-block-image);
        --del-block-border-color: var(--dark-del-block-border-color);
        --del-block-background-color: var(--dark-del-block-background-color);
        --del-block-image: var(--dark-del-block-image);
        --details-border-color: var(--dark-details-border-color);
        --details-background-color: var(--dark-details-background-color);
        --details-image: var(--dark-details-image);
        --diff-block-border-color: var(--dark-diff-block-border-color);
        --diff-block-background-color: var(--dark-diff-block-background-color);
        --diff-block-image: var(--dark-diff-block-image);
        --example-block-border-color: var(--dark-example-block-border-color);
        --example-block-background-color: var(--dark-example-block-background-color);
        --example-block-image: var(--dark-example-block-image);
        --important-block-border-color: var(--dark-important-block-border-color);
        --important-block-background-color: var(--dark-important-block-background-color);
        --important-block-image: var(--dark-important-block-image);
        --ins-block-border-color: var(--dark-ins-block-border-color);
        --ins-block-background-color: var(--dark-ins-block-background-color);
        --ins-block-image: var(--dark-ins-block-image);
        --note-block-border-color: var(--dark-note-block-border-color);
        --note-block-background-color: var(--dark-note-block-background-color);
        --note-block-image: var(--dark-note-block-image);
        --tip-block-border-color: var(--dark-tip-block-border-color);
        --tip-block-background-color: var(--dark-tip-block-background-color);
        --tip-block-image: var(--dark-tip-block-image);
        --todo-block-border-color: var(--dark-todo-block-border-color);
        --todo-block-background-color: var(--dark-todo-block-background-color);
        --todo-block-image: var(--dark-todo-block-image);
        --warning-block-border-color: var(--dark-warning-block-border-color);
        --warning-block-background-color: var(--dark-warning-block-background-color);
        --warning-block-image: var(--dark-warning-block-image);
        --theme-icon: var(--dark-theme-icon);
    }
}

html.light {
    --background-color: var(--light-background-color);
    --deep-background-color: var(--light-deep-background-color);
    --text-color: var(--light-text-color);
    --border-color: var(--light-border-color);
    --table-border-color: var(--light-table-border-color);
    --del-color: var(--light-del-color);
    --del-background-color: var(--light-del-background-color);
    --ins-color: var(--light-ins-color);
    --ins-background-color: var(--light-ins-background-color);
    --para-color: var(--light-para-color);
    --a-color: var(--light-a-color);
    --a-visited-color: var(--light-a-visited-color);
    --a-hover-color: var(--light-a-hover-color);
    --mark-color: var(--light-mark-color);
    --mark-background-color: var(--light-mark-background-color);
    --abstract-border-color: var(--light-abstract-border-color);
    --abstract-background-color: var(--light-abstract-background-color);
    --abstract-image: var(--light-abstract-image);
    --blockquote-border-color: var(--light-blockquote-border-color);
    --blockquote-background-color: var(--light-blockquote-background-color);
    --blockquote-image: var(--light-blockquote-image);
    --bug-block-border-color: var(--light-bug-block-border-color);
    --bug-block-background-color: var(--light-bug-block-background-color);
    --bug-block-image: var(--light-bug-block-image);
    --decision-block-border-color: var(--light-decision-block-border-color);
    --decision-block-background-color: var(--light-decision-block-background-color);
    --decision-block-image: var(--light-decision-block-image);
    --del-block-border-color: var(--light-del-block-border-color);
    --del-block-background-color: var(--light-del-block-background-color);
    --del-block-image: var(--light-del-block-image);
    --details-border-color: var(--light-details-border-color);
    --details-background-color: var(--light-details-background-color);
    --details-image: var(--light-details-image);
    --diff-block-border-color: var(--light-diff-block-border-color);
    --diff-block-background-color: var(--light-diff-block-background-color);
    --diff-block-image: var(--light-diff-block-image);
    --example-block-border-color: var(--light-example-block-border-color);
    --example-block-background-color: var(--light-example-block-background-color);
    --example-block-image: var(--light-example-block-image);
    --important-block-border-color: var(--light-important-block-border-color);
    --important-block-background-color: var(--light-important-block-background-color);
    --important-block-image: var(--light-important-block-image);
    --ins-block-border-color: var(--light-ins-block-border-color);
    --ins-block-background-color: var(--light-ins-block-background-color);
    --ins-block-image: var(--light-ins-block-image);
    --note-block-border-color: var(--light-note-block-border-color);
    --note-block-background-color: var(--light-note-block-background-color);
    --note-block-image: var(--light-note-block-image);
    --tip-block-border-color: var(--light-tip-block-border-color);
    --tip-block-background-color: var(--light-tip-block-background-color);
    --tip-block-image: var(--light-tip-block-image);
    --todo-block-border-color: var(--light-todo-block-border-color);
    --todo-block-background-color: var(--light-todo-block-background-color);
    --todo-block-image: var(--light-todo-block-image);
    --warning-block-border-color: var(--light-warning-block-border-color);
    --warning-block-background-color: var(--light-warning-block-background-color);
    --warning-block-image: var(--light-warning-block-image);
    --theme-icon: var(--light-theme-icon);
}

html.dark {
    --background-color: var(--dark-background-color);
    --deep-background-color: var(--dark-deep-background-color);
    --text-color: var(--dark-text-color);
    --border-color: var(--dark-border-color);
    --table-border-color: var(--dark-table-border-color);
    --del-color: var(--dark-del-color);
    --del-background-color: var(--dark-del-background-color);
    --ins-color: var(--dark-ins-color);
    --ins-background-color: var(--dark-ins-background-color);
    --para-color: var(--dark-para-color);
    --a-color: var(--dark-a-color);
    --a-visited-color: var(--dark-a-visited-color);
    --a-hover-color: var(--dark-a-hover-color);
    --mark-color: var(--dark-mark-color);
    --mark-background-color: var(--dark-mark-background-color);
    --abstract-border-color: var(--dark-abstract-border-color);
    --abstract-background-color: var(--dark-abstract-background-color);
    --abstract-image: var(--dark-abstract-image);
    --blockquote-border-color: var(--dark-blockquote-border-color);
    --blockquote-background-color: var(--dark-blockquote-background-color);
    --blockquote-image: var(--dark-blockquote-image);
    --bug-block-border-color: var(--dark-bug-block-border-color);
    --bug-block-background-color: var(--dark-bug-block-background-color);
    --bug-block-image: var(--dark-bug-block-image);
    --decision-block-border-color: var(--dark-decision-block-border-color);
    --decision-block-background-color: var(--dark-decision-block-background-color);
    --decision-block-image: var(--dark-decision-block-image);
    --del-block-border-color: var(--dark-del-block-border-color);
    --del-block-background-color: var(--dark-del-block-background-color);
    --del-block-image: var(--dark-del-block-image);
    --details-border-color: var(--dark-details-border-color);
    --details-background-color: var(--dark-details-background-color);
    --details-image: var(--dark-details-image);
    --diff-block-border-color: var(--dark-diff-block-border-color);
    --diff-block-background-color: var(--dark-diff-block-background-color);
    --diff-block-image: var(--dark-diff-block-image);
    --example-block-border-color: var(--dark-example-block-border-color);
    --example-block-background-color: var(--dark-example-block-background-color);
    --example-block-image: var(--dark-example-block-image);
    --important-block-border-color: var(--dark-important-block-border-color);
    --important-block-background-color: var(--dark-important-block-background-color);
    --important-block-image: var(--dark-important-block-image);
    --ins-block-border-color: var(--dark-ins-block-border-color);
    --ins-block-background-color: var(--dark-ins-block-background-color);
    --ins-block-image: var(--dark-ins-block-image);
    --note-block-border-color: var(--dark-note-block-border-color);
    --note-block-background-color: var(--dark-note-block-background-color);
    --note-block-image: var(--dark-note-block-image);
    --tip-block-border-color: var(--dark-tip-block-border-color);
    --tip-block-background-color: var(--dark-tip-block-background-color);
    --tip-block-image: var(--dark-tip-block-image);
    --todo-block-border-color: var(--dark-todo-block-border-color);
    --todo-block-background-color: var(--dark-todo-block-background-color);
    --todo-block-image: var(--dark-todo-block-image);
    --warning-block-border-color: var(--dark-warning-block-border-color);
    --warning-block-background-color: var(--dark-warning-block-background-color);
    --warning-block-image: var(--dark-warning-block-image);
    --theme-icon: var(--dark-theme-icon);
}

/* END LIGHT AND DARK THEME */

html {
    margin: 0;
    width: 100%;
    font-family: var(--serif-family);
    font-size: 11pt;

    border-left: var(--border-thickness) solid var(--border-color);
    color: var(--text-color);
    background-color: var(--background-color);
}

body {
    --vertical-margin: 2rem;
    --margin-left: 3rem;
    --margin-right: 2rem;

    margin: var(--vertical-margin) var(--margin-right) var(--vertical-margin) var(--margin-left);
    width: calc(100% - var(--margin-left) - var(--margin-right));
    box-sizing: border-box;
}

main {
    max-width: 60rem;
    margin-left: auto;
    margin-right: auto;
}

abstract-block,
blockquote,
bug-block,
code-block,
decision-block,
del-block,
details,
dl,
diff-block,
example-block,
hr,
ol,
important-block,
ins-block,
math[display=block],
note-block,
p,
pre,
samp,
tip-block,
todo-block,
ul,
warning-block,
.indent {
    display: block;
    margin-top: 1em;
    margin-bottom: 1em;
}

a {
    color: var(--a-color);
    text-decoration: unset;
}

a:visited {
    color: var(--a-visited-color);
}

a:hover,
a:focus {
    color: var(--a-hover-color);
}

a:hover {
    text-decoration: underline;
}

ol,
ul {
    padding-left: var(--indent);
}

li {
    margin: 0.5em 0;
}

dt {
    margin-top: 0.25em;
    font-style: italic;
    font-weight: bold;
}

dd {
    margin-bottom: 0.25em;
    margin-left: var(--indent);
}

abstract-block,
blockquote,
bug-block,
del-block,
details,
decision-block,
diff-block,
example-block,
important-block,
ins-block,
note-block,
tip-block,
todo-block,
warning-block {
    --border-thickness: 0.25em;
    --padding: 0.5em;

    position: relative;
    width: calc(100% - var(--indent));
    box-sizing: border-box;
    padding: var(--padding);
    margin-left: var(--indent);

    border-top-right-radius: var(--border-radius);
    border-bottom-right-radius: var(--border-radius);
}

abstract-block>:first-child,
blockquote>:first-child,
bug-block>:first-child,
del-block>:first-child,
details>:first-child,
decision-block>:first-child,
diff-block>:first-child,
example-block>:first-child,
important-block>:first-child,
ins-block>:first-child,
note-block>:first-child,
tip-block>:first-child,
todo-block>:first-child,
warning-block>:first-child {
    margin-top: 0;
}

abstract-block>:last-child,
blockquote>:last-child,
bug-block>:last-child,
del-block>:last-child,
details>:last-child,
decision-block>:last-child,
diff-block>:last-child,
example-block>:last-child,
important-block>:last-child,
ins-block>:last-child,
note-block>:last-child,
todo-block>:last-child,
tip-block>:last-child,
warning-block>:last-child {
    margin-bottom: 0;
}

abstract-block::before,
blockquote::before,
bug-block::before,
del-block::before,
details::before,
decision-block::before,
diff-block::before,
example-block::before,
important-block::before,
ins-block::before,
note-block::before,
todo-block::before,
tip-block::before,
warning-block::before {
    position: absolute;
    left: -2.5em;
    top: 0.25em;
    width: 2em;
    height: 2em;

    content: "";
    display: inline-block;
    background-size: contain;
    background-repeat: no-repeat;

}

code,
code-block,
pre,
tt,
tt-,
.mono {
    font-family: var(--monospace-family);
    font-style: normal;
    font-variant-ligatures: none;
}

code-block:not(.borderless) {
    padding: 0.5em;
    border-radius: var(--border-radius);
    box-sizing: border-box;

    background-color: var(--deep-background-color);
    border: 1px solid var(--border-color);
}

code-block,
pre,
samp {
    font-size: 95%;
    width: 100%;
}

code-block,
pre,
samp {
    white-space: pre;
    overflow-x: auto;
}

/* INSERTIONS AND DELETIONS */

ins,
ins-lines {
    text-decoration: underline;
    font-weight: 600;
    color: var(--ins-color);
    background-color: var(--ins-background-color);
}

code-block ins,
code-block ins-lines {
    text-decoration: inherit;
}

del {
    text-decoration: line-through;
}

del,
del-lines {
    color: var(--del-color);
    background-color: var(--del-background-color);
}

ins-lines,
del-lines {
    display: inline-block;
    width: 100%;
}

ins h-,
ins-lines h-,
del h-,
del-lines h- {
    color: inherit !important;
    background-color: inherit !important;
}

kbd {
    font-family: var(--sans-serif-family);

    display: inline-block;
    padding: 0 0.25em 0.15em 0.25em;
    border-radius: 0.25em;
    white-space: nowrap;

    background-color: var(--deep-background-color);
    border: 1px solid var(--border-color);
    box-shadow: inset 0 -0.1em 0 var(--border-color);
}

mark {
    color: var(--mark-color);
    background-color: var(--mark-background-color);
}

math:not([display=block]) {
    font-size: 120%;
}

math[display=block] {
    width: fit-content;
    margin-left: var(--indent);

    font-size: 110%;
}

g-term,
f-sans,
f-serif,
wg21-block {
    display: inline;
}

f-sans,
.sans {
    font-family: var(--sans-serif-family);
}

f-serif,
.serif {
    font-family: var(--serif-family);
}

.grammar dd,
g-term {
    font-family: var(--sans-serif-family);
    font-style: oblique;
}

.grammar {
    margin-left: var(--indent);
}

.grammar dt {
    font-weight: normal;
    font-style: normal;
}

.wg21-head {
    margin-bottom: 4em;
}

.wg21-head dl {
    font-family: var(--sans-serif-family);
}

.wg21-head dt {
    font-style: normal;
}

/* HEADINGS */

h1,
h2,
h3,
h4,
h5,
h6 {
    position: relative;
    margin: 1rem 0;
}

h1 {
    margin: 2rem 0 1.5rem 0;
    font-size: 250%;
}

h2 {
    margin: 2.5rem 0 1.5rem 0;
    font-size: 166%;
}

h3 {
    margin: 2rem 0 1rem 0;
    font-size: 133%;
}

h4 {
    margin: 1.5rem 0 0.5rem 0;
    font-size: 100%;
}

h5 {
    margin: 1rem 0 0.5rem 0;
    font-size: 100%;
    font-weight: normal;
}

h6 {
    margin: 1rem 0 0.5rem 0;
    font-size: 90%;
    font-weight: normal;
}

table {
    --border: 1px solid var(--table-border-color);

    margin-top: 1em;
    margin-bottom: 1em;
    border-collapse: collapse;
}

table,
tbody,
thead,
th {
    border: var(--border);
}

td {
    border-left: var(--border);
    border-right: var(--border);
}

td,
th {
    padding: 0.1em 0.5em;
}

.para {
    cursor: pointer;
    font-weight: normal;
    font-family: var(--monospace-family);
    text-decoration: none;
    opacity: 0.25;

    position: absolute;
    top: 0.05em;
    left: calc(-1rem - 0.5ch);
}

.para,
.para::before {
    color: var(--para-color);
}

.para:hover,
.para:focus,
:target .para {
    opacity: 1;
}

.para::before {
    content: "§";
}

/* TABLE OF CONTENTS */

.toc {
    --h-indent: 0.75em;

    display: grid;
    grid-template-columns: min-content auto;
}

.toc-num {
    display: inline-block;
    align-self: end;
    padding-right: 3em;

    letter-spacing: 0em;
}

.toc h1,
.toc h2,
.toc h3,
.toc h4,
.toc h5,
.toc h6 {
    display: inline-block;

    font-weight: 500;
    font-size: 12pt;

    margin-top: 0;
    margin-bottom: 0;
}

.toc a,
.toc-num {
    border-bottom: 1px solid rgba(0, 0, 0, 0);
    color: var(--text-color);
}

.toc h1,
.toc-num[data-level="1"] {
    font-size: 125%;
    font-weight: 900;
}

.toc h2,
.toc-num[data-level="2"] {
    font-weight: 700;
}

.toc h3,
.toc-num[data-level="3"] {
    font-weight: 500;
}

.toc h4,
.toc-num[data-level="4"] {
    font-size: 95%;
    font-weight: 400;
}

.toc h5,
.toc-num[data-level="5"] {
    font-size: 90%;
    font-weight: 300;
}

.toc h6,
.toc-num[data-level="6"] {
    font-size: 90%;
    font-weight: 100;
}

.toc a:hover {
    display: inline-block;
    width: 100%;

    color: var(--a-hover-color);
    border-bottom: 1px dashed var(--a-hover-color);
}

.toc h1:not(:nth-child(2)>h1) {
    margin-top: 1.5em;
}

.toc h2:not(:nth-child(2)>h2) {
    margin-top: 0.75em;
}

/** BIBLIOGRAPHY */

.bib {
    display: block;
    margin: 1em 0;
}

.bib-item {
    display: inline-block;
    width: 100%;
    margin: 0.25em 0;
}

.bib-item>* {
    padding: 0 0.125em;
}

.bib-author {
    font-style: italic;
}

.bib-title {
    font-weight: 500;
}

.bib-date {
    font-family: var(--monospace-family);
}

.bib-date::before {
    font-family: var(--serif-family);
    content: "(";
}

.bib-date::after {
    font-family: var(--serif-family);
    content: ")";
}

.bib-link {
    display: block;
    margin-left: var(--indent);

    font-family: var(--sans-serif-family);
    font-style: normal;
}

/* SPECIAL BLOCKS */

intro- {
    display: inline-block;

    font-weight: 600;
    text-transform: uppercase;
    font-family: var(--sans-serif-family);
}

abstract-block {
    background-color: var(--abstract-background-color);
    border-left: var(--border-thickness) solid var(--abstract-border-color);
}

abstract-block::before {
    background-image: var(--abstract-image);
}

abstract-block intro-::before {
    content: "Abstract:";
    color: var(--abstract-border-color);
}

blockquote {
    background-color: var(--blockquote-background-color);
    border-left: var(--border-thickness) solid var(--blockquote-border-color);
}

blockquote::before {
    background-image: var(--blockquote-image);
    top: -0.25em;
}

blockquote intro-::before {
    content: "Quote:";
    color: var(--blockquote-border-color);
}

bug-block {
    background-color: var(--bug-block-background-color);
    border-left: var(--border-thickness) solid var(--bug-block-border-color);
}

bug-block::before {
    background-image: var(--bug-block-image);
}

bug-block intro-::before {
    content: "Bug:";
    color: var(--bug-block-border-color);
}

del-block {
    background-color: var(--del-block-background-color);
    border-left: var(--border-thickness) solid var(--del-block-border-color);
    color: var(--del-color);
}

del-block::before {
    background-image: var(--del-block-image);
}

del-block intro-::before {
    content: "Deleted:";
    color: var(--del-block-border-color);
}

del-block code,
del-block code-block {
    color: var(--text-color);
}

details {
    background-color: var(--details-background-color);
    border-left: var(--border-thickness) solid var(--details-border-color);
}

details::before {
    background-image: var(--details-image);
}

summary {
    font-family: var(--sans-serif-family);
    color: var(--details-border-color);
    user-select: none;
    cursor: pointer;
}

details[open]>summary {
    margin-bottom: 0.5em;
}

decision-block {
    background-color: var(--decision-block-background-color);
    border-left: var(--border-thickness) solid var(--decision-block-border-color);
}

decision-block::before {
    background-image: var(--decision-block-image);
}

decision-block intro-::before {
    content: "Decision:";
    color: var(--decision-block-border-color);
}

diff-block {
    background-color: var(--diff-block-background-color);
    border-left: var(--border-thickness) solid var(--diff-block-border-color);
}

diff-block::before {
    background-image: var(--diff-block-image);
}

diff-block intro-::before {
    content: "Difference:";
    color: var(--diff-block-border-color);
}

example-block {
    background-color: var(--example-block-background-color);
    border-left: var(--border-thickness) solid var(--example-block-border-color);
}

example-block::before {
    background-image: var(--example-block-image);
}

example-block intro-::before {
    content: "Example:";
    color: var(--example-block-border-color);
}

important-block {
    background-color: var(--important-block-background-color);
    border-left: var(--border-thickness) solid var(--important-block-border-color);
}

important-block::before {
    background-image: var(--important-block-image);
}

important-block intro-::before {
    content: "Important:";
    color: var(--important-block-border-color);
}

ins-block {
    background-color: var(--ins-block-background-color);
    border-left: var(--border-thickness) solid var(--ins-block-border-color);
    color: var(--ins-color);
}

ins-block code,
ins-block code-block {
    color: var(--text-color);
}

ins-block::before {
    background-image: var(--ins-block-image);
}

ins-block intro-::before {
    content: "Inserted:";
    color: var(--ins-block-border-color);
}

note-block {
    background-color: var(--note-block-background-color);
    border-left: var(--border-thickness) solid var(--note-block-border-color);
}

note-block::before {
    background-image: var(--note-block-image);
}

note-block intro-::before {
    content: "Note:";
    color: var(--note-block-border-color);
}

tip-block {
    background-color: var(--tip-block-background-color);
    border-left: var(--border-thickness) solid var(--tip-block-border-color);
}

tip-block::before {
    background-image: var(--tip-block-image);
}

tip-block intro-::before {
    content: "Tip:";
    color: var(--tip-block-border-color);
}

todo-block {
    background-color: var(--todo-block-background-color);
    border-left: var(--border-thickness) solid var(--todo-block-border-color);
}

todo-block::before {
    background-image: var(--todo-block-image);
}

todo-block intro-::before {
    content: "Todo:";
    color: var(--todo-block-border-color);
}

warning-block {
    background-color: var(--warning-block-background-color);
    border-left: var(--border-thickness) solid var(--warning-block-border-color);
}

warning-block::before {
    background-image: var(--warning-block-image);
}

warning-block intro-::before {
    content: "Warning:";
    color: var(--warning-block-border-color);
}

.indent {
    margin-left: var(--indent);
}

/* SETTINGS MENU */

#settings:not(.js) {
    display: none;
}

#settings {
    z-index: 999;
    position: fixed;
    display: inline-block;
    top: 1em;
    right: 1em;
}

#theme-icon {
    display: block;
    width: 2.5em;
    height: 2.5em;
    cursor: pointer;
    background-image: var(--theme-icon);
    background-size: contain;
    opacity: 0.25;
}

#theme-icon:hover,
#theme-icon:focus {
    opacity: 1;
}
  </style>
  <style>
@media (prefers-color-scheme: light) {
h-[data-h^=err] { color:#ff0000; }
h-[data-h^=cmt] { color:green; font-style:italic; }
h-[data-h^=cmt_dlim] { font-style:normal; }
h-[data-h^=val] { color:#9f6807; }
h-[data-h^=num] { color:#9f6807; }
h-[data-h^=str] { color:#9f6807; }
h-[data-h^=esc] { color:#9f6807; }
h-[data-h^=null] { color:#00607c; }
h-[data-h^=bool] { color:#9f6807; }
h-[data-h^=this] { color:#00607c; }
h-[data-h^=mac] { color:#6f4e37; }
h-[data-h^=kw] { color:#00607c; }
h-[data-h^=sym] { color:#570057; }
h-[data-h^=sym_punc] { color:#000000; }
h-[data-h^=sym_par] { color:#af1915; }
h-[data-h^=sym_sqr] { color:#af1915; }
h-[data-h^=sym_brac] { color:#af1915; }
h-[data-h^=diff_head] { color:#777777; }
h-[data-h^=diff_head_hunk] { color:#5c477e; }
h-[data-h^=diff_eq] { color:#000000; }
h-[data-h^=diff_del] { color:#b31d28; background-color:#ffeef0; }
h-[data-h^=diff_ins] { color:#22863a; background-color:#f0fff4; }
h-[data-h^=diff_mod] { color:#7a680d; background-color:#fffdee; }
h-[data-h^=mk_tag] { color:#00607c; }
h-[data-h^=mk_attr] { color:#5c477e; }
h-[data-h^=mk_del] { color:#ce9178; text-decoration:line-through; }
h-[data-h^=mk_ins] { color:#b5cea8; text-decoration:underline; }
h-[data-h^=mk_emph] { font-style:italic; }
h-[data-h^=mk_stro] { font-weight:bold; }
h-[data-h^=mk_emph_stro] { font-style:italic; font-weight:bold; }
h-[data-h^=mk_ulin] { text-decoration:underline; }
h-[data-h^=mk_emph_ulin] { font-style:italic; text-decoration:underline; }
h-[data-h^=mk_stro_ulin] { font-weight:bold; text-decoration:underline; }
h-[data-h^=mk_emph_stro_ulin] { font-weight:bold; font-style:italic; text-decoration:underline; }
h-[data-h^=mk_strk] { text-decoration:line-through; }
h-[data-h^=mk_emph_strk] { font-style:italic; text-decoration:line-through; }
h-[data-h^=mk_stro_strk] { font-weight:bold; text-decoration:line-through; }
h-[data-h^=mk_emph_stro_strk] { font-weight:bold; font-style:italic; text-decoration:line-through; }
h-[data-h^=mk_ulin_strk] { text-decoration:underline line-through; }
h-[data-h^=mk_emph_ulin_strk] { font-style:italic; text-decoration:underline line-through; }
h-[data-h^=mk_stro_ulin_strk] { font-weight:bold; text-decoration:underline line-through; }
h-[data-h^=mk_emph_stro_ulin_strk] { font-weight:bold; font-style:italic; text-decoration:underline line-through; }
h-[data-h^=sh_cmd] { color:#00607c; }
h-[data-h^=sh-opt] { color:#000000; }
}
@media (prefers-color-scheme: dark) {
h-[data-h^=err] { color:#ff0000; }
h-[data-h^=cmt] { color:#a2e08d; font-style:italic; }
h-[data-h^=cmt_dlim] { font-style:normal; }
h-[data-h^=val] { color:#f2d18d; }
h-[data-h^=num] { color:#f2d18d; }
h-[data-h^=num_dlim] { color:#e6b191; }
h-[data-h^=num_deco] { color:#e6b191; }
h-[data-h^=str] { color:#f2d18d; }
h-[data-h^=str_dlim] { color:#e6b191; }
h-[data-h^=str_deco] { color:#e6b191; }
h-[data-h^=esc] { color:#e6aee6; }
h-[data-h^=null] { color:#62ded6; }
h-[data-h^=bool] { color:#f2d18d; }
h-[data-h^=this] { color:#62ded6; }
h-[data-h^=mac] { color:#cc946e; }
h-[data-h^=kw] { color:#62ded6; }
h-[data-h^=sym] { color:#baa6b9; }
h-[data-h^=sym_punc] { color:#d0d0d0; }
h-[data-h^=sym_par] { color:#fa7878; }
h-[data-h^=sym_sqr] { color:#fa7878; }
h-[data-h^=sym_brac] { color:#fa7878; }
h-[data-h^=diff_head] { color:#777777; }
h-[data-h^=diff_head_hunk] { color:#edc385; }
h-[data-h^=diff_eq] { color:#e7e7e7; }
h-[data-h^=diff_del] { color:#ffdcd7; background-color:#67060c; }
h-[data-h^=diff_ins] { color:#aff5b4; background-color:#033a16; }
h-[data-h^=diff_mod] { color:#fff4d7; background-color:#674d06; }
h-[data-h^=mk_tag] { color:#62ded6; }
h-[data-h^=mk_attr] { color:#a4c4de; }
h-[data-h^=mk_del] { color:#ce9178; text-decoration:line-through; }
h-[data-h^=mk_ins] { color:#b5cea8; text-decoration:underline; }
h-[data-h^=mk_emph] { font-style:italic; }
h-[data-h^=mk_stro] { font-weight:bold; }
h-[data-h^=mk_emph_stro] { font-style:italic; font-weight:bold; }
h-[data-h^=mk_ulin] { text-decoration:underline; }
h-[data-h^=mk_emph_ulin] { font-style:italic; text-decoration:underline; }
h-[data-h^=mk_stro_ulin] { font-weight:bold; text-decoration:underline; }
h-[data-h^=mk_emph_stro_ulin] { font-weight:bold; font-style:italic; text-decoration:underline; }
h-[data-h^=mk_strk] { text-decoration:line-through; }
h-[data-h^=mk_emph_strk] { font-style:italic; text-decoration:line-through; }
h-[data-h^=mk_stro_strk] { font-weight:bold; text-decoration:line-through; }
h-[data-h^=mk_emph_stro_strk] { font-weight:bold; font-style:italic; text-decoration:line-through; }
h-[data-h^=mk_ulin_strk] { text-decoration:underline line-through; }
h-[data-h^=mk_emph_ulin_strk] { font-style:italic; text-decoration:underline line-through; }
h-[data-h^=mk_stro_ulin_strk] { font-weight:bold; text-decoration:underline line-through; }
h-[data-h^=mk_emph_stro_ulin_strk] { font-weight:bold; font-style:italic; text-decoration:underline line-through; }
h-[data-h^=sh_cmd] { color:#62ded6; }
h-[data-h^=sh-opt] { color:#d0d0d0; }
}

html.light h-[data-h^=err] { color:#ff0000; }
html.light h-[data-h^=cmt] { color:green; font-style:italic; }
html.light h-[data-h^=cmt_dlim] { font-style:normal; }
html.light h-[data-h^=val] { color:#9f6807; }
html.light h-[data-h^=num] { color:#9f6807; }
html.light h-[data-h^=str] { color:#9f6807; }
html.light h-[data-h^=esc] { color:#9f6807; }
html.light h-[data-h^=null] { color:#00607c; }
html.light h-[data-h^=bool] { color:#9f6807; }
html.light h-[data-h^=this] { color:#00607c; }
html.light h-[data-h^=mac] { color:#6f4e37; }
html.light h-[data-h^=kw] { color:#00607c; }
html.light h-[data-h^=sym] { color:#570057; }
html.light h-[data-h^=sym_punc] { color:#000000; }
html.light h-[data-h^=sym_par] { color:#af1915; }
html.light h-[data-h^=sym_sqr] { color:#af1915; }
html.light h-[data-h^=sym_brac] { color:#af1915; }
html.light h-[data-h^=diff_head] { color:#777777; }
html.light h-[data-h^=diff_head_hunk] { color:#5c477e; }
html.light h-[data-h^=diff_eq] { color:#000000; }
html.light h-[data-h^=diff_del] { color:#b31d28; background-color:#ffeef0; }
html.light h-[data-h^=diff_ins] { color:#22863a; background-color:#f0fff4; }
html.light h-[data-h^=diff_mod] { color:#7a680d; background-color:#fffdee; }
html.light h-[data-h^=mk_tag] { color:#00607c; }
html.light h-[data-h^=mk_attr] { color:#5c477e; }
html.light h-[data-h^=mk_del] { color:#ce9178; text-decoration:line-through; }
html.light h-[data-h^=mk_ins] { color:#b5cea8; text-decoration:underline; }
html.light h-[data-h^=mk_emph] { font-style:italic; }
html.light h-[data-h^=mk_stro] { font-weight:bold; }
html.light h-[data-h^=mk_emph_stro] { font-style:italic; font-weight:bold; }
html.light h-[data-h^=mk_ulin] { text-decoration:underline; }
html.light h-[data-h^=mk_emph_ulin] { font-style:italic; text-decoration:underline; }
html.light h-[data-h^=mk_stro_ulin] { font-weight:bold; text-decoration:underline; }
html.light h-[data-h^=mk_emph_stro_ulin] { font-weight:bold; font-style:italic; text-decoration:underline; }
html.light h-[data-h^=mk_strk] { text-decoration:line-through; }
html.light h-[data-h^=mk_emph_strk] { font-style:italic; text-decoration:line-through; }
html.light h-[data-h^=mk_stro_strk] { font-weight:bold; text-decoration:line-through; }
html.light h-[data-h^=mk_emph_stro_strk] { font-weight:bold; font-style:italic; text-decoration:line-through; }
html.light h-[data-h^=mk_ulin_strk] { text-decoration:underline line-through; }
html.light h-[data-h^=mk_emph_ulin_strk] { font-style:italic; text-decoration:underline line-through; }
html.light h-[data-h^=mk_stro_ulin_strk] { font-weight:bold; text-decoration:underline line-through; }
html.light h-[data-h^=mk_emph_stro_ulin_strk] { font-weight:bold; font-style:italic; text-decoration:underline line-through; }
html.light h-[data-h^=sh_cmd] { color:#00607c; }
html.light h-[data-h^=sh-opt] { color:#000000; }

html.dark h-[data-h^=err] { color:#ff0000; }
html.dark h-[data-h^=cmt] { color:#a2e08d; font-style:italic; }
html.dark h-[data-h^=cmt_dlim] { font-style:normal; }
html.dark h-[data-h^=val] { color:#f2d18d; }
html.dark h-[data-h^=num] { color:#f2d18d; }
html.dark h-[data-h^=num_dlim] { color:#e6b191; }
html.dark h-[data-h^=num_deco] { color:#e6b191; }
html.dark h-[data-h^=str] { color:#f2d18d; }
html.dark h-[data-h^=str_dlim] { color:#e6b191; }
html.dark h-[data-h^=str_deco] { color:#e6b191; }
html.dark h-[data-h^=esc] { color:#e6aee6; }
html.dark h-[data-h^=null] { color:#62ded6; }
html.dark h-[data-h^=bool] { color:#f2d18d; }
html.dark h-[data-h^=this] { color:#62ded6; }
html.dark h-[data-h^=mac] { color:#cc946e; }
html.dark h-[data-h^=kw] { color:#62ded6; }
html.dark h-[data-h^=sym] { color:#baa6b9; }
html.dark h-[data-h^=sym_punc] { color:#d0d0d0; }
html.dark h-[data-h^=sym_par] { color:#fa7878; }
html.dark h-[data-h^=sym_sqr] { color:#fa7878; }
html.dark h-[data-h^=sym_brac] { color:#fa7878; }
html.dark h-[data-h^=diff_head] { color:#777777; }
html.dark h-[data-h^=diff_head_hunk] { color:#edc385; }
html.dark h-[data-h^=diff_eq] { color:#e7e7e7; }
html.dark h-[data-h^=diff_del] { color:#ffdcd7; background-color:#67060c; }
html.dark h-[data-h^=diff_ins] { color:#aff5b4; background-color:#033a16; }
html.dark h-[data-h^=diff_mod] { color:#fff4d7; background-color:#674d06; }
html.dark h-[data-h^=mk_tag] { color:#62ded6; }
html.dark h-[data-h^=mk_attr] { color:#a4c4de; }
html.dark h-[data-h^=mk_del] { color:#ce9178; text-decoration:line-through; }
html.dark h-[data-h^=mk_ins] { color:#b5cea8; text-decoration:underline; }
html.dark h-[data-h^=mk_emph] { font-style:italic; }
html.dark h-[data-h^=mk_stro] { font-weight:bold; }
html.dark h-[data-h^=mk_emph_stro] { font-style:italic; font-weight:bold; }
html.dark h-[data-h^=mk_ulin] { text-decoration:underline; }
html.dark h-[data-h^=mk_emph_ulin] { font-style:italic; text-decoration:underline; }
html.dark h-[data-h^=mk_stro_ulin] { font-weight:bold; text-decoration:underline; }
html.dark h-[data-h^=mk_emph_stro_ulin] { font-weight:bold; font-style:italic; text-decoration:underline; }
html.dark h-[data-h^=mk_strk] { text-decoration:line-through; }
html.dark h-[data-h^=mk_emph_strk] { font-style:italic; text-decoration:line-through; }
html.dark h-[data-h^=mk_stro_strk] { font-weight:bold; text-decoration:line-through; }
html.dark h-[data-h^=mk_emph_stro_strk] { font-weight:bold; font-style:italic; text-decoration:line-through; }
html.dark h-[data-h^=mk_ulin_strk] { text-decoration:underline line-through; }
html.dark h-[data-h^=mk_emph_ulin_strk] { font-style:italic; text-decoration:underline line-through; }
html.dark h-[data-h^=mk_stro_ulin_strk] { font-weight:bold; text-decoration:underline line-through; }
html.dark h-[data-h^=mk_emph_stro_ulin_strk] { font-weight:bold; font-style:italic; text-decoration:underline line-through; }
html.dark h-[data-h^=sh_cmd] { color:#62ded6; }
html.dark h-[data-h^=sh-opt] { color:#d0d0d0; }
  </style>
  <script>
const theme = localStorage.getItem("cowel-theme");
if (theme !== null) {
    document.documentElement.className = theme;
}
  </script>
</head>
<body>
<div id=settings tabindex=0>
    <div id=theme-icon></div>
    <script>
        const settings = document.getElementById("settings");
        const htmlClasses = document.documentElement.classList;
        const themeIcon = document.getElementById("theme-icon");

        settings.classList.add("js");
        themeIcon.onclick = () => {
            const prefersDark = window.matchMedia("(prefers-color-scheme: dark)");
            const overrideClass = prefersDark.matches ? "light" : "dark";
            if (htmlClasses.contains("light")) {
                htmlClasses.remove("light");
                localStorage.removeItem("cowel-theme");
            } else if (htmlClasses.contains("dark")) {
                htmlClasses.remove("dark");
                localStorage.removeItem("cowel-theme");
            } else {
                htmlClasses.add(overrideClass);
                // to avoid legal issues or controversy in general,
                // we don't mess with local storage when the page is hosted in arbitrary places
                if (window.location.protocol === "file:") {
                    localStorage.setItem("cowel-theme", overrideClass);
                }
            }
        };
        settings.onkeydown = (e) => {
            if (e.key === "Enter" || e.key === " ") {
                event.preventDefault();
                themeIcon.onclick();
            }
        };
    </script>
</div>
<main>























<p><div class=wg21-head><h1>Concepts for integer types, not integral types</h1>

<dl>
    <dt>Document number:</dt> <dd><a href=https://wg21%2elink/P3701R0>P3701R0</a></dd>
    <dt>Date:</dt>            <dd><tt->2025-05-19</tt-></dd>
    <dt>Audience:</dt>        <dd>CWG, LEWG</dd>
    <dt>Project:</dt>         <dd>ISO/IEC 14882 Programming Languages — C++, ISO/IEC JTC1/SC22/WG21</dd>
    <dt>Reply-To:</dt>        <dd>Jan Schultke &lt;<a href=mailto:janschultke@gmail%2ecom class=sans>janschultke@gmail.com</a>&gt;</dd>
    <dt>GitHub Issue:</dt>    <dd><a href=https://wg21%2elink/P3701R0/github class=sans>wg21.link/P3701R0/github</a></dd>
    <dt>Source:</dt>          <dd><a href=https://github%2ecom/Eisenwave/cpp-proposals/blob/master/src/signed-or-unsigned%2ecow class=sans>github.com/Eisenwave/cpp-proposals/blob/master/src/signed-or-unsigned.cow</a></dd>
</dl>
<hr/>
</div></p>

<abstract-block><p><intro-></intro-> 
The <code><h- data-h=id>std</h-><h- data-h=sym_op>::</h-><h- data-h=id>integral</h-></code> concept includes
cv-qualified types, character types, and <code><h- data-h=kw_type>bool</h-></code>,
which is overly broad for many uses cases.
More restrictive concepts are introduced,
and editorial changes are made so "integral" and "integer" are distinct terms.
</p></abstract-block>

<h2 id=contents><a class=para href=#contents></a>Contents</h2>

<div class=toc><div class=toc-num data-level=2>1</div><a href=#introduction><h2>Introduction</h2></a><div class=toc-num data-level=2>2</div><a href=#design><h2>Design</h2></a><div class=toc-num data-level=3>2.1</div><a href=#is-this-obsoleted-by-p3003?><h3>Is this obsoleted by P3003?</h3></a><div class=toc-num data-level=3>2.2</div><a href=#cv-qualifications><h3>Should <code><h- data-h=kw>const</h-> <h- data-h=kw_type>int</h-></code> be an integer type?</h3></a><div class=toc-num data-level=2>3</div><a href=#impact-on-the-standard><h2>Impact on the standard</h2></a><div class=toc-num data-level=2>4</div><a href=#wording><h2>Wording</h2></a><div class=toc-num data-level=3>4.1</div><a href=#core-wording><h3>Core wording</h3></a><div class=toc-num data-level=3>4.2</div><a href=#library-wording><h3>Library wording</h3></a><div class=toc-num data-level=2>5</div><a href=#references><h2>References</h2></a></div>

<h2 id=introduction><a class=para href=#introduction></a>1. Introduction</h2>

<p><code><h- data-h=id>std</h-><h- data-h=sym_op>::</h-><h- data-h=id>integral</h-></code> is widely used by the C++ community
as a constraint for numeric code (<a href="https://github%2ecom/search?q=language%253AC%252B%252B+%252Fstd%253A%253Aintegral%255B+%253C%255D%252F&type=code">[GitHubSearch]</a>).
Many of these uses are questionable because <code><h- data-h=id>std</h-><h- data-h=sym_op>::</h-><h- data-h=id>integral</h-></code> is satisfied by
character types such as <code><h- data-h=kw_type>char</h-></code>, as well as <code><h- data-h=kw_type>bool</h-></code>,
and cv-qualified versions of all these types.
<code><h- data-h=id>std</h-><h- data-h=sym_op>::</h-><h- data-h=id>signed_integral</h-></code> and <code><h- data-h=id>std</h-><h- data-h=sym_op>::</h-><h- data-h=id>unsigned_integral</h-></code> are similarly permissive.
</p>
<bug-block><p><intro-></intro-> 
The constraints on the following template
most likely don't match the intent of the author.
</p><code-block><h- data-h=kw>template</h-> <h- data-h=sym_op>&lt;</h-><h- data-h=id>std</h-><h- data-h=sym_op>::</h-><h- data-h=id>integral</h-> <h- data-h=id>T</h-><h- data-h=sym_op>&gt;</h->
<h- data-h=id>T</h-> <h- data-h=id>add_integers</h-><h- data-h=sym_par>(</h-><h- data-h=id>T</h-> <h- data-h=id>x</h-><h- data-h=sym_punc>,</h-> <h- data-h=id>T</h-> <h- data-h=id>y</h-><h- data-h=sym_par>)</h-> <h- data-h=sym_brac>{</h-> <h- data-h=kw_ctrl>return</h-> <h- data-h=id>x</h-> <h- data-h=sym_op>+</h-> <h- data-h=id>y</h-><h- data-h=sym_punc>;</h-> <h- data-h=sym_brac>}</h->
<h- data-h=cmt_dlim>//</h-><h- data-h=cmt> ...</h->
<h- data-h=id>add_integers</h-><h- data-h=sym_par>(</h-><h- data-h=bool>true</h-><h- data-h=sym_punc>,</h-> <h- data-h=bool>true</h-><h- data-h=sym_par>)</h-><h- data-h=sym_punc>;</h->      <h- data-h=cmt_dlim>//</h-><h- data-h=cmt> OK?!</h->
<h- data-h=id>add_integers</h-><h- data-h=sym_par>(</h-><h- data-h=str_dlim>'</h-><h- data-h=str>a</h-><h- data-h=str_dlim>'</h-><h- data-h=sym_punc>,</h-> <h- data-h=str_dlim>'</h-><h- data-h=str>b</h-><h- data-h=str_dlim>'</h-><h- data-h=sym_par>)</h-><h- data-h=sym_punc>;</h->        <h- data-h=cmt_dlim>//</h-><h- data-h=cmt> OK?!</h->
<h- data-h=id>add_integers</h-><h- data-h=sym_op>&lt;</h-><h- data-h=kw>const</h-> <h- data-h=kw_type>int</h-><h- data-h=sym_op>&gt;</h-><h- data-h=sym_par>(</h-><h- data-h=num>1</h-><h- data-h=sym_punc>,</h-> <h- data-h=num>2</h-><h- data-h=sym_par>)</h-><h- data-h=sym_punc>;</h-> <h- data-h=cmt_dlim>//</h-><h- data-h=cmt> OK?!</h-></code-block>
</bug-block>

<p>The C++ standard uses "signed or unsigned integer type" as a more appropriate constraint
in <a href=https://eel%2eis/c++draft/numeric%2esat%2efunc>[numeric.sat.func]</a>, <a href=https://eel%2eis/c++draft/mdspan%2eextents%2eoverview>[mdspan.extents.overview]</a>, and various other subclauses.
That name is clunky and needs to be used instead of the obvious "integer type"
because "integer" is already synonymous with "integral", and this proposal cleans that up.
</p>
<p>For integer types (with new meaning),
signed integer types,
and unsigned integer types,
I propose the corresponding concepts <code><h- data-h=id>std</h-><h- data-h=sym_op>::</h-><h- data-h=id>integer</h-></code>,
<code><h- data-h=id>std</h-><h- data-h=sym_op>::</h-><h- data-h=id>signed_integer</h-></code>, and <code><h- data-h=id>std</h-><h- data-h=sym_op>::</h-><h- data-h=id>unsigned_integer</h-></code>.
The goal is mainly to provide a simple alternative to the <code><h- data-h=id>integral</h-></code> concepts,
which provide more appropriate constraints in user code.
</p>
<h2 id=design><a class=para href=#design></a>2. Design</h2>

<p>The C++ standard currently uses "integer" and "integral" in a surprising way.
<code><h- data-h=id>std</h-><h- data-h=sym_op>::</h-><h- data-h=id>signed_integral</h-></code> includes types that are not signed integers,
<code><h- data-h=id>std</h-><h- data-h=sym_op>::</h-><h- data-h=id>unsigned_integral</h-></code> includes types that are not unsigned integers,
but "integer type" is a synonym for "integral type"
(<a href=https://eel%2eis/c++draft/basic%2efundamental#def:integer_type>[basic.fundamental] definition of "integer type"</a>).
</p>
<p>The really confusing part is that "integral" is only sometimes, but not always,
a broader term than "integer".
This can be improved with the following strategy:
</p>
<table>
<tr>
    <th>Defined term (if any)</th>
    <th><code><h- data-h=kw>concept</h-></code></th>
    <th>Meaning</th>
</tr>
<tr>
    <td>integral type</td>
    <td><code><h- data-h=id>std</h-><h- data-h=sym_op>::</h-><h- data-h=id>integral</h-></code></td>
    <td>Lots of stuff: <code><h- data-h=kw_type>int</h-></code>, <code><h- data-h=kw_type>char</h-></code>, <code><h- data-h=kw>const</h-> <h- data-h=kw_type>bool</h-></code>, ...</td>
</tr>
<tr>
    <td>N/A</td>
    <td><code><h- data-h=id>std</h-><h- data-h=sym_op>::</h-><h- data-h=id>signed_integral</h-></code></td>
    <td>integral types which satisfy <code><h- data-h=id>std</h-><h- data-h=sym_op>::</h-><h- data-h=id>is_signed_v</h-></code></td>
</tr>
<tr>
    <td>N/A</td>
    <td><code><h- data-h=id>std</h-><h- data-h=sym_op>::</h-><h- data-h=id>unsigned_integral</h-></code></td>
    <td>integral types which do not satisfy <code><h- data-h=id>std</h-><h- data-h=sym_op>::</h-><h- data-h=id>is_signed_v</h-></code></td>
</tr>
<tr>
    <td><del>integer type</del></td>
    <td><del><code><h- data-h=id>std</h-><h- data-h=sym_op>::</h-><h- data-h=id>integral</h-></code></del></td>
    <td><del>synonym for integral type</del></td>
</tr>
<tr>
    <td><ins>integer type</ins></td>
    <td><ins><code><h- data-h=id>std</h-><h- data-h=sym_op>::</h-><h- data-h=id>integer</h-></code></ins></td>
    <td><ins>signed or unsigned integer types</ins></td>
</tr>
<tr>
    <td>signed integer type</td>
    <td><ins><code><h- data-h=id>std</h-><h- data-h=sym_op>::</h-><h- data-h=id>signed_integer</h-></code></ins></td>
    <td><code><h- data-h=kw_type>signed</h-> <h- data-h=kw_type>char</h-></code>, <code><h- data-h=kw_type>signed</h-> <h- data-h=kw_type>short</h-></code>, <code><h- data-h=kw_type>signed</h-> <h- data-h=kw_type>int</h-></code>, etc.<br/>(also extended signed integers)</td>
</tr>
<tr>
    <td>unsigned integer type</td>
    <td><ins><code><h- data-h=id>std</h-><h- data-h=sym_op>::</h-><h- data-h=id>unsigned_integer</h-></code></ins></td>
    <td><code><h- data-h=kw_type>unsigned</h-> <h- data-h=kw_type>char</h-></code>, <code><h- data-h=kw_type>unsigned</h-> <h- data-h=kw_type>short</h-></code>, <code><h- data-h=kw_type>unsigned</h-> <h- data-h=kw_type>int</h-></code>, etc.<br/>(also extended unsigned integers)</td>
</tr>
</table>

<note-block><p><intro-></intro-> 
With this new strategy,
<code><h- data-h=kw_type>char</h-></code> and <code><h- data-h=kw_type>bool</h-></code> are not integer types, but integral types.
</p></note-block>

<p>Some alternative designs instead of <code><h- data-h=id>std</h-><h- data-h=sym_op>::</h-><h- data-h=id>integer</h-></code> were considered:
</p><ul>
<li>
<code><h- data-h=id>std</h-><h- data-h=sym_op>::</h-><h- data-h=id>signed_or_unsigned</h-></code> would be inappropriate
because <code><h- data-h=id>std</h-><h- data-h=sym_op>::</h-><h- data-h=id>is_signed_v</h-><h- data-h=sym_op>&lt;</h-><h- data-h=kw_type>float</h-><h- data-h=sym_op>&gt;</h-></code> is <code><h- data-h=bool>true</h-></code>.
</li>
<li>
<code><h- data-h=id>std</h-><h- data-h=sym_op>::</h-><h- data-h=id>signed_or_unsigned_integer</h-></code> is comically verbose.
It would also perpetuate the "signed or unsigned integer" workaround in wording;
we ought to have a simpler name.
</li>
<li>
<code><h- data-h=id>std</h-><h- data-h=sym_op>::</h-><h- data-h=id>real_integer</h-></code>, <code><h- data-h=id>std</h-><h- data-h=sym_op>::</h-><h- data-h=id>actual_integer</h-></code>, <code><h- data-h=id>std</h-><h- data-h=sym_op>::</h-><h- data-h=id>integral2</h-></code>,
and other such "integers but like, for real this time" names
aren't any less confusing than <code><h- data-h=id>std</h-><h- data-h=sym_op>::</h-><h- data-h=id>integer</h-></code>.
</li>
</ul>

<h3 id=is-this-obsoleted-by-p3003?><a class=para href=#is-this-obsoleted-by-p3003?></a>2.1. Is this obsoleted by P3003?</h3>

<p><a href="https://wg21%2elink/P3003">[P3003]</a> goes into a different direction:
creating a whole library of numeric concepts,
which would also include user-defined types (via opt-in).
</p>
<p>However, a lot of numeric user code would not be robust enough to take <em>any type</em>
that behaves like an integer mathematically.
User code that is currently constrained with <code><h- data-h=id>std</h-><h- data-h=sym_op>::</h-><h- data-h=id>integral</h-><h- data-h=sym_op>&lt;</h-><h- data-h=id>T</h-><h- data-h=sym_op>&gt;</h-></code>
likely makes some assumptions about <code><h- data-h=id>T</h-></code>, like
</p><ul>
<li>expressions of type <code><h- data-h=id>T</h-></code> can be used in a <code><h- data-h=kw_ctrl>switch</h-></code>, as an array index, etc.,</li>
<li><code><h- data-h=id>T</h-></code> is trivially copyable and usually small,</li>
<li><code><h- data-h=id>T</h-></code> is default-constructible,</li>
<li>no operation can throw, terminate, etc.,</li>
<li><code><h- data-h=id>T</h-></code> can be converted to floating-point types, among other things,</li>
<li>...</li>
</ul>

<p><code><h- data-h=id>std</h-><h- data-h=sym_op>::</h-><h- data-h=id>integer</h-></code> is a quick way to constrain a function while documenting these assumptions,
which is needed in practice.
</p>
<h3 id=cv-qualifications><a class=para href=#cv-qualifications></a>2.2. Should <code><h- data-h=kw>const</h-> <h- data-h=kw_type>int</h-></code> be an integer type?</h3>

<p>Unlike <code><h- data-h=id>std</h-><h- data-h=sym_op>::</h-><h- data-h=id>floating_point</h-></code> and <code><h- data-h=id>std</h-><h- data-h=sym_op>::</h-><h- data-h=id>integral</h-></code>,
<code><h- data-h=id>std</h-><h- data-h=sym_op>::</h-><h- data-h=id>integer</h-></code> (and "integer type") would not include cv-qualified types.
Surprisingly, <code><h- data-h=kw>const</h-> <h- data-h=kw_type>int</h-></code> is not a standard integer or signed integer type,
but <code><h- data-h=kw>const</h-> <h- data-h=kw_type>float</h-></code> is a standard floating-point type.
There is an obvious inconsistency here, and we need to decide on a direction.
</p>
<p>I argue that <code><h- data-h=kw>const</h-> <h- data-h=kw_type>int</h-></code> should not be an integer type.
While that may be counter-intuitive at first glance,
this behavior is tremendously more useful:
</p><ul>
<li>
A substantial amount of wording (<a href=#wording>§4. Wording</a>) can be simplified to just
"is of integer type" or "models <code><h- data-h=id>integer</h-></code>".
This would need to be qualified with "cv-unqualified" otherwise.
</li>
<li>
When the user constrains a numeric function template so it only accepts integer types,
they are not interested in supporting <code><h- data-h=kw>const</h-> <h- data-h=kw_type>int</h-></code>.
Neither is the standard library.
If the template parameter is deduced from a <code><h- data-h=id>T</h-> <h- data-h=id>x</h-></code> function parameter,
the only way to provide <code><h- data-h=id>T</h-> <h- data-h=sym_op>=</h-> <h- data-h=kw>const</h-> <h- data-h=kw_type>int</h-></code> is explicitly anyway;
it never happens organically through deduction.
In the extremely unlikely event they want to support it,
they should do so explicitly via <code><h- data-h=id>std</h-><h- data-h=sym_op>::</h-><h- data-h=id_type>remove_cv_t</h-></code>.
</li>
<li>
It is <em>extremely</em> unlikely that the user intended to support <code><h- data-h=kw>volatile</h-> <h- data-h=kw_type>int</h-></code>
in their types and functions, so this should require opt-in, not opt-out.
<code><h- data-h=id>std</h-><h- data-h=sym_op>::</h-><h- data-h=id>integer</h-><h- data-h=sym_op>&lt;</h-><h- data-h=id>std</h-><h- data-h=sym_op>::</h-><h- data-h=id_type>remove_volatile_t</h-><h- data-h=sym_op>&lt;</h-><h- data-h=id>T</h-><h- data-h=sym_op>&gt;&gt;</h-></code> would be opt-in.
Opt-out would be the natural consequence of including cv-qualified types in "integer type".
</li>
<li>
Every occurrence of "signed integer type" and "unsigned integer type"
should not include cv-qualified types.
For example, it would be insane if the <code><h- data-h=id>size_type</h-></code> of a container could be <code><h- data-h=kw>const</h-></code>.
</li>
<li>
The standard needs to say "cv-unqualified floating-point type(s)"
in a number of places (<a href="https://wg21%2elink/n5008">[N5008]</a>),
and when it doesn't say "cv-unqualified",
it's not always obvious whether that is accidental or by intention.
For example, <a href=https://eel%2eis/c++draft/basic%2eextended%2efp>[basic.extended.fp]</a> never says "cv-unqualified",
but we obviously don't want <code><h- data-h=kw>using</h-> <h- data-h=id_type>float32_t</h-> <h- data-h=sym_op>=</h-> <h- data-h=kw>const</h-> <h- data-h=kw_type>_Float32</h-><h- data-h=sym_punc>;</h-></code>.
Generally, including cv-qualified types in the definitions by default
may be more concise in some places,
but it's making the standard less expressive;
it leaves intent unexpressed.
</li>
</ul>

<p>In conclusion, <code><h- data-h=kw>const</h-> <h- data-h=kw_type>int</h-></code> being considered an integer may feel philosophically right,
but it's not very useful in wording, and it's not beneficial to <code><h- data-h=id>std</h-><h- data-h=sym_op>::</h-><h- data-h=id>integer</h-></code> constraints.
<code><h- data-h=kw>const</h-> <h- data-h=kw_type>float</h-></code> being a floating-point type is a bad status quo that we should not perpetuate.
</p>
<h2 id=impact-on-the-standard><a class=para href=#impact-on-the-standard></a>3. Impact on the standard</h2>

<p>Firstly, the three new concepts <code><h- data-h=id>std</h-><h- data-h=sym_op>::</h-><h- data-h=id>integer</h-></code>,
<code><h- data-h=id>std</h-><h- data-h=sym_op>::</h-><h- data-h=id>signed_integer</h-></code>, and <code><h- data-h=id>std</h-><h- data-h=sym_op>::</h-><h- data-h=id>unsigned_integer</h-></code> are added.
</p>
<p>Secondly, we make editorial changes
so that "integer" is consistently a narrower term,
and "integral" is a broader term.
See <a href=#design>§2. Design</a>.
</p>
<p>While the changes are all very simple,
the wording impact is quite immense because "integer" and "integral"
have been used interchangeably throughout wording.
Any existing uses of "integer" are replaced with "integral",
and the "signed or unsigned integer" pattern can be simplified to just "integer".
</p>
<h2 id=wording><a class=para href=#wording></a>4. Wording</h2>

<style>
ins-block .para::before {
    display: none;
}

.stable-ref {
    float: right;
}
</style>

<p>The following changes are relative to <a href="https://wg21%2elink/n5008">[N5008]</a>.
</p>
<h3 id=core-wording><a class=para href=#core-wording></a>4.1. Core wording</h3>

<p>Change <a href=https://eel%2eis/c++draft/basic%2efundamental#5>[basic.fundamental] paragraph 5</a> as follows:
</p>
<diff-block>
<p>Each value <math display=inline><mi>x</mi></math> of an unsigned integer type with width <math display=inline><mi>N</mi></math> has
a unique representation <math display=inline><mrow>
    <mi>x</mi>
    <mo>=</mo>
    <msub><mi>x</mi><mn>0</mn></msub>
    <msup><mn>2</mn><mn>0</mn></msup>
    <mo>+</mo>
    <msub><mi>x</mi><mn>1</mn></msub>
    <msup><mn>2</mn><mn>1</mn></msup>
    <mo>+</mo>
    <mo>&mldr;</mo>
    <mo>+</mo>
    <msub><mi>x</mi><mrow><mi>N</mi><mo>-</mo><mn>1</mn></mrow></msub>
    <msup><mn>2</mn><mrow><mi>N</mi><mo>-</mo><mn>1</mn></mrow></msup>
</mrow></math>,
where each coefficient <math display=inline><msub><mi>x</mi><mi>i</mi></msub></math> is either 0 or 1;
this is called the <i>base-2 representation</i> of <math display=inline><mi>x</mi></math>.
The base-2 representation of a value of signed integer type is
the base-2 representation of the congruent value
of the corresponding unsigned integer type.
The standard signed integer types and standard unsigned integer types
are collectively called the <i>standard integer types</i>, and the extended
signed integer types and extended
unsigned integer types are collectively called the
<i>extended integer types</i>.
<ins>The standard integer types and extended integer types
are collectively called <i>integer types</i>.
<br/><wg21-block>[<i>Note</i>: 
The set of integer types is equal to
the set of signed and unsigned integer types.
 — <i>end note</i>]</wg21-block></ins>
</p></diff-block>

<note-block><p><intro-></intro-> 
If you cannot see the mathematical symbols in the paragraph above,
you are viewing this document in an old browser with no MathML support.
</p></note-block>

<p>Change <a href=https://eel%2eis/c++draft/basic%2efundamental#6>[basic.fundamental] paragraph 6</a> as follows:
</p>
<diff-block>
<p>A fundamental type specified to have
<del>a signed or unsigned</del> <ins>an</ins> integer type as its <i>underlying type</i> has
the same object representation,
value representation,
alignment requirements (<a href=https://eel%2eis/c++draft/basic%2ealign>[basic.align]</a>), and
range of representable values as the underlying type.
Further, each value has the same representation in both types.
</p></diff-block>

<p>Change <a href=https://eel%2eis/c++draft/basic%2efundamental#8>[basic.fundamental] paragraph 8</a> as follows:
</p>
<diff-block>
<p>Type <code><h- data-h=kw_type>wchar_t</h-></code> is a distinct type that has
an implementation-defined
<del>signed or unsigned</del> integer type as its underlying type.
</p></diff-block>

<p>Change <a href=https://eel%2eis/c++draft/basic%2efundamental#11>[basic.fundamental] paragraph 11</a> as follows:
</p>
<diff-block>
<p>The types <code><h- data-h=kw_type>char</h-></code>, <code><h- data-h=kw_type>wchar_t</h-></code>, <code><h- data-h=kw_type>char8_t</h-></code>, <code><h- data-h=kw_type>char16_t</h-></code>, and <code><h- data-h=kw_type>char32_t</h-></code>
are collectively called <i>character types</i>.
The character types,
<ins>integer types</ins>,
<code><h- data-h=kw_type>bool</h-></code>,
<del>the signed and unsigned integer types,</del>
and cv-qualified versions (<a href=https://eel%2eis/c++draft/basic%2etype%2equalifier>[basic.type.qualifier]</a>) thereof,
are collectively <del>termed</del> <ins>called</ins> <i>integral types</i>.
<del>A synonym for integral type is <i>integer type</i>.</del>
</p></diff-block>

<p>Change <a href=https://eel%2eis/c++draft/conv%2erank#1>[conv.rank] paragraph 1</a> as follows:
</p>
<diff-block>
<p>Every <del>integer type</del> <ins>integral type</ins>
has an <i><del>integer</del> <ins>integral</ins> conversion rank</i> defined as follows:
</p><ul>
<li>[&mldr;]</li>
<li>
The rank of any extended signed integer type
relative to another extended signed integer type
with the same width is implementation-defined,
but still subject to the other rules
for determining the <del>integer</del> <ins>integral</ins> conversion rank.
</li>
<li>
For all <del>integer</del> <ins>integral</ins> types <code><h- data-h=id>T1</h-></code>, <code><h- data-h=id>T2</h-></code>, and <code><h- data-h=id>T3</h-></code>,
if <code><h- data-h=id>T1</h-></code> has greater rank than <code><h- data-h=id>T2</h-></code><ins>,</ins>
and <code><h- data-h=id>T2</h-></code> has greater rank than <code><h- data-h=id>T3</h-></code>,
then <code><h- data-h=id>T1</h-></code> has greater rank than <code><h- data-h=id>T3</h-></code>.
</li>
</ul>
<p><wg21-block>[<i>Note</i>: 
The <del>integer</del> <ins>integral</ins> conversion rank is used
in the definition of the integral promotion (<a href=https://eel%2eis/c++draft/conv%2eprom>[conv.prom]</a>)
and the usual arithmetic conversions (<a href=https://eel%2eis/c++draft/expr%2earith%2econv>[expr.arith.conv]</a>).
 — <i>end note</i>]</wg21-block>
</p></diff-block>

<note-block><p><intro-></intro-> 
Notice that a comma is inserted within the last bullet.
</p></note-block>

<p>Change <a href=https://eel%2eis/c++draft/conv%2elval#3%2e5>[conv.lval] paragraph 3, bullet 5</a> as follows:
</p>
<diff-block>
<p>Otherwise, the object indicated by the glvalue is read (<a href=https://eel%2eis/c++draft/defns%2eaccess>[defns.access]</a>).
Let <code><h- data-h=id>V</h-></code> be the value contained in the object.
If <code><h- data-h=id>T</h-></code> is an <del>integer</del> <ins>integral</ins> type,
the prvalue result is
the value of type <code><h- data-h=id>T</h-></code> congruent (<a href=https://eel%2eis/c++draft/basic%2efundamental>[basic.fundamental]</a>) to <code><h- data-h=id>V</h-></code>, and
<code><h- data-h=id>V</h-></code> otherwise.
</p></diff-block>

<p>Change <a href=https://eel%2eis/c++draft/conv%2eprom#2>[conv.prom] paragraph 2</a> as follows:
</p>
<diff-block>
<p>A prvalue that is not a converted bit-field and has an <del>integer</del> <ins>integral</ins> type other than
<code><h- data-h=kw_type>bool</h-></code>, <code><h- data-h=kw_type>char8_t</h-></code>, <code><h- data-h=kw_type>char16_t</h-></code>,
<code><h- data-h=kw_type>char32_t</h-></code>, or <code><h- data-h=kw_type>wchar_t</h-></code> whose <del>integer</del> <ins>integral</ins> conversion
rank (<a href=https://eel%2eis/c++draft/conv%2erank>[conv.rank]</a>) is less than the rank of <code><h- data-h=kw_type>int</h-></code> can be
converted to a prvalue of type <code><h- data-h=kw_type>int</h-></code> if <code><h- data-h=kw_type>int</h-></code> can represent
all the values of the source type; otherwise, the source prvalue can be
converted to a prvalue of type <code><h- data-h=kw_type>unsigned</h-> <h- data-h=kw_type>int</h-></code>.
</p></diff-block>

<p>Change <a href=https://eel%2eis/c++draft/conv%2eprom#3>[conv.prom] paragraph 3</a> as follows:
</p>
<diff-block>
<p>A prvalue of an unscoped enumeration type whose underlying type is not
fixed can be converted to a prvalue of the first of the following
types that can represent all the values of the enumeration (<a href=https://eel%2eis/c++draft/dcl%2eenum>[dcl.enum]</a>):
<code><h- data-h=kw_type>int</h-></code>, <code><h- data-h=kw_type>unsigned</h-> <h- data-h=kw_type>int</h-></code>, <code><h- data-h=kw_type>long</h-> <h- data-h=kw_type>int</h-></code>, <code><h- data-h=kw_type>unsigned</h-> <h- data-h=kw_type>long</h-> <h- data-h=kw_type>int</h-></code>,
<code><h- data-h=kw_type>long</h-> <h- data-h=kw_type>long</h-> <h- data-h=kw_type>int</h-></code>, or <code><h- data-h=kw_type>unsigned</h-> <h- data-h=kw_type>long</h-> <h- data-h=kw_type>long</h-> <h- data-h=kw_type>int</h-></code>.
If none of the types in that
list can represent all the values of the enumeration, a prvalue of an unscoped
enumeration type can be converted to a prvalue of the extended integer type with lowest
<del>integer</del> <ins>integral</ins> conversion rank (<a href=https://eel%2eis/c++draft/conv%2erank>[conv.rank]</a>)
greater than the rank of <code><h- data-h=kw_type>long</h-> <h- data-h=kw_type>long</h-></code>
in which all the values of the enumeration can be represented.
If there are two such extended types,
the signed one is chosen.
</p></diff-block>

<p>Change <a href=https://eel%2eis/c++draft/conv%2eintegral#1>[conv.integral] paragraph 1</a> as follows:
</p>
<diff-block>
<p>A prvalue of an <del>integer</del> <ins>integral</ins> type
can be converted to a prvalue of another <del>integer</del> <ins>integral</ins> type.
A prvalue of an unscoped enumeration type
can be converted to a prvalue of an <del>integer</del> <ins>integral</ins> type.
</p></diff-block>

<p>Change <a href=https://eel%2eis/c++draft/conv%2efpint#1>[conv.fpint] paragraph 1</a> as follows:
</p>
<diff-block>
<p>A prvalue of a floating-point type can be converted to a prvalue of an
<del>integer</del> <ins>integral</ins> type.
The conversion truncates;
that is, the fractional part is discarded.
The behavior is undefined if the truncated value cannot be represented
in the destination type.
</p></diff-block>

<p>Change <a href=https://eel%2eis/c++draft/conv%2efpint#2>[conv.fpint] paragraph 2</a> as follows:
</p>
<diff-block>
<p>A prvalue of an <del>integer</del> <ins>integral</ins> type
or of an unscoped enumeration type
can be converted to
a prvalue of a floating-point type.
[&mldr;]
</p></diff-block>

<p>Change <a href=https://eel%2eis/c++draft/expr%2ereinterpret%2ecast#5>[expr.reinterpret.cast] paragraph 5</a> as follows:
</p>
<diff-block>
<p>A value of integral type or enumeration type
can be explicitly converted to a pointer.
A pointer converted to an <del>integer</del> <ins>integral type</ins> of sufficient size
(if any such exists on the implementation)
and back to the same pointer type
will have its original value (<a href=https://eel%2eis/c++draft/basic%2ecompound>[basic.compound]</a>);
mappings between pointers and <del>integers</del> <ins>integral types</ins> are otherwise
implementation-defined.
</p></diff-block>

<p>Change <a href=https://eel%2eis/c++draft/expr%2eassign#2>[expr.assign] paragraph 2</a> as follows:
</p>
<diff-block>
<p>In simple assignment (<code><h- data-h=sym_op>=</h-></code>),
let <code><h- data-h=id>V</h-></code> be the result of the right operand;
the object referred to by the left operand is
modified (<a href=https://eel%2eis/c++draft/defns%2eaccess>[defns.access]</a>) by replacing its value
with <code><h- data-h=id>V</h-></code> or,
if the object is of <del>integer</del> <ins>integral</ins> type,
with the value congruent (<a href=https://eel%2eis/c++draft/basic%2efundamental>[basic.fundamental]</a>) to <code><h- data-h=id>V</h-></code>.
</p></diff-block>

<p>Change <a href=https://eel%2eis/c++draft/dcl%2einit%2elist#7>[dcl.init.list] paragraph 7</a> as follows:
</p>
<diff-block>
<p>A <i>narrowing conversion</i> is an implicit conversion
</p><ul>
<li>from a floating-point type to an <del>integer</del> <ins>integral</ins> type, or</li>
<li>[&mldr;]</li>
<li>
from an <del>integer</del> <ins>integral</ins> type or unscoped enumeration type to a floating-point type, except
where the source is a constant expression and the actual value after conversion will fit
into the target type and will produce the original value when converted back to the
original type, or
</li>
<li>
from an <del>integer</del> <ins>integral</ins> type or unscoped enumeration type
to an <del>integer</del> <ins>integral</ins> type that cannot represent all the
values of the original type, except where [&mldr;]
</li>
<li>[&mldr;]</li>
</ul>
</diff-block>

<p>Change <a href=https://eel%2eis/c++draft/dcl%2eenum#11>[dcl.enum] paragraph 11</a> as follows:
</p>
<diff-block>
<p>The value of an enumerator or an object of an unscoped enumeration type is
converted to an <del>integer</del> <ins>integral type</ins> by integral promotion (<a href=https://eel%2eis/c++draft/conv%2eprom>[conv.prom]</a>).
</p></diff-block>

<p>Change <a href=https://eel%2eis/c++draft/class%2ebit#4>[class.bit] paragraph 4</a> as follows:
</p>
<diff-block>
<p>If a value of integral type (other than <code><h- data-h=kw_type>bool</h-></code>) is stored
into a bit-field of width <math display=inline><mi>N</mi></math> and the value would be representable
in a hypothetical <del>signed or unsigned</del> integer type
with width <math display=inline><mi>N</mi></math> and the same signedness as the bit-field's type,
the original value and the value of the bit-field compare equal. [&mldr;]
</p></diff-block>

<h3 id=library-wording><a class=para href=#library-wording></a>4.2. Library wording</h3>

<p>Change <a href=https://eel%2eis/c++draft/bitmask%2etypes#1>[bitmask.types] paragraph 1</a> as follows:
</p>
<diff-block>
<p>Several types defined in <a href=https://eel%2eis/c++draft/support>[support]</a> through <a href=https://eel%2eis/c++draft/exec>[exec]</a> and <a href=https://eel%2eis/c++draft/depr>[depr]</a> are bitmask types.
Each bitmask type can be implemented
as an enumerated type that overloads certain operators, as an <del>integer</del> <ins>integral</ins> type,
or as a bitset.
</p></diff-block>

<p>Change <a href=https://eel%2eis/c++draft/support%2etypes%2elayout>[support.types.layout]</a> as follows:
</p>
<diff-block>
<p><i>Recommended practice</i>:
An implementation should choose types for <code><h- data-h=id_type>ptrdiff_t</h-></code> and <code><h- data-h=id_type>size_t</h-></code>
whose <del>integer</del> <ins>integral</ins> conversion ranks (<a href=https://eel%2eis/c++draft/conv%2erank>[conv.rank]</a>) are no greater than that of
<code><h- data-h=kw_type>signed</h-> <h- data-h=kw_type>long</h-> <h- data-h=kw_type>int</h-></code> unless a larger size is necessary to contain all the possible values.
</p></diff-block>

<p>Change <a href=https://eel%2eis/c++draft/version%2esyn#2>[version.syn] paragraph 2</a> as follows:
</p>
<diff-block>
<code-block class=borderless><h- data-h=mac>#define __cpp_lib_concepts </h-><del><h- data-h=mac>202207L</h-></del><h- data-h=mac> </h-><ins><h- data-h=mac>20XXXXL</h-></ins>
  <h- data-h=cmt_dlim>//</h-><h- data-h=cmt> </h-><f-serif><h- data-h=cmt>freestanding, also in </h-><code><h- data-h=str>&lt;concepts&gt;</h-></code><h- data-h=cmt>, </h-><code><h- data-h=str>&lt;compare&gt;</h-></code></f-serif></code-block>
</diff-block>

<p>Change <a href=https://eel%2eis/c++draft/numeric%2elimits%2egeneral#4>[numeric.limits.general] paragraph 4</a> as follows:
</p>
<diff-block>
<p>Specializations shall be provided for each
arithmetic type,
both floating-point and <del>integer</del> <ins>integral</ins>, including
<code><h- data-h=kw_type>bool</h-></code>.
The member
<code><h- data-h=id>is_specialized</h-></code>
shall be
<code><h- data-h=bool>true</h-></code>
for all such specializations of
<code><h- data-h=id>numeric_limits</h-></code>.
</p></diff-block>

<p>Change <a href=https://eel%2eis/c++draft/numeric%2elimits%2emembers#10>[numeric.limits.members] paragraph 10</a> as follows:
</p>
<diff-block>
<p>For <del>integer</del> <ins>integral</ins> types,
the number of non-sign bits in the representation.
</p></diff-block>

<p>Change <a href=https://eel%2eis/c++draft/numeric%2elimits%2emembers#18>[numeric.limits.members] paragraph 18</a> as follows:
</p>
<diff-block>
<p><code><h- data-h=bool>true</h-></code> if the type is <del>integer</del> <ins>integral</ins>.
</p></diff-block>

<p>Change <a href=https://eel%2eis/c++draft/numeric%2elimits%2emembers#20>[numeric.limits.members] paragraph 20</a> as follows:
</p>
<diff-block>
<p><code><h- data-h=bool>true</h-></code> if the type uses an exact representation.
All <del>integer</del> <ins>integral</ins> types are exact,
but not all exact types are <del>integer</del> <ins>integral</ins>.
For example, rational and fixed-exponent representations are exact
but not <del>integer</del> <ins>integral</ins>.
</p></diff-block>

<p>Change <a href=https://eel%2eis/c++draft/numeric%2elimits%2emembers#23>[numeric.limits.members] paragraph 23</a> as follows:
</p>
<diff-block>
<p>For <del>integer</del> <ins>integral</ins> types,
specifies the base of the representation.<sup>167</sup>
</p></diff-block>

<p>Change <a href=https://eel%2eis/c++draft/numeric%2elimits%2emembers#65>[numeric.limits.members] paragraph 65</a> as follows:
</p>
<diff-block>
<p>Meaningful for all floating-point types.
Specializations for <del>integer</del> <ins>integral</ins> types shall return
<code><h- data-h=id>round_toward_zero</h-></code>.
</p></diff-block>

<p>Change <a href=https://eel%2eis/c++draft/climits%2esyn#note-1>[climits.syn] note 1</a> as follows:
</p>
<diff-block>
<p><wg21-block>[<i>Note</i>: 
Except for <code><h- data-h=id>CHAR_BIT</h-></code> and <code><h- data-h=id>MB_LEN_MAX</h-></code>, a macro referring to
an <del>integer</del> <ins>integral</ins> type <code><h- data-h=id>T</h-></code> defines a constant whose type is the promoted
type of <code><h- data-h=id>T</h-></code> (<a href=https://eel%2eis/c++draft/conv%2eprom>[conv.prom]</a>).
 — <i>end note</i>]</wg21-block>
</p></diff-block>

<p>Change <a href=https://eel%2eis/c++draft/cstdint%2esyn#1>[cstdint.syn] paragraph 1</a> as follows:
</p>
<diff-block>
<p>The header <tt->&lt;cstdint&gt;</tt->
supplies <del>integer</del> <ins>integral</ins> types having specified widths, and
macros that specify limits of <del>integer</del> <ins>integral</ins> types.
</p></diff-block>

<p>Change <a href=https://eel%2eis/c++draft/cstdint%2esyn#3>[cstdint.syn] paragraph 3</a> as follows:
</p>
<diff-block>
<p>All types that use the placeholder <tt-><i><h- data-h=id>N</h-></i></tt->
are optional when <tt-><i><h- data-h=id>N</h-></i></tt->
is not <code><h- data-h=num>8</h-></code>, <code><h- data-h=num>16</h-></code>, <code><h- data-h=num>32</h-></code>, or <code><h- data-h=num>64</h-></code>.
The exact-width types
<code><h- data-h=id_type>int</h-><i><h- data-h=id>N</h-></i><h- data-h=id_type>_t</h-></code> and <code><h- data-h=id_type>uint</h-><i><h- data-h=id>N</h-></i><h- data-h=id_type>_t</h-></code>
for <tt-><i><h- data-h=id>N</h-></i></tt-> = <code><h- data-h=num>8</h-></code>, <code><h- data-h=num>16</h-></code>, <code><h- data-h=num>32</h-></code>, and <code><h- data-h=num>64</h-></code>
are also optional;
however, if an implementation defines <del>integer</del> <ins>integral</ins> types
with the corresponding width and no padding bits,
it defines the corresponding <g-term>typedef-name</g-term>s.
Each of the macros listed in this subclause
is defined if and only if
the implementation defines the corresponding <g-term>typedef-name</g-term>.
<br/><wg21-block>[<i>Note</i>: 
The macros <code><h- data-h=id>INT</h-><tt-><i><h- data-h=id>N</h-></i></tt-><h- data-h=id>_C</h-></code> and <code><h- data-h=id>UINT</h-><tt-><i><h- data-h=id>N</h-></i></tt-><h- data-h=id>_C</h-></code>
correspond to the <g-term>typedef-name</g-term>s
<code><h- data-h=id_type>int_least</h-><tt-><i><h- data-h=id>N</h-></i></tt-><h- data-h=id_type>_t</h-></code> and <code><h- data-h=id_type>uint_least</h-><tt-><i><h- data-h=id>N</h-></i></tt-><h- data-h=id_type>_t</h-></code>,
respectively.
 — <i>end note</i>]</wg21-block>
</p></diff-block>

<p>Change <a href=https://eel%2eis/c++draft/concepts%2esyn>[concepts.syn]</a> as follows:
</p>
<diff-block>
<code-block class=borderless><h- data-h=kw>namespace</h-> <h- data-h=id>std</h-> <h- data-h=sym_brac>{</h->
  <f-serif>[…]</f-serif>
  <h- data-h=cmt_dlim>//</h-><h- data-h=cmt> </h-><f-serif><h- data-h=cmt>[concepts.arithmetic], arithmetic concepts</h-></f-serif>
  <h- data-h=kw>template</h-><h- data-h=sym_op>&lt;</h-><h- data-h=kw>class</h-> <h- data-h=id>T</h-><h- data-h=sym_op>&gt;</h->
    <h- data-h=kw>concept</h-> <h- data-h=id>integral</h-> <h- data-h=sym_op>=</h-> <f-serif><i><h- data-h=id>see</h-> <h- data-h=id>below</h-></i></f-serif><h- data-h=sym_punc>;</h->
  <h- data-h=kw>template</h-><h- data-h=sym_op>&lt;</h-><h- data-h=kw>class</h-> <h- data-h=id>T</h-><h- data-h=sym_op>&gt;</h->
    <h- data-h=kw>concept</h-> <h- data-h=id>signed_integral</h-> <h- data-h=sym_op>=</h-> <f-serif><i><h- data-h=id>see</h-> <h- data-h=id>below</h-></i></f-serif><h- data-h=sym_punc>;</h->
  <h- data-h=kw>template</h-><h- data-h=sym_op>&lt;</h-><h- data-h=kw>class</h-> <h- data-h=id>T</h-><h- data-h=sym_op>&gt;</h->
    <h- data-h=kw>concept</h-> <h- data-h=id>unsigned_integral</h-> <h- data-h=sym_op>=</h-> <f-serif><i><h- data-h=id>see</h-> <h- data-h=id>below</h-></i></f-serif><h- data-h=sym_punc>;</h->
  <ins><h- data-h=kw>template</h-><h- data-h=sym_op>&lt;</h-><h- data-h=kw>class</h-> <h- data-h=id>T</h-><h- data-h=sym_op>&gt;</h->
    <h- data-h=kw>concept</h-> <h- data-h=id>integer</h-> <h- data-h=sym_op>=</h-> <f-serif><i><h- data-h=id>see</h-> <h- data-h=id>below</h-></i></f-serif><h- data-h=sym_punc>;</h->
  <h- data-h=kw>template</h-><h- data-h=sym_op>&lt;</h-><h- data-h=kw>class</h-> <h- data-h=id>T</h-><h- data-h=sym_op>&gt;</h->
    <h- data-h=kw>concept</h-> <h- data-h=id>signed_integer</h-> <h- data-h=sym_op>=</h-> <f-serif><i><h- data-h=id>see</h-> <h- data-h=id>below</h-></i></f-serif><h- data-h=sym_punc>;</h->
  <h- data-h=kw>template</h-><h- data-h=sym_op>&lt;</h-><h- data-h=kw>class</h-> <h- data-h=id>T</h-><h- data-h=sym_op>&gt;</h->
    <h- data-h=kw>concept</h-> <h- data-h=id>unsigned_integer</h-> <h- data-h=sym_op>=</h-> <f-serif><i><h- data-h=id>see</h-> <h- data-h=id>below</h-></i></f-serif><h- data-h=sym_punc>;</h-></ins>
  <h- data-h=kw>template</h-><h- data-h=sym_op>&lt;</h-><h- data-h=kw>class</h-> <h- data-h=id>T</h-><h- data-h=sym_op>&gt;</h->
    <h- data-h=kw>concept</h-> <h- data-h=id>floating_point</h-> <h- data-h=sym_op>=</h-> <f-serif><i><h- data-h=id>see</h-> <h- data-h=id>below</h-></i></f-serif><h- data-h=sym_punc>;</h->
  <f-serif>[…]</f-serif>
<h- data-h=sym_brac>}</h-></code-block>
</diff-block>

<p>Change <a href=https://eel%2eis/c++draft/concepts%2earithmetic>[concepts.arithmetic]</a> as follows:
</p>
<diff-block>
<code-block class=borderless><ins><h- data-h=kw>template</h-><h- data-h=sym_op>&lt;</h-><h- data-h=kw>class</h-> <h- data-h=id>T</h-><h- data-h=sym_punc>,</h-> <h- data-h=kw>class</h-><h- data-h=sym_op>...</h-> <h- data-h=id>Us</h-><h- data-h=sym_op>&gt;</h->
  <h- data-h=kw>concept</h-> <i><h- data-h=id>one-of</h-></i> <h- data-h=sym_op>=</h-> <h- data-h=sym_par>(</h-><h- data-h=id>same_as</h-><h- data-h=sym_op>&lt;</h-><h- data-h=id>T</h-><h- data-h=sym_punc>,</h-> <h- data-h=id>Us</h-><h- data-h=sym_op>&gt;</h-> <h- data-h=sym_op>||</h-> <h- data-h=sym_op>...</h-><h- data-h=sym_par>)</h-><h- data-h=sym_punc>;</h->                     <h- data-h=cmt_dlim>//</h-><h- data-h=cmt> </h-><f-serif><h- data-h=cmt>exposition only</h-></f-serif>
<h- data-h=kw>template</h-><h- data-h=sym_op>&lt;</h-><h- data-h=kw>class</h-> <h- data-h=id>T</h-><h- data-h=sym_op>&gt;</h->
  <h- data-h=kw>concept</h-> <i><h- data-h=id>non-integer</h-></i> <h- data-h=sym_op>=</h-> <i><h- data-h=id>one-of</h-></i><h- data-h=sym_op>&lt;</h-><h- data-h=id>T</h-><h- data-h=sym_punc>,</h-> <h- data-h=kw_type>bool</h-><h- data-h=sym_punc>,</h-> <h- data-h=kw_type>char</h-><h- data-h=sym_punc>,</h-> <h- data-h=kw_type>wchar_t</h-><h- data-h=sym_punc>,</h->          <h- data-h=cmt_dlim>//</h-><h- data-h=cmt> </h-><f-serif><h- data-h=cmt>exposition only</h-></f-serif>
                               <h- data-h=kw_type>char8_t</h-><h- data-h=sym_punc>,</h-> <h- data-h=kw_type>char16_t</h-><h- data-h=sym_punc>,</h-> <h- data-h=kw_type>char32_t</h-><h- data-h=sym_op>&gt;</h-><h- data-h=sym_punc>;</h->
<h- data-h=kw>template</h-><h- data-h=sym_op>&lt;</h-><h- data-h=kw>class</h-> <h- data-h=id>T</h-><h- data-h=sym_op>&gt;</h->
  <h- data-h=kw>concept</h-> <i><h- data-h=id>cv-unqualified</h-></i> <h- data-h=sym_op>=</h-> <h- data-h=sym_op>!</h-><h- data-h=id>is_const_v</h-><h- data-h=sym_op>&lt;</h-><h- data-h=id>T</h-><h- data-h=sym_op>&gt;</h-> <h- data-h=sym_op>&amp;&amp;</h-> <h- data-h=sym_op>!</h-><h- data-h=id>is_volatile_v</h-><h- data-h=sym_op>&lt;</h-><h- data-h=id>T</h-><h- data-h=sym_op>&gt;</h-><h- data-h=sym_punc>;</h-> <h- data-h=cmt_dlim>//</h-><h- data-h=cmt> </h-><f-serif><h- data-h=cmt>exposition only</h-></f-serif></ins>

<h- data-h=kw>template</h-><h- data-h=sym_op>&lt;</h-><h- data-h=kw>class</h-> <h- data-h=id>T</h-><h- data-h=sym_op>&gt;</h->
  <h- data-h=kw>concept</h-> <h- data-h=id>integral</h-> <h- data-h=sym_op>=</h-> <h- data-h=id>is_integral_v</h-><h- data-h=sym_op>&lt;</h-><h- data-h=id>T</h-><h- data-h=sym_op>&gt;</h-><h- data-h=sym_punc>;</h->
<h- data-h=kw>template</h-><h- data-h=sym_op>&lt;</h-><h- data-h=kw>class</h-> <h- data-h=id>T</h-><h- data-h=sym_op>&gt;</h->
  <h- data-h=kw>concept</h-> <h- data-h=id>signed_integral</h-> <h- data-h=sym_op>=</h-> <h- data-h=id>integral</h-><h- data-h=sym_op>&lt;</h-><h- data-h=id>T</h-><h- data-h=sym_op>&gt;</h-> <h- data-h=sym_op>&amp;&amp;</h-> <h- data-h=id>is_signed_v</h-><h- data-h=sym_op>&lt;</h-><h- data-h=id>T</h-><h- data-h=sym_op>&gt;</h-><h- data-h=sym_punc>;</h->
<h- data-h=kw>template</h-><h- data-h=sym_op>&lt;</h-><h- data-h=kw>class</h-> <h- data-h=id>T</h-><h- data-h=sym_op>&gt;</h->
  <h- data-h=kw>concept</h-> <h- data-h=id>unsigned_integral</h-> <h- data-h=sym_op>=</h-> <h- data-h=id>integral</h-><h- data-h=sym_op>&lt;</h-><h- data-h=id>T</h-><h- data-h=sym_op>&gt;</h-> <h- data-h=sym_op>&amp;&amp;</h-> <h- data-h=sym_op>!</h-><h- data-h=id>signed_integral</h-><h- data-h=sym_op>&lt;</h-><h- data-h=id>T</h-><h- data-h=sym_op>&gt;</h-><h- data-h=sym_punc>;</h->
<ins><h- data-h=kw>template</h-><h- data-h=sym_op>&lt;</h-><h- data-h=kw>class</h-> <h- data-h=id>T</h-><h- data-h=sym_op>&gt;</h->
  <h- data-h=kw>concept</h-> <h- data-h=id>integer</h-> <h- data-h=sym_op>=</h-> <h- data-h=id>integral</h-><h- data-h=sym_op>&lt;</h-><h- data-h=id>T</h-><h- data-h=sym_op>&gt;</h-> <h- data-h=sym_op>&amp;&amp;</h-> <h- data-h=sym_op>!</h-><i><h- data-h=id>non-integer</h-></i><h- data-h=sym_op>&lt;</h-><h- data-h=id>T</h-><h- data-h=sym_op>&gt;</h-> <h- data-h=sym_op>&amp;&amp;</h-> <i><h- data-h=id>cv-unqualified</h-></i><h- data-h=sym_op>&lt;</h-><h- data-h=id>T</h-><h- data-h=sym_op>&gt;</h-><h- data-h=sym_punc>;</h->
<h- data-h=kw>template</h-><h- data-h=sym_op>&lt;</h-><h- data-h=kw>class</h-> <h- data-h=id>T</h-><h- data-h=sym_op>&gt;</h->
  <h- data-h=kw>concept</h-> <h- data-h=id>signed_integer</h-> <h- data-h=sym_op>=</h-> <h- data-h=id>integer</h-><h- data-h=sym_op>&lt;</h-><h- data-h=id>T</h-><h- data-h=sym_op>&gt;</h-> <h- data-h=sym_op>&amp;&amp;</h-> <h- data-h=id>is_signed_v</h-><h- data-h=sym_op>&lt;</h-><h- data-h=id>T</h-><h- data-h=sym_op>&gt;</h-><h- data-h=sym_punc>;</h->
<h- data-h=kw>template</h-><h- data-h=sym_op>&lt;</h-><h- data-h=kw>class</h-> <h- data-h=id>T</h-><h- data-h=sym_op>&gt;</h->
  <h- data-h=kw>concept</h-> <h- data-h=id>unsigned_integer</h-> <h- data-h=sym_op>=</h-> <h- data-h=id>integer</h-><h- data-h=sym_op>&lt;</h-><h- data-h=id>T</h-><h- data-h=sym_op>&gt;</h-> <h- data-h=sym_op>&amp;&amp;</h-> <h- data-h=id>is_unsigned_v</h-><h- data-h=sym_op>&lt;</h-><h- data-h=id>T</h-><h- data-h=sym_op>&gt;</h-><h- data-h=sym_punc>;</h-></ins>
<h- data-h=kw>template</h-><h- data-h=sym_op>&lt;</h-><h- data-h=kw>class</h-> <h- data-h=id>T</h-><h- data-h=sym_op>&gt;</h->
  <h- data-h=kw>concept</h-> <h- data-h=id>floating_point</h-> <h- data-h=sym_op>=</h-> <h- data-h=id>is_floating_point_v</h-><h- data-h=sym_op>&lt;</h-><h- data-h=id>T</h-><h- data-h=sym_op>&gt;</h-><h- data-h=sym_punc>;</h-></code-block>
<p><div class=indent>
<p><wg21-block>[<i>Note</i>: 
<code><h- data-h=id>signed_integral</h-></code> can be modeled even by types
that are not signed integer types (<a href=https://eel%2eis/c++draft/basic%2efundamental>[basic.fundamental]</a>);
for example <code><h- data-h=kw_type>char</h-></code>.
<ins><code><h- data-h=id>signed_integer</h-></code> is modeled exclusively by
signed integer types.</ins>
 — <i>end note</i>]</wg21-block></p>

<p><wg21-block>[<i>Note</i>: 
<code><h- data-h=id>unsigned_integral</h-></code> can be modeled even by types
that are not unsigned integer types (<a href=https://eel%2eis/c++draft/basic%2efundamental>[basic.fundamental]</a>);
for example, <code><h- data-h=kw_type>bool</h-></code>.
<ins><code><h- data-h=id>unsigned_integer</h-></code> is modeled exclusively by
unsigned integer types.</ins>
 — <i>end note</i>]</wg21-block>
</p></div>
</p></diff-block>

<p>Change <a href=https://eel%2eis/c++draft/intseq%2eintseq#1>[intseq.intseq] paragraph 1</a> as follows:
</p>
<diff-block>
<p><i>Mandates</i>:
<code><h- data-h=id>T</h-></code> <del>is an integer type</del> <ins>models <code><h- data-h=id>integral</h-></code></ins>.
</p></diff-block>

<p>Change <a href=https://eel%2eis/c++draft/utility%2eintcmp#1>[utility.intcmp] paragraph 1</a> and <a href=https://eel%2eis/c++draft/utility%2eintcmp#4>[utility.intcmp] paragraph 4</a>
as follows:
</p>
<diff-block>
<p><i>Mandates</i>:
Both <code><h- data-h=id>T</h-></code> and <code><h- data-h=id>U</h-></code>
<del>are standard integer types or extended integer types ([basic.fundamental])</del>
<ins>model <code><h- data-h=id>integer</h-></code></ins>.
</p></diff-block>

<p>Change <a href=https://eel%2eis/c++draft/utility%2eintcmp#9>[utility.intcmp] paragraph 9</a> as follows:
</p>
<diff-block>
<p><i>Mandates</i>:
Both <code><h- data-h=id>T</h-></code> and <code><h- data-h=id>R</h-></code>
<del>are standard integer types or extended integer types ([basic.fundamental])</del>
<ins>model <code><h- data-h=id>integer</h-></code></ins>.
</p></diff-block>

<p>Change <a href=https://eel%2eis/c++draft/forward%2elist%2eops#1>[forward.list.ops] paragraph 1</a> as follows:
</p>
<diff-block>
<p>In this subclause, arguments for a template parameter
named <code><h- data-h=id>Predicate</h-></code> or <code><h- data-h=id>BinaryPredicate</h-></code>
shall meet the corresponding requirements in <a href=https://eel%2eis/c++draft/algorithms%2erequirements>[algorithms.requirements]</a>.
The semantics of <code><h- data-h=id>i</h-> <h- data-h=sym_op>+</h-> <h- data-h=id>n</h-></code>,
where <code><h- data-h=id>i</h-></code> is an iterator into the list and <code><h- data-h=id>n</h-></code> is <del>an integer</del> <ins>of integral type</ins>,
are the same as those of <code><h- data-h=id>next</h-><h- data-h=sym_par>(</h-><h- data-h=id>i</h-><h- data-h=sym_punc>,</h-> <h- data-h=id>n</h-><h- data-h=sym_par>)</h-></code>.
The expression <code><h- data-h=id>i</h-> <h- data-h=sym_op>-</h-> <h- data-h=id>n</h-></code>, where <code><h- data-h=id>i</h-></code> is an iterator into the list and <code><h- data-h=id>n</h-></code> is an integer,
means an iterator <code><h- data-h=id>j</h-></code> such that <code><h- data-h=id>j</h-> <h- data-h=sym_op>+</h-> <h- data-h=id>n</h-> <h- data-h=sym_op>==</h-> <h- data-h=id>i</h-></code> is <code><h- data-h=bool>true</h-></code>.
For merge and sort, the definitions and requirements in <a href=https://eel%2eis/c++draft/alg%2esorting>[alg.sorting]</a> apply.
</p></diff-block>

<p>Change <a href=https://eel%2eis/c++draft/hive%2eoperations#1>[hive.operations] paragraph 1</a> as follows:
</p>
<diff-block>
<p>In this subclause,
arguments for a template parameter
named <code><h- data-h=id>Predicate</h-></code> or <code><h- data-h=id>BinaryPredicate</h-></code>
shall meet the corresponding requirements in <a href=https://eel%2eis/c++draft/algorithms%2erequirements>[algorithms.requirements]</a>.
The semantics of <code><h- data-h=id>i</h-> <h- data-h=sym_op>+</h-> <h- data-h=id>n</h-></code> and <code><h- data-h=id>i</h-> <h- data-h=sym_op>-</h-> <h- data-h=id>n</h-></code>,
where <code><h- data-h=id>i</h-></code> is an iterator into the <code><h- data-h=id>hive</h-></code> and <code><h- data-h=id>n</h-></code> is <del>an integer</del> <ins>of integral type</ins>,
are the same as those of <code><h- data-h=id>next</h-><h- data-h=sym_par>(</h-><h- data-h=id>i</h-><h- data-h=sym_punc>,</h-> <h- data-h=id>n</h-><h- data-h=sym_par>)</h-></code> and <code><h- data-h=id>prev</h-><h- data-h=sym_par>(</h-><h- data-h=id>i</h-><h- data-h=sym_punc>,</h-> <h- data-h=id>n</h-><h- data-h=sym_par>)</h-></code>, respectively.
For <code><h- data-h=id>sort</h-></code>, the definitions and requirements in <a href=https://eel%2eis/c++draft/alg%2esorting>[alg.sorting]</a> apply.
</p></diff-block>

<p>Change <a href=https://eel%2eis/c++draft/list%2eops#1>[list.ops] paragraph 1</a> as follows:
</p>
<diff-block>
<p>In this subclause,
arguments for a template parameter
named <code><h- data-h=id>Predicate</h-></code> or <code><h- data-h=id>BinaryPredicate</h-></code>
shall meet the corresponding requirements in <a href=https://eel%2eis/c++draft/algorithms%2erequirements>[algorithms.requirements]</a>.
The semantics of <code><h- data-h=id>i</h-> <h- data-h=sym_op>+</h-> <h- data-h=id>n</h-></code>,
where <code><h- data-h=id>i</h-></code> is an iterator into the list and <code><h- data-h=id>n</h-></code> is <del>an integer</del> <ins>of integral type</ins>,
are the same as those of <code><h- data-h=id>next</h-><h- data-h=sym_par>(</h-><h- data-h=id>i</h-><h- data-h=sym_punc>,</h-> <h- data-h=id>n</h-><h- data-h=sym_par>)</h-></code>.
The expression <code><h- data-h=id>i</h-> <h- data-h=sym_op>-</h-> <h- data-h=id>n</h-></code>,
where <code><h- data-h=id>i</h-></code> is an iterator into the list and <code><h- data-h=id>n</h-></code> is an integer,
means an iterator <code><h- data-h=id>j</h-></code> such that <code><h- data-h=id>j</h-> <h- data-h=sym_op>+</h-> <h- data-h=id>n</h-> <h- data-h=sym_op>==</h-> <h- data-h=id>i</h-></code> is <code><h- data-h=bool>true</h-></code>.
For <code><h- data-h=id>merge</h-></code> and <code><h- data-h=id>sort</h-></code>,
the definitions and requirements in <a href=https://eel%2eis/c++draft/alg%2esorting>[alg.sorting]</a> apply.
</p></diff-block>

<p>Change <a href=https://eel%2eis/c++draft/mdspan%2eextents%2eoverview#1>[mdspan.extents.overview] paragraph 1</a> as follows:
</p>
<diff-block>
<p><i>Mandates</i>:
</p><ul>
<li><code><h- data-h=id>IndexType</h-></code> <del>is a signed or unsigned integer type</del> <ins>models <code><h- data-h=id>integer</h-></code></ins>, and</li>
<li>
each element of <code><h- data-h=id>Extents</h-></code> is either equal to <code><h- data-h=id>dynamic_extent</h-></code>,
or is representable as a value of type <code><h- data-h=id>IndexType</h-></code>.
</li>
</ul>
</diff-block>

<p>Change <a href=https://eel%2eis/c++draft/mdspan%2esub%2estrided%2eslice#3>[mdspan.sub.strided.slice] paragraph 3</a> as follows:
</p>
<diff-block>
<p><i>Mandates</i>:
<ins>Each of the types</ins>
<code><h- data-h=id>OffsetType</h-></code>, <code><h- data-h=id>ExtentType</h-></code>, and <code><h- data-h=id>StrideType</h-></code>
<del>are signed or unsigned integer types, or</del>
<ins>models <code><h- data-h=id>integer</h-></code> or</ins>
<code><i><h- data-h=id>integral-constant-like</h-></i></code>.
</p></diff-block>

<note-block><p><intro-></intro-> 
The "each of the types" part clarifies the wording
in the same style as more recent wording in <a href=https://eel%2eis/c++draft/numerics%2ec%2eckdint>[numerics.c.ckdint]</a>.
</p></note-block>

<p>Change <a href=https://eel%2eis/c++draft/mdspan%2esub%2ehelpers#1>[mdspan.sub.helpers] paragraph 1</a>
and <a href=https://eel%2eis/c++draft/mdspan%2esub%2ehelpers#10>[mdspan.sub.helpers] paragraph 10</a>
as follows:
</p>
<diff-block>
<p><i>Mandates</i>:
<code><h- data-h=id>IndexType</h-></code>
<del>is a signed or unsigned integer type</del>
<ins>models <code><h- data-h=id>integer</h-></code></ins>.
</p></diff-block>

<p>Change <a href=https://eel%2eis/c++draft/ranges%2esyn#1>[ranges.syn] paragraph 1</a> as follows:
</p>
<diff-block>
<p>Within this Clause,
for an integer-like type <code><h- data-h=id>X</h-></code> (<a href=https://eel%2eis/c++draft/iterator%2econcept%2ewinc>[iterator.concept.winc]</a>),
<code><i><h- data-h=id>make-unsigned-like-t</h-></i><h- data-h=sym_op>&lt;</h-><h- data-h=id>X</h-><h- data-h=sym_op>&gt;</h-></code> denotes
<code><h- data-h=id_type>make_unsigned_t</h-><h- data-h=sym_op>&lt;</h-><h- data-h=id>X</h-><h- data-h=sym_op>&gt;</h-></code> if <code><h- data-h=id>X</h-></code> is an <del>integer</del> <ins>integral</ins> type;
otherwise, it denotes a corresponding unspecified unsigned-integer-like type
of the same width as <code><h- data-h=id>X</h-></code>.
For an expression <code><h- data-h=id>x</h-></code> of type <code><h- data-h=id>X</h-></code>,
<code><i><h- data-h=id>to-unsigned-like</h-></i><h- data-h=sym_par>(</h-><h- data-h=id>x</h-><h- data-h=sym_par>)</h-></code> is
<code><h- data-h=id>x</h-></code> explicitly converted to
<code><i><h- data-h=id>make-unsigned-like-t</h-></i><h- data-h=sym_op>&lt;</h-><h- data-h=id>X</h-><h- data-h=sym_op>&gt;</h-></code>.
</p></diff-block>

<p>Change <a href=https://eel%2eis/c++draft/ranges%2esyn#2>[ranges.syn] paragraph 2</a> as follows:
</p>
<diff-block>
<p>Also within this Clause,
<code><i><h- data-h=id>make-signed-like-t</h-></i><h- data-h=sym_op>&lt;</h-><h- data-h=id>X</h-><h- data-h=sym_op>&gt;</h-></code> for an integer-like type <code><h- data-h=id>X</h-></code>
denotes <code><h- data-h=id_type>make_signed_t</h-><h- data-h=sym_op>&lt;</h-><h- data-h=id>X</h-><h- data-h=sym_op>&gt;</h-></code> if <code><h- data-h=id>X</h-></code> is an <del>integer</del> <ins>integral</ins> type;
otherwise, it denotes a corresponding unspecified signed-integer-like type
of the same width as <code><h- data-h=id>X</h-></code>.
</p></diff-block>

<p>Change <a href=https://eel%2eis/c++draft/numeric%2eops%2egcd#1>[numeric.ops.gcd] paragraph 1</a> and
<a href=https://eel%2eis/c++draft/numeric%2eops%2elcm#1>[numeric.ops.lcm] paragraph 1</a> as follows:
</p>
<diff-block>
<p><i>Mandates</i>:
<code><h- data-h=id>M</h-></code> and <code><h- data-h=id>N</h-></code> both are <del>integer</del> <ins>integral</ins> types other than <code><h- data-h=kw_type>bool</h-></code>.
</p></diff-block>

<p>Change <a href=https://eel%2eis/c++draft/numeric%2eops%2emidpoint#1>[numeric.ops.midpoint] paragraph 1</a> as follows:
</p>
<diff-block>
<p><i>Returns</i>:
Half the sum of <code><h- data-h=id>a</h-></code> and <code><h- data-h=id>b</h-></code>.
If <code><h- data-h=id>T</h-></code> is an <del>integer</del> <ins>integral</ins> type and the sum is odd,
the result is rounded towards <code><h- data-h=id>a</h-></code>.
</p></diff-block>

<p>In <a href=https://eel%2eis/c++draft/numeric%2esat%2efunc>[numeric.sat.func]</a>,
change paragraphs 2, 4, 6, and 8 as follows:
</p>
<diff-block>
<p><i>Constraints</i>:
<code><h- data-h=id>T</h-></code>
<del>is a signed or unsigned integer type ([basic.fundamental])</del>
<ins>models <code><h- data-h=id>integer</h-></code></ins>.
</p></diff-block>

<p>Change <a href=https://eel%2eis/c++draft/numeric%2esat%2ecast#1>[numeric.sat.cast] paragraph 1</a> as follows:
</p>
<diff-block>
<p><i>Constraints</i>:
<code><h- data-h=id>R</h-></code> and <code><h- data-h=id>T</h-></code>
<del>are signed or unsigned integer types ([basic.fundamental])</del>
<ins>model <code><h- data-h=id>integer</h-></code></ins>.
</p></diff-block>

<p>Change <a href=https://eel%2eis/c++draft/charconv%2esyn#1>[charconv.syn] paragraph 1</a> as follows:
</p>
<diff-block>
<p>When a function is specified
with a type placeholder of <tt-><i><h- data-h=id>integer-type</h-></i></tt->,
the implementation provides overloads
for <code><h- data-h=kw_type>char</h-></code> and all <del>cv-unqualified signed and unsigned integer</del> <ins>integer</ins> types
in lieu of <tt-><i><h- data-h=id>integer-type</h-></i></tt->.
When a function is specified
with a type placeholder of <tt-><i><h- data-h=id>floating-point-type</h-></i></tt->,
the implementation provides overloads
for all cv-unqualified floating-point types (<a href=https://eel%2eis/c++draft/basic%2efundamental>[basic.fundamental]</a>)
in lieu of <tt-><i><h- data-h=id>floating-point-type</h-></i></tt->.
</p></diff-block>

<note-block><p><intro-></intro-> 
Signed or unsigned integer types are already cv-unqualified;
this wording used to be redundant.
</p></note-block>

<p>Change <a href=https://eel%2eis/c++draft/format%2estring%2estd#10>[format.string.std] paragraph 10</a> as follows:
</p>
<diff-block>
<p>If <tt->{ <i><h- data-h=id>arg-id</h-></i><sub><f-serif>opt</f-serif></sub> }</tt-> is used in a <g-term>width or precision</g-term> option,
the value of the corresponding formatting argument
is used as the value of the option.
The option is valid only if the corresponding formatting argument
is of <del>signed or unsigned</del> integer type.
If its value is negative, an exception of type <code><h- data-h=id>format_error</h-></code> is thrown.
</p></diff-block>

<p>Change <a href=https://eel%2eis/c++draft/cmplx%2eover#2%2e2>[cmplx.over] paragraph 2, bullet 2</a> as follows:
</p>
<diff-block>
<p>Otherwise, if the argument has <del>integer</del> <ins>integral</ins> type,
then it is effectively cast to <code><h- data-h=kw>complex</h-><h- data-h=sym_op>&lt;</h-><h- data-h=kw_type>double</h-><h- data-h=sym_op>&gt;</h-></code>.
</p></diff-block>

<p>Change <a href=https://eel%2eis/c++draft/cmplx%2eover#3>[cmplx.over] paragraph 3</a> as follows:
</p>
<diff-block>
<p>Function template <code><h- data-h=id>pow</h-></code> has additional constexpr overloads sufficient to ensure,
for a call with one argument of type <code><h- data-h=kw>complex</h-><h- data-h=sym_op>&lt;</h-><h- data-h=id>T1</h-><h- data-h=sym_op>&gt;</h-></code> and
the other argument of type <code><h- data-h=id>T2</h-></code> or <code><h- data-h=kw>complex</h-><h- data-h=sym_op>&lt;</h-><h- data-h=id>T2</h-><h- data-h=sym_op>&gt;</h-></code>,
both arguments are effectively cast to <code><h- data-h=kw>complex</h-><h- data-h=sym_op>&lt;</h-><h- data-h=id_type>common_type_t</h-><h- data-h=sym_op>&lt;</h-><h- data-h=id>T1</h-><h- data-h=sym_punc>,</h-> <h- data-h=id>T3</h-><h- data-h=sym_op>&gt;&gt;</h-></code>,
where <code><h- data-h=id>T3</h-></code> is
<code><h- data-h=kw_type>double</h-></code> if <code><h- data-h=id>T2</h-></code> is an <del>integer</del> <ins>integral</ins> type and <code><h- data-h=id>T2</h-></code> otherwise.
If <code><h- data-h=id_type>common_type_t</h-><h- data-h=sym_op>&lt;</h-><h- data-h=id>T1</h-><h- data-h=sym_punc>,</h-> <h- data-h=id>T3</h-><h- data-h=sym_op>&gt;</h-></code> is not well-formed,
then the program is ill-formed.
</p></diff-block>

<p>Change <a href=https://eel%2eis/c++draft/rand%2eutil%2eseedseq#2>[rand.util.seedseq] paragraph 2</a> as follows:
</p>
<diff-block>
<p><i>Constraints</i>:
<code><h- data-h=id>T</h-></code> <del>is an integer type</del> <ins>models <code><h- data-h=id>integral</h-></code></ins>.
</p></diff-block>

<p>Change <a href=https://eel%2eis/c++draft/rand%2eutil%2eseedseq#4>[rand.util.seedseq] paragraph 4</a> as follows:
</p>
<diff-block>
<p><i>Mandates</i>:
<code><h- data-h=id>iterator_traits</h-><h- data-h=sym_op>&lt;</h-><h- data-h=id>InputIterator</h-><h- data-h=sym_op>&gt;</h-><h- data-h=sym_op>::</h-><h- data-h=id>value_type</h-></code>
<del>is an integer type</del> <ins>models <code><h- data-h=id>integral</h-></code></ins>.
</p></diff-block>

<p>Change <a href=https://eel%2eis/c++draft/numerics%2ec%2eckdint#1>[numerics.c.ckdint] paragraph 1</a> as follows:
</p>
<diff-block>
<p><i>Mandates</i>:
Each of the types <code><h- data-h=id>type1</h-></code>, <code><h- data-h=id>type2</h-></code>, and <code><h- data-h=id>type3</h-></code>
<del>is a cv-unqualified signed or unsigned integer type</del>
<ins>models <code><h- data-h=id>integer</h-></code></ins>.
</p></diff-block>

<p>Change <a href=https://eel%2eis/c++draft/cmath%2esyn#3>[cmath.syn] paragraph 3</a> as follows:
</p>
<diff-block>
<p>For each function
with at least one parameter of type <tt-><i><h- data-h=id>floating-point-type</h-></i></tt->
other than <code><h- data-h=id>abs</h-></code>,
the implementation also provides additional overloads sufficient to ensure that,
if every argument corresponding to
a <tt-><i><h- data-h=id>floating-point-type</h-></i></tt-> parameter has arithmetic type,
then every such argument is effectively cast to the floating-point type
with the greatest floating-point conversion rank and
greatest floating-point conversion subrank
among the types of all such arguments,
where arguments of <del>integer</del> <ins>integral</ins> type are considered to have
the same floating-point conversion rank as <code><h- data-h=kw_type>double</h-></code>.
If no such floating-point type with the greatest rank and subrank exists,
then overload resolution does not result in
a usable candidate (<a href=https://eel%2eis/c++draft/over%2ematch%2egeneral>[over.match.general]</a>)
from the overloads provided by the implementation.
</p></diff-block>

<p>Change <a href=https://eel%2eis/c++draft/simd%2ector#7%2e2>[simd.ctor] paragraph 7, bullet 2</a> as follows:
</p>
<diff-block>
<p>both <code><h- data-h=id>U</h-></code> and <code><h- data-h=id>value_type</h-></code> are integral types and the <del>integer</del> <ins>integral</ins>
conversion rank (<a href=https://eel%2eis/c++draft/conv%2erank>[conv.rank]</a>) of <code><h- data-h=id>U</h-></code> is greater than the <del>integer</del> <ins>integral</ins>
conversion rank of <code><h- data-h=id>value_type</h-></code>, or
</p></diff-block>

<p>Change the title of <a href=https://eel%2eis/c++draft/atomics%2etypes%2eint>[atomics.types.int]</a> as follows:
</p>
<diff-block>
<p><b>Specializations for <del>integers</del> <ins>integral types</ins></b>
</p></diff-block>

<h2 id=references><a class=para href=#references></a>5. References</h2>





<div class=bib><div class=bib-item>
<a href="https://wg21%2elink/n5008">[N5008]</a>
<span class=bib-author>Thomas Köppe.</span>
<span class=bib-title>Working Draft, Programming Languages — C++</span>
<span class=bib-date>2025-03-15</span>
<a href="https://www%2eopen-std%2eorg/jtc1/sc22/wg21/docs/papers/2025/n5008%2epdf" class=bib-link>https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/n5008.pdf</a></div><div class=bib-item>
<a href="https://github%2ecom/search?q=language%253AC%252B%252B+%252Fstd%253A%253Aintegral%255B+%253C%255D%252F&type=code">[GitHubSearch]</a>
<span class=bib-title>GitHub code search for uses of std::integral</span>
<a href="https://github%2ecom/search?q=language%253AC%252B%252B+%252Fstd%253A%253Aintegral%255B+%253C%255D%252F&type=code" class=bib-link>https://github.com/search?q=language%3AC%2B%2B+%2Fstd%3A%3Aintegral%5B+%3C%5D%2F&amp;type=code</a></div><div class=bib-item>
<a href="https://wg21%2elink/P3003">[P3003]</a>
<span class=bib-author>Johel Ernesto Guerrero Pe~na.</span>
<span class=bib-title>The design of a library of number concepts</span>
<a href="https://www%2eopen-std%2eorg/jtc1/sc22/wg21/docs/papers/2023/p3003r0%2epdf" class=bib-link>https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p3003r0.pdf</a></div></div>
</main></body>
</html>
