Federated via graft
0

Configure Feed

Select the types of activity you want to include in your feed.

graft-presentation / presentation-fr.html
156 kB 1303 lines
1<!DOCTYPE html><html lang="fr-FR"><head><title>Forges &amp; web décentralisé</title><meta property="og:title" content="Forges &amp; web décentralisé"><meta charset="UTF-8"><meta name="viewport" content="width=device-width,height=device-height,initial-scale=1.0"><meta name="apple-mobile-web-app-capable" content="yes"><meta http-equiv="X-UA-Compatible" content="ie=edge"><meta property="og:type" content="website"><meta name="twitter:card" content="summary"><style>@media screen{body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button,body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button,body[data-bespoke-view=overview] button.bespoke-marp-overview-close,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container .bespoke-marp-presenter-info-page-area .bespoke-marp-presenter-info-page,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container button,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container button{appearance:none;background-color:initial;border:0;color:inherit;cursor:pointer;font-size:inherit;opacity:.8;outline:none;padding:0;transition:opacity .2s linear;-webkit-tap-highlight-color:transparent}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button:disabled,body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button:disabled,body[data-bespoke-view=overview] button.bespoke-marp-overview-close:disabled,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container .bespoke-marp-presenter-info-page-area .bespoke-marp-presenter-info-page:disabled,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container button:disabled,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container button:disabled{cursor:not-allowed;opacity:.15!important}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button:hover,body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button:hover,body[data-bespoke-view=overview] button.bespoke-marp-overview-close:hover,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container .bespoke-marp-presenter-info-page-area .bespoke-marp-presenter-info-page:hover,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container button:hover,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container button:hover{opacity:1}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button:hover:active,body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button:hover:active,body[data-bespoke-view=overview] button.bespoke-marp-overview-close:hover:active,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container .bespoke-marp-presenter-info-page-area .bespoke-marp-presenter-info-page:hover:active,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container button:hover:active,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container button:hover:active{opacity:.6}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button:hover:not(:disabled),body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button:hover:not(:disabled),body[data-bespoke-view=overview] button.bespoke-marp-overview-close:hover:not(:disabled),body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container .bespoke-marp-presenter-info-page-area .bespoke-marp-presenter-info-page:hover:not(:disabled),body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container button:hover:not(:disabled),body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container button:hover:not(:disabled){transition:none}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=prev],body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=prev],body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container button.bespoke-marp-presenter-info-page-prev{background:#0000 url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSI1IiBkPSJNNjggOTAgMjggNTBsNDAtNDAiLz48L3N2Zz4=") no-repeat 50%;background-size:contain;overflow:hidden;text-indent:100%;white-space:nowrap}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=next],body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=next],body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container button.bespoke-marp-presenter-info-page-next{background:#0000 url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSI1IiBkPSJtMzIgOTAgNDAtNDAtNDAtNDAiLz48L3N2Zz4=") no-repeat 50%;background-size:contain;overflow:hidden;text-indent:100%;white-space:nowrap}:is(body[data-bespoke-view=""],body[data-bespoke-view=next]) .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=fullscreen]{background:#0000 url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48ZGVmcz48c3R5bGU+LmF7ZmlsbDpub25lO3N0cm9rZTojZmZmO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6NXB4fTwvc3R5bGU+PC9kZWZzPjxyZWN0IHdpZHRoPSI4MCIgaGVpZ2h0PSI2MCIgeD0iMTAiIHk9IjIwIiBjbGFzcz0iYSIgcng9IjUuNjciLz48cGF0aCBkPSJNNDAgNzBIMjBWNTBtMjAgMEwyMCA3MG00MC00MGgyMHYyMG0tMjAgMCAyMC0yMCIgY2xhc3M9ImEiLz48L3N2Zz4=") no-repeat 50%;background-size:contain;overflow:hidden;text-indent:100%;white-space:nowrap}:is(body[data-bespoke-view=""],body[data-bespoke-view=next]) .bespoke-marp-parent>.bespoke-marp-osc>button.exit[data-bespoke-marp-osc=fullscreen]{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48ZGVmcz48c3R5bGU+LmF7ZmlsbDpub25lO3N0cm9rZTojZmZmO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6NXB4fTwvc3R5bGU+PC9kZWZzPjxyZWN0IHdpZHRoPSI4MCIgaGVpZ2h0PSI2MCIgeD0iMTAiIHk9IjIwIiBjbGFzcz0iYSIgcng9IjUuNjciLz48cGF0aCBkPSJNMjAgNTBoMjB2MjBtLTIwIDAgMjAtMjBtNDAgMEg2MFYzMG0yMCAwTDYwIDUwIiBjbGFzcz0iYSIvPjwvc3ZnPg==")}:is(body[data-bespoke-view=""],body[data-bespoke-view=next]) .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=presenter]{background:#0000 url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSI1IiBkPSJNODcuOCA0Ny41Qzg5IDUwIDg3LjcgNTIgODUgNTJIMzVhOC43IDguNyAwIDAgMS03LjItNC41bC0xNS42LTMxQzExIDE0IDEyLjIgMTIgMTUgMTJoNTBhOC44IDguOCAwIDAgMSA3LjIgNC41ek02MCA1MnYzNm0tMTAgMGgyME00NSA0MmgyMCIvPjwvc3ZnPg==") no-repeat 50%;background-size:contain;overflow:hidden;text-indent:100%;white-space:nowrap}body[data-bespoke-view=overview] button.bespoke-marp-overview-close,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container button.bespoke-marp-presenter-note-bigger{background:#0000 url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48cGF0aCBzdHJva2U9IiNmZmYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSI1IiBkPSJNMTIgNTBoODBNNTIgOTBWMTAiLz48L3N2Zz4=") no-repeat 50%;background-size:contain;overflow:hidden;text-indent:100%;white-space:nowrap}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container button.bespoke-marp-presenter-note-smaller{background:#0000 url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSI1IiBkPSJNMTIgNTBoODAiLz48L3N2Zz4=") no-repeat 50%;background-size:contain;overflow:hidden;text-indent:100%;white-space:nowrap}:is(body[data-bespoke-view=""],body[data-bespoke-view=next]) .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=overview]{background:#0000 url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48ZGVmcz48c3R5bGU+LmF7ZmlsbDpub25lO3N0cm9rZTojZmZmO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6NXB4O3J4OjVweDtyeTo1cHg7d2lkdGg6MjVweDtoZWlnaHQ6MjVweH08L3N0eWxlPjwvZGVmcz48cmVjdCB4PSIyMCIgeT0iMjAiIGNsYXNzPSJhIi8+PHJlY3QgeD0iNTUiIHk9IjIwIiBjbGFzcz0iYSIvPjxyZWN0IHg9IjIwIiB5PSI1NSIgY2xhc3M9ImEiLz48cmVjdCB4PSI1NSIgeT0iNTUiIGNsYXNzPSJhIi8+PC9zdmc+") no-repeat 50%;background-size:contain;overflow:hidden;text-indent:100%;white-space:nowrap}}@keyframes __bespoke_marp_transition_reduced_outgoing__{0%{opacity:1}to{opacity:0}}@keyframes __bespoke_marp_transition_reduced_incoming__{0%{mix-blend-mode:plus-lighter;opacity:0}to{mix-blend-mode:plus-lighter;opacity:1}}.bespoke-marp-note,.bespoke-marp-osc,.bespoke-progress-parent{display:none;transition:none}@media screen{::view-transition-group(*){animation-duration:var(--marp-bespoke-transition-animation-duration,.5s);animation-timing-function:ease}::view-transition-new(*),::view-transition-old(*){animation-delay:0s;animation-direction:var(--marp-bespoke-transition-animation-direction,normal);animation-duration:var(--marp-bespoke-transition-animation-duration,.5s);animation-fill-mode:both;animation-name:var(--marp-bespoke-transition-animation-name,var(--marp-bespoke-transition-animation-name-fallback,__bespoke_marp_transition_no_animation__));mix-blend-mode:normal}::view-transition-old(*){--marp-bespoke-transition-animation-name-fallback:__bespoke_marp_transition_reduced_outgoing__;animation-timing-function:ease}::view-transition-new(*){--marp-bespoke-transition-animation-name-fallback:__bespoke_marp_transition_reduced_incoming__;animation-timing-function:ease}::view-transition-new(root),::view-transition-old(root){animation-timing-function:linear}::view-transition-new(__bespoke_marp_transition_osc__),::view-transition-old(__bespoke_marp_transition_osc__){animation-duration:0s!important;animation-name:__bespoke_marp_transition_osc__!important}::view-transition-new(__bespoke_marp_transition_osc__){opacity:0!important}.bespoke-marp-transition-warming-up::view-transition-group(*),.bespoke-marp-transition-warming-up::view-transition-new(*),.bespoke-marp-transition-warming-up::view-transition-old(*){animation-play-state:paused!important}body,html{height:100%;margin:0}body{background:#000;overflow:hidden}svg.bespoke-marp-slide{content-visibility:hidden;interactivity:inert;opacity:0;pointer-events:none;z-index:-1}svg.bespoke-marp-slide:not(.bespoke-marp-active) *{view-transition-name:none!important}svg.bespoke-marp-slide.bespoke-marp-active{content-visibility:visible;interactivity:auto;opacity:1;pointer-events:auto;z-index:0}svg.bespoke-marp-slide.bespoke-marp-active.bespoke-marp-active-ready *{animation-name:__bespoke_marp__!important}@supports not (content-visibility:hidden){svg.bespoke-marp-slide[data-bespoke-marp-load=hideable]{display:none}svg.bespoke-marp-slide[data-bespoke-marp-load=hideable].bespoke-marp-active{display:block}}}@media screen and (prefers-reduced-motion:reduce){svg.bespoke-marp-slide *{view-transition-name:none!important}}@media screen{[data-bespoke-marp-fragment=inactive]{visibility:hidden}:is(body[data-bespoke-view=""],body[data-bespoke-view=next]) .bespoke-marp-parent{inset:0;position:absolute}:is(body[data-bespoke-view=""],body[data-bespoke-view=next]) .bespoke-marp-parent>.bespoke-marp-osc{background:#000000a6;border-radius:7px;bottom:50px;color:#fff;contain:paint;display:block;font-family:Helvetica,Arial,sans-serif;font-size:16px;left:50%;line-height:0;opacity:1;padding:12px;position:absolute;touch-action:manipulation;transform:translateX(-50%);transition:opacity .2s linear;-webkit-user-select:none;user-select:none;view-transition-name:__bespoke_marp_transition_osc__;white-space:nowrap;will-change:transform;z-index:1}:is(body[data-bespoke-view=""],body[data-bespoke-view=next]) .bespoke-marp-parent>.bespoke-marp-osc>:where(*){margin-left:6px}:is(body[data-bespoke-view=""],body[data-bespoke-view=next]) .bespoke-marp-parent>.bespoke-marp-osc>:where(*):where(:first-child){margin-left:0}:is(body[data-bespoke-view=""],body[data-bespoke-view=next]) .bespoke-marp-parent>.bespoke-marp-osc>span{opacity:.8}:is(body[data-bespoke-view=""],body[data-bespoke-view=next]) .bespoke-marp-parent>.bespoke-marp-osc>span[data-bespoke-marp-osc=page]{display:inline-block;min-width:140px;text-align:center}:is(body[data-bespoke-view=""],body[data-bespoke-view=next]) .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=fullscreen],:is(body[data-bespoke-view=""],body[data-bespoke-view=next]) .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=next],:is(body[data-bespoke-view=""],body[data-bespoke-view=next]) .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=overview],:is(body[data-bespoke-view=""],body[data-bespoke-view=next]) .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=presenter],:is(body[data-bespoke-view=""],body[data-bespoke-view=next]) .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=prev]{height:32px;line-height:32px;width:32px}:is(body[data-bespoke-view=""],body[data-bespoke-view=next]) .bespoke-marp-parent.bespoke-marp-inactive{cursor:none}:is(body[data-bespoke-view=""],body[data-bespoke-view=next]) .bespoke-marp-parent.bespoke-marp-inactive>.bespoke-marp-osc{opacity:0;pointer-events:none}:is(body[data-bespoke-view=""],body[data-bespoke-view=next]) svg.bespoke-marp-slide{height:100%;left:0;position:absolute;top:0;width:100%}body[data-bespoke-view=""] .bespoke-progress-parent{background:#222;display:flex;height:5px;width:100%}body[data-bespoke-view=""] .bespoke-progress-parent+:where(.bespoke-marp-parent){top:5px}body[data-bespoke-view=""] .bespoke-progress-parent .bespoke-progress-bar{background:#0288d1;flex:0 0 0;transition:flex-basis .2s cubic-bezier(0,1,1,1)}body[data-bespoke-view=next]{background:#0000}body[data-bespoke-view=presenter]{background:#161616}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container{display:grid;font-family:Helvetica,Arial,sans-serif;grid-template:"current dragbar next" minmax(140px,1fr) "current dragbar note" 2fr "info dragbar note" 3em;grid-template-columns:minmax(3px,var(--bespoke-marp-presenter-split-ratio,66%)) 0 minmax(3px,1fr);height:100%;left:0;position:absolute;top:0;width:100%}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container :where(.bespoke-marp-parent){grid-area:current;overflow:hidden;position:relative}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container :where(.bespoke-marp-parent) :where(svg.bespoke-marp-slide){height:calc(100% - 40px);left:20px;pointer-events:none;position:absolute;top:20px;-webkit-user-select:none;user-select:none;width:calc(100% - 40px)}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container :where(.bespoke-marp-parent) :where(svg.bespoke-marp-slide).bespoke-marp-active{filter:drop-shadow(0 3px 10px rgba(0,0,0,.5))}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-dragbar-container{background:#0288d1;cursor:col-resize;grid-area:dragbar;margin-left:-3px;opacity:0;position:relative;transition:opacity .4s linear .1s;width:6px;z-index:10}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-dragbar-container:hover{opacity:1}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-dragbar-container.active{opacity:1;transition-delay:0s}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-next-container{background:#222;cursor:pointer;display:none;grid-area:next;overflow:hidden;position:relative}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-next-container.active{display:block}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-next-container iframe.bespoke-marp-presenter-next{background:#0000;border:0;display:block;filter:drop-shadow(0 3px 10px rgba(0,0,0,.5));height:calc(100% - 40px);left:20px;pointer-events:none;position:absolute;interactivity:inert;top:20px;-webkit-user-select:none;user-select:none;width:calc(100% - 40px)}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container{background:#222;color:#eee;grid-area:note;position:relative;z-index:1}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container button{height:1.5em;line-height:1.5em;width:1.5em}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-presenter-note-wrapper{display:block;inset:0;position:absolute}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-presenter-note-buttons{background:#000000a6;border-radius:4px;bottom:0;display:flex;gap:4px;margin:12px;opacity:0;padding:6px;pointer-events:none;position:absolute;right:0;transition:opacity .2s linear}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-presenter-note-buttons:focus-within,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-presenter-note-wrapper:focus-within+.bespoke-marp-presenter-note-buttons,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container:hover .bespoke-marp-presenter-note-buttons{opacity:1;pointer-events:auto}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-note{box-sizing:border-box;font-size:calc(1.1em*var(--bespoke-marp-note-font-scale, 1));height:calc(100% - 40px);margin:20px;overflow:auto;padding-right:3px;white-space:pre-wrap;width:calc(100% - 40px);word-wrap:break-word;scrollbar-color:#eeeeee80 #0000;scrollbar-width:thin}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-note::-webkit-scrollbar{width:6px}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-note::-webkit-scrollbar-track{background:#0000}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-note::-webkit-scrollbar-thumb{background:#eeeeee80;border-radius:6px}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-note:empty{pointer-events:none}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-note.active{display:block}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-note p:first-child{margin-top:0}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-note p:last-child{margin-bottom:0}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container{align-items:center;box-sizing:border-box;color:#eee;display:flex;flex-wrap:nowrap;grid-area:info;justify-content:center;overflow:hidden;padding:0 10px}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container :is(.bespoke-marp-presenter-info-page-area,.bespoke-marp-presenter-info-time,.bespoke-marp-presenter-info-timer){box-sizing:border-box;display:block;padding:0 10px;white-space:nowrap;width:100%}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container button{height:1.5em;line-height:1.5em;width:1.5em}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container .bespoke-marp-presenter-info-page-area{order:2;text-align:center}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container .bespoke-marp-presenter-info-page-area .bespoke-marp-presenter-info-page{display:inline-block;min-width:120px;text-align:center}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container .bespoke-marp-presenter-info-time{color:#999;order:1;text-align:left}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container .bespoke-marp-presenter-info-timer{color:#999;order:3;text-align:right}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container .bespoke-marp-presenter-info-timer:hover{cursor:pointer}body[data-bespoke-view=overview]{background:#161616;overflow:auto}body[data-bespoke-view=overview] [data-bespoke-marp-fragment=inactive]{visibility:visible}body[data-bespoke-view=overview] .bespoke-marp-overview-header{backdrop-filter:blur(4px);background:#222222d9;box-shadow:0 3px 10px #00000080;box-sizing:border-box;display:flex;height:48px;inset:0 0 auto;justify-content:flex-end;padding:10px;position:fixed;z-index:1}body[data-bespoke-view=overview] button.bespoke-marp-overview-close{height:28px;line-height:28px;transform:rotate(45deg);width:28px}body[data-bespoke-view=overview] .bespoke-marp-parent{display:grid;gap:40px;grid-template-columns:repeat(auto-fit,minmax(0,240px));justify-content:space-around;padding:30px}body[data-bespoke-view=overview] .bespoke-marp-parent svg.bespoke-marp-slide{--bov-selected:#0000;--bov-focus:#161616;--bov-focus-outline:#0000;background-image:conic-gradient(#161616 0 0),conic-gradient(var(--bov-focus) 0 0),conic-gradient(var(--bov-focus-outline) 0 0),conic-gradient(var(--bov-selected) 0 0);background-position:5px 5px,3px 3px,2px 2px,0 0;background-repeat:no-repeat;background-size:calc(100% - 10px) calc(100% - 10px),calc(100% - 6px) calc(100% - 6px),calc(100% - 4px) calc(100% - 4px),100% 100%;content-visibility:visible;cursor:pointer;filter:drop-shadow(0 3px 10px rgba(0,0,0,.5));margin:-6px;padding:6px;interactivity:auto;opacity:1;outline:0;pointer-events:auto;scroll-margin-block:30px;width:100%;z-index:0}body[data-bespoke-view=overview] .bespoke-marp-parent svg.bespoke-marp-slide *,body[data-bespoke-view=overview] .bespoke-marp-parent svg.bespoke-marp-slide.bespoke-marp-active *{pointer-events:none;interactivity:inert}body[data-bespoke-view=overview] .bespoke-marp-parent :is(svg.bespoke-marp-slide:active,svg.bespoke-marp-slide:focus-visible,svg.bespoke-marp-slide:hover){--bov-focus-outline:#161616}body[data-bespoke-view=overview] .bespoke-marp-parent svg.bespoke-marp-slide:focus-visible,body[data-bespoke-view=overview] .bespoke-marp-parent svg.bespoke-marp-slide:hover{--bov-focus:#999}body[data-bespoke-view=overview] .bespoke-marp-parent svg.bespoke-marp-slide:active{--bov-focus:#eee}body[data-bespoke-view=overview] .bespoke-marp-parent svg.bespoke-marp-slide.bespoke-marp-active{--bov-selected:#0288d1}body[data-bespoke-view=overview]:has(.bespoke-marp-overview-header) .bespoke-marp-parent{padding-top:78px}body[data-bespoke-view=overview]:has(.bespoke-marp-overview-header) .bespoke-marp-parent svg.bespoke-marp-slide{scroll-margin-top:78px}.bespoke-marp-overview{background:#000000a6;inset:0;opacity:0;pointer-events:none;position:fixed;transition:opacity .1s ease;z-index:10}.bespoke-marp-overview iframe{background:#222;border:0;display:block;height:100%;left:0;position:absolute;top:0;width:100%}.bespoke-marp-overview[data-open="1"]{opacity:1;pointer-events:auto}}@media print{.bespoke-marp-overview,.bespoke-marp-presenter-info-container,.bespoke-marp-presenter-next-container,.bespoke-marp-presenter-note-container{display:none}}</style><style>@charset "UTF-8";@import "https://fonts.bunny.net/css?family=Lato:400,900|Roboto+Mono:400,700&display=swap";div#\:\$p > svg > foreignObject > section{width:1280px;height:720px;box-sizing:border-box;overflow:hidden;position:relative;scroll-snap-align:center center;-webkit-text-size-adjust:100%;text-size-adjust:100%}div#\:\$p > svg > foreignObject > section::after{bottom:0;content:attr(data-marpit-pagination);padding:inherit;pointer-events:none;position:absolute;right:0}div#\:\$p > svg > foreignObject > section:not([data-marpit-pagination])::after{display:none}div#\:\$p > svg > foreignObject > section :where(:is(h1, marp-h1)){font-size:2em;margin-block:0.67em}div#\:\$p > svg > foreignObject > section section:where(:is(h1, marp-h1)){--marpit-root-font-size: 2em}div#\:\$p > svg > foreignObject > section video::-webkit-media-controls{will-change:transform}@page {size:1280px 720px;margin:0}@media print{html, body{background-color:#fff;margin:0;page-break-inside:avoid;break-inside:avoid-page}div#\:\$p > svg > foreignObject > section{page-break-before:always;break-before:page}div#\:\$p > svg > foreignObject > section, div#\:\$p > svg > foreignObject > section *{-webkit-print-color-adjust:exact!important;animation-delay:0s!important;animation-duration:0s!important;color-adjust:exact!important;print-color-adjust:exact!important;transition:none!important}div#\:\$p > svg[data-marpit-svg]{display:block;height:100vh;width:100vw}}div#\:\$p > svg > foreignObject > :where(section){container-type:size}div#\:\$p > svg > foreignObject > section img[data-marp-twemoji]{background:transparent;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em;width:1em}/*! 2 * Marp / Marpit Gaia theme. 3 * 4 * @theme gaia 5 * @author Yuki Hattori 6 * 7 * @auto-scaling true 8 * @size 16:9 1280px 720px 9 * @size 4:3 960px 720px 10 */div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) code.hljs{display:block;overflow-x:auto;padding:1em}div#\:\$p > svg > foreignObject > section code.hljs{padding:3px 5px}div#\:\$p > svg > foreignObject > section .hljs{background:#000;color:#f8f8f8}div#\:\$p > svg > foreignObject > section .hljs-comment,div#\:\$p > svg > foreignObject > section .hljs-quote{color:#aeaeae;font-style:italic}div#\:\$p > svg > foreignObject > section .hljs-keyword,div#\:\$p > svg > foreignObject > section .hljs-selector-tag,div#\:\$p > svg > foreignObject > section .hljs-type{color:#e28964}div#\:\$p > svg > foreignObject > section .hljs-string{color:#65b042}div#\:\$p > svg > foreignObject > section .hljs-subst{color:#daefa3}div#\:\$p > svg > foreignObject > section .hljs-link,div#\:\$p > svg > foreignObject > section .hljs-regexp{color:#e9c062}div#\:\$p > svg > foreignObject > section .hljs-name,div#\:\$p > svg > foreignObject > section .hljs-section,div#\:\$p > svg > foreignObject > section .hljs-tag,div#\:\$p > svg > foreignObject > section .hljs-title{color:#89bdff}div#\:\$p > svg > foreignObject > section .hljs-class .hljs-title,div#\:\$p > svg > foreignObject > section .hljs-doctag,div#\:\$p > svg > foreignObject > section .hljs-title.class_{text-decoration:underline}div#\:\$p > svg > foreignObject > section .hljs-bullet,div#\:\$p > svg > foreignObject > section .hljs-number,div#\:\$p > svg > foreignObject > section .hljs-symbol{color:#3387cc}div#\:\$p > svg > foreignObject > section .hljs-params,div#\:\$p > svg > foreignObject > section .hljs-template-variable,div#\:\$p > svg > foreignObject > section .hljs-variable{color:#3e87e3}div#\:\$p > svg > foreignObject > section .hljs-attribute{color:#cda869}div#\:\$p > svg > foreignObject > section .hljs-meta{color:#8996a8}div#\:\$p > svg > foreignObject > section .hljs-formula{background-color:#0e2231;color:#f8f8f8;font-style:italic}div#\:\$p > svg > foreignObject > section .hljs-addition{background-color:#253b22;color:#f8f8f8}div#\:\$p > svg > foreignObject > section .hljs-deletion{background-color:#420e09;color:#f8f8f8}div#\:\$p > svg > foreignObject > section .hljs-selector-class{color:#9b703f}div#\:\$p > svg > foreignObject > section .hljs-selector-id{color:#8b98ab}div#\:\$p > svg > foreignObject > section .hljs-emphasis{font-style:italic}div#\:\$p > svg > foreignObject > section .hljs-strong{font-weight:700}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1),div#\:\$p > svg > foreignObject > section :is(h2, marp-h2),div#\:\$p > svg > foreignObject > section :is(h3, marp-h3),div#\:\$p > svg > foreignObject > section :is(h4, marp-h4),div#\:\$p > svg > foreignObject > section :is(h5, marp-h5),div#\:\$p > svg > foreignObject > section :is(h6, marp-h6){margin:.5em 0 0}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1) strong,div#\:\$p > svg > foreignObject > section :is(h2, marp-h2) strong,div#\:\$p > svg > foreignObject > section :is(h3, marp-h3) strong,div#\:\$p > svg > foreignObject > section :is(h4, marp-h4) strong,div#\:\$p > svg > foreignObject > section :is(h5, marp-h5) strong,div#\:\$p > svg > foreignObject > section :is(h6, marp-h6) strong{font-weight:inherit}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1)::part(auto-scaling),div#\:\$p > svg > foreignObject > section :is(h2, marp-h2)::part(auto-scaling),div#\:\$p > svg > foreignObject > section :is(h3, marp-h3)::part(auto-scaling),div#\:\$p > svg > foreignObject > section :is(h4, marp-h4)::part(auto-scaling),div#\:\$p > svg > foreignObject > section :is(h5, marp-h5)::part(auto-scaling),div#\:\$p > svg > foreignObject > section :is(h6, marp-h6)::part(auto-scaling){max-height:580px}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1){font-size:1.8em}div#\:\$p > svg > foreignObject > section :is(h2, marp-h2){font-size:1.5em}div#\:\$p > svg > foreignObject > section :is(h3, marp-h3){font-size:1.3em}div#\:\$p > svg > foreignObject > section :is(h4, marp-h4){font-size:1.1em}div#\:\$p > svg > foreignObject > section :is(h5, marp-h5){font-size:1em}div#\:\$p > svg > foreignObject > section :is(h6, marp-h6){font-size:.9em}div#\:\$p > svg > foreignObject > section blockquote,div#\:\$p > svg > foreignObject > section p{margin:1em 0 0}div#\:\$p > svg > foreignObject > section ol>li,div#\:\$p > svg > foreignObject > section ul>li{margin:.3em 0 0}div#\:\$p > svg > foreignObject > section ol>li>p,div#\:\$p > svg > foreignObject > section ul>li>p{margin:.6em 0 0}div#\:\$p > svg > foreignObject > section code{display:inline-block;font-family:Roboto Mono,monospace;font-size:.8em;letter-spacing:0;margin:-.1em .15em;padding:.1em .2em;vertical-align:baseline}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre){display:block;margin:1em 0 0;overflow:visible}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) code{box-sizing:border-box;margin:0;min-width:100%;padding:.5em;font-size:.7em}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre)::part(auto-scaling){max-height:calc(580px - 1em)}div#\:\$p > svg > foreignObject > section blockquote{margin:1em 0 0;padding:0 1em;position:relative}div#\:\$p > svg > foreignObject > section blockquote:after,div#\:\$p > svg > foreignObject > section blockquote:before{content:"“";display:block;font-family:Times New Roman,serif;font-weight:700;position:absolute}div#\:\$p > svg > foreignObject > section blockquote:before{top:0;left:0}div#\:\$p > svg > foreignObject > section blockquote:after{right:0;bottom:0;transform:rotate(180deg)}div#\:\$p > svg > foreignObject > section blockquote>:first-child{margin-top:0}div#\:\$p > svg > foreignObject > section mark{background:transparent}div#\:\$p > svg > foreignObject > section table{border-spacing:0;border-collapse:collapse;margin:1em 0 0}div#\:\$p > svg > foreignObject > section table td,div#\:\$p > svg > foreignObject > section table th{padding:.2em .4em;border-width:1px;border-style:solid}div#\:\$p > svg > foreignObject > section footer,div#\:\$p > svg > foreignObject > section header,div#\:\$p > svg > foreignObject > section:after{box-sizing:border-box;font-size:66%;height:70px;line-height:50px;overflow:hidden;padding:10px 25px;position:absolute}div#\:\$p > svg > foreignObject > section:after{--marpit-root-font-size:66%}div#\:\$p > svg > foreignObject > section header{top:0}div#\:\$p > svg > foreignObject > section footer,div#\:\$p > svg > foreignObject > section header{left:0;right:0}div#\:\$p > svg > foreignObject > section footer{bottom:0}div#\:\$p > svg > foreignObject > section{--color-background:light-dark(#fff8e1, #455a64);--color-background-stripe:light-dark( 11 rgba(69,90,100,.1), 12 rgba(255,248,225,.1) 13 );--color-foreground:light-dark(#455a64, #fff8e1);--color-dimmed:light-dark( 14 #6a7a7d, 15 #dad8c8 16 );--color-highlight:light-dark(#0288d1, #81d4fa);color-scheme:light;background-color:var(--color-background);background-image:linear-gradient(135deg, var(--color-background), color-mix(in srgb, var(--color-background) 98%, #888 2%) 50%, var(--color-background) 50%, color-mix(in srgb, var(--color-background) 95%, #fff 5%));color:var(--color-foreground);font-size:35px;font-family:Lato,Avenir Next,Avenir,Trebuchet MS,Segoe UI,sans-serif;height:720px;line-height:1.35;letter-spacing:1.25px;padding:70px;width:1280px;overflow-wrap:break-word}div#\:\$p > svg > foreignObject > section{--marpit-root-font-size:35px}div#\:\$p > svg > foreignObject > section:after{right:0;bottom:0;font-size:80%}div#\:\$p > svg > foreignObject > section:after{--marpit-root-font-size:80%}div#\:\$p > svg > foreignObject > section a,div#\:\$p > svg > foreignObject > section mark{color:var(--color-highlight)}div#\:\$p > svg > foreignObject > section code{background:var(--color-dimmed);color:var(--color-background)}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1) strong,div#\:\$p > svg > foreignObject > section :is(h2, marp-h2) strong,div#\:\$p > svg > foreignObject > section :is(h3, marp-h3) strong,div#\:\$p > svg > foreignObject > section :is(h4, marp-h4) strong,div#\:\$p > svg > foreignObject > section :is(h5, marp-h5) strong,div#\:\$p > svg > foreignObject > section :is(h6, marp-h6) strong{color:var(--color-highlight)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre){background:var(--color-foreground)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre)>code{background:transparent}div#\:\$p > svg > foreignObject > section blockquote:after,div#\:\$p > svg > foreignObject > section blockquote:before,div#\:\$p > svg > foreignObject > section footer,div#\:\$p > svg > foreignObject > section header,div#\:\$p > svg > foreignObject > section section:after{color:var(--color-dimmed)}div#\:\$p > svg > foreignObject > section table td,div#\:\$p > svg > foreignObject > section table th{border-color:var(--color-foreground)}div#\:\$p > svg > foreignObject > section table thead th{background:var(--color-foreground);color:var(--color-background)}div#\:\$p > svg > foreignObject > section table tbody>tr:nth-child(odd) td,div#\:\$p > svg > foreignObject > section table tbody>tr:nth-child(odd) th{background:var(--color-background-stripe, transparent)}div#\:\$p > svg > foreignObject > section>:first-child,div#\:\$p > svg > foreignObject > section>header:first-child+*{margin-top:0}div#\:\$p > svg > foreignObject > section:where(.invert){color-scheme:dark}div#\:\$p > svg > foreignObject > section:where(.gaia){--color-background:#0288d1;--color-background-stripe:rgba(255,248,225,.1);--color-foreground:#fff8e1;--color-dimmed:#cce2de;--color-highlight:#81d4fa;}div#\:\$p > svg > foreignObject > section:where(.lead){place-content:safe center center;flex-flow:column nowrap;align-items:stretch}div#\:\$p > svg > foreignObject > section:where(.lead) :is(h1, marp-h1),div#\:\$p > svg > foreignObject > section:where(.lead) :is(h2, marp-h2),div#\:\$p > svg > foreignObject > section:where(.lead) :is(h3, marp-h3),div#\:\$p > svg > foreignObject > section:where(.lead) :is(h4, marp-h4),div#\:\$p > svg > foreignObject > section:where(.lead) :is(h5, marp-h5),div#\:\$p > svg > foreignObject > section:where(.lead) :is(h6, marp-h6){text-align:center}div#\:\$p > svg > foreignObject > section:where(.lead) p{text-align:center}div#\:\$p > svg > foreignObject > section:where(.lead) blockquote>:is(h1, marp-h1),div#\:\$p > svg > foreignObject > section:where(.lead) blockquote>:is(h2, marp-h2),div#\:\$p > svg > foreignObject > section:where(.lead) blockquote>:is(h3, marp-h3),div#\:\$p > svg > foreignObject > section:where(.lead) blockquote>:is(h4, marp-h4),div#\:\$p > svg > foreignObject > section:where(.lead) blockquote>:is(h5, marp-h5),div#\:\$p > svg > foreignObject > section:where(.lead) blockquote>:is(h6, marp-h6),div#\:\$p > svg > foreignObject > section:where(.lead) blockquote>p{text-align:left}div#\:\$p > svg > foreignObject > section:where(.lead) ol>li>p,div#\:\$p > svg > foreignObject > section:where(.lead) ul>li>p{text-align:left}div#\:\$p > svg > foreignObject > section:where(.lead) table{margin-left:auto;margin-right:auto}div#\:\$p > svg > foreignObject > section{font-size:25px}div#\:\$p > svg > foreignObject > section{--marpit-root-font-size: 25px}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1){color:#1a5fb4}div#\:\$p > svg > foreignObject > section :is(h2, marp-h2){color:#1a5fb4}div#\:\$p > svg > foreignObject > section :is(h3, marp-h3){color:#555;font-size:24px;margin-bottom:0.2em}div#\:\$p > svg > foreignObject > section table{font-size:21px}div#\:\$p > svg > foreignObject > section code{font-size:18px}div#\:\$p > svg > foreignObject > section.wide table{font-size:18px}div#\:\$p > svg > foreignObject > section.part{background-color:#1a5fb4!important}div#\:\$p > svg > foreignObject > section.part :is(h1, marp-h1), div#\:\$p > svg > foreignObject > section.part :is(h2, marp-h2), div#\:\$p > svg > foreignObject > section.part p{color:#fff!important}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"]{columns:initial!important;display:block!important;padding:0!important}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"]::before, div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"]::after, div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="content"]::before, div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="content"]::after{display:none!important}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"] > div[data-marpit-advanced-background-container]{all:initial;display:flex;flex-direction:row;height:100%;overflow:hidden;width:100%}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"] > div[data-marpit-advanced-background-container][data-marpit-advanced-background-direction="vertical"]{flex-direction:column}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"][data-marpit-advanced-background-split] > div[data-marpit-advanced-background-container]{width:var(--marpit-advanced-background-split, 50%)}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"][data-marpit-advanced-background-split="right"] > div[data-marpit-advanced-background-container]{margin-left:calc(100% - var(--marpit-advanced-background-split, 50%))}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"] > div[data-marpit-advanced-background-container] > figure{all:initial;background-position:center;background-repeat:no-repeat;background-size:cover;flex:auto;margin:0}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"] > div[data-marpit-advanced-background-container] > figure > figcaption{position:absolute;border:0;clip:rect(0, 0, 0, 0);height:1px;margin:-1px;overflow:hidden;padding:0;white-space:nowrap;width:1px}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="content"], div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="pseudo"]{background:transparent!important}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="pseudo"], div#\:\$p > svg[data-marpit-svg] > foreignObject[data-marpit-advanced-background="pseudo"]{pointer-events:none!important}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background-split]{width:100%;height:100%} 17</style></head><body><div class="bespoke-marp-osc"><button data-bespoke-marp-osc="prev" tabindex="-1" title="Previous slide">Previous slide</button><span data-bespoke-marp-osc="page"></span><button data-bespoke-marp-osc="next" tabindex="-1" title="Next slide">Next slide</button><button data-bespoke-marp-osc="fullscreen" tabindex="-1" title="Toggle fullscreen (f)">Toggle fullscreen</button><button data-bespoke-marp-osc="overview" tabindex="-1" title="Toggle overview view (o)">Toggle overview view</button><button data-bespoke-marp-osc="presenter" tabindex="-1" title="Open presenter view (p)">Open presenter view</button></div><div id=":$p"><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="1" data-paginate="true" data-background-color="#fff" data-class="lead" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 18h1 { color: #1a5fb4; } 19h2 { color: #1a5fb4; } 20h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 21table { font-size: 21px; } 22code { font-size: 18px; } 23section.wide table { font-size: 18px; } 24section.part { background-color: #1a5fb4 !important; } 25section.part h1, section.part h2, section.part p { color: #fff !important; } 26" lang="fr-FR" class="lead" data-marpit-pagination="1" style="--paginate:true;--background-color:#fff;--class:lead;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; } 27h1 { color: #1a5fb4; } 28h2 { color: #1a5fb4; } 29h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 30table { font-size: 21px; } 31code { font-size: 18px; } 32section.wide table { font-size: 18px; } 33section.part { background-color: #1a5fb4 !important; } 34section.part h1, section.part h2, section.part p { color: #fff !important; } 35;background-color:#fff;background-image:none;" data-marpit-pagination-total="35"> 36<h1 id="forges--web-d%C3%A9centralis%C3%A9">Forges &amp; web décentralisé</h1> 37<p>État des lieux au 10 septembre 2026</p> 38</section> 39</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="2" data-paginate="true" data-background-color="#1a5fb4" data-class="lead part" data-color="#ffffff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 40h1 { color: #1a5fb4; } 41h2 { color: #1a5fb4; } 42h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 43table { font-size: 21px; } 44code { font-size: 18px; } 45section.wide table { font-size: 18px; } 46section.part { background-color: #1a5fb4 !important; } 47section.part h1, section.part h2, section.part p { color: #fff !important; } 48" lang="fr-FR" class="lead part" data-marpit-pagination="2" style="--paginate:true;--background-color:#1a5fb4;--class:lead part;--color:#ffffff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; } 49h1 { color: #1a5fb4; } 50h2 { color: #1a5fb4; } 51h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 52table { font-size: 21px; } 53code { font-size: 18px; } 54section.wide table { font-size: 18px; } 55section.part { background-color: #1a5fb4 !important; } 56section.part h1, section.part h2, section.part p { color: #fff !important; } 57;color:#ffffff;background-color:#1a5fb4;background-image:none;" data-marpit-pagination-total="35"> 58<h1 id="1-cadrage">1. Cadrage</h1> 59<h2 id="code-et-collaboration">code et collaboration</h2> 60</section> 61</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="3" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 62h1 { color: #1a5fb4; } 63h2 { color: #1a5fb4; } 64h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 65table { font-size: 21px; } 66code { font-size: 18px; } 67section.wide table { font-size: 18px; } 68section.part { background-color: #1a5fb4 !important; } 69section.part h1, section.part h2, section.part p { color: #fff !important; } 70" lang="fr-FR" data-marpit-pagination="3" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; } 71h1 { color: #1a5fb4; } 72h2 { color: #1a5fb4; } 73h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 74table { font-size: 21px; } 75code { font-size: 18px; } 76section.wide table { font-size: 18px; } 77section.part { background-color: #1a5fb4 !important; } 78section.part h1, section.part h2, section.part p { color: #fff !important; } 79;background-color:#fff;background-image:none;" data-marpit-pagination-total="35"> 80<h2 id="automatisation-de-la-mise-en-miroir">Automatisation de la mise en miroir</h2> 81<p><strong>Le transport</strong> du code est résolu depuis 2005 : git est distribué par construction, un dépôt peut exister à plusieurs endroits.</p> 82<p><strong>L'orchestration</strong> n'existe pas. Chaque miroir se configure à la main, instance par instance. Chaque projet écrit elle-même l'intégration continue qui l'entretient.</p> 83</section> 84</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="4" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 85h1 { color: #1a5fb4; } 86h2 { color: #1a5fb4; } 87h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 88table { font-size: 21px; } 89code { font-size: 18px; } 90section.wide table { font-size: 18px; } 91section.part { background-color: #1a5fb4 !important; } 92section.part h1, section.part h2, section.part p { color: #fff !important; } 93" lang="fr-FR" data-marpit-pagination="4" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; } 94h1 { color: #1a5fb4; } 95h2 { color: #1a5fb4; } 96h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 97table { font-size: 21px; } 98code { font-size: 18px; } 99section.wide table { font-size: 18px; } 100section.part { background-color: #1a5fb4 !important; } 101section.part h1, section.part h2, section.part p { color: #fff !important; } 102;background-color:#fff;background-image:none;" data-marpit-pagination-total="35"> 103<h2 id="%C3%A9l%C3%A9ments-non-couverts-par-git">Éléments non couverts par git</h2> 104<p>Le véritable obstacle, c'est tout ce qui entoure un dépôt : tickets,<br /> 105propositions de modification, relectures, identité, droits.</p> 106<p>Ces éléments sont stockés dans la base de données d'un serveur Forgejo, en dehors de git.</p> 107<p><a href="https://www.w3.org/TR/activitypub/">ActivityPub</a>, le protocole de la fédiverse, les fait circuler : il transporte de petits messages (« créé », « aimé », « suivi »), pas des fichiers.</p> 108</section> 109</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="5" data-paginate="true" data-background-color="#1a5fb4" data-class="lead part" data-color="#ffffff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 110h1 { color: #1a5fb4; } 111h2 { color: #1a5fb4; } 112h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 113table { font-size: 21px; } 114code { font-size: 18px; } 115section.wide table { font-size: 18px; } 116section.part { background-color: #1a5fb4 !important; } 117section.part h1, section.part h2, section.part p { color: #fff !important; } 118" lang="fr-FR" class="lead part" data-marpit-pagination="5" style="--paginate:true;--background-color:#1a5fb4;--class:lead part;--color:#ffffff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; } 119h1 { color: #1a5fb4; } 120h2 { color: #1a5fb4; } 121h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 122table { font-size: 21px; } 123code { font-size: 18px; } 124section.wide table { font-size: 18px; } 125section.part { background-color: #1a5fb4 !important; } 126section.part h1, section.part h2, section.part p { color: #fff !important; } 127;color:#ffffff;background-color:#1a5fb4;background-image:none;" data-marpit-pagination-total="35"> 128<h1 id="2-%C3%A9tat-de-la-f%C3%A9d%C3%A9ration-dans-forgejo">2. État de la fédération dans Forgejo</h1> 129<h2 id="fonctionnalit%C3%A9s-livr%C3%A9es-et-fonctionnalit%C3%A9s-manquantes">Fonctionnalités livrées et fonctionnalités manquantes</h2> 130</section> 131</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 132h1 { color: #1a5fb4; } 133h2 { color: #1a5fb4; } 134h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 135table { font-size: 21px; } 136code { font-size: 18px; } 137section.wide table { font-size: 18px; } 138section.part { background-color: #1a5fb4 !important; } 139section.part h1, section.part h2, section.part p { color: #fff !important; } 140" lang="fr-FR" data-marpit-pagination="6" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; } 141h1 { color: #1a5fb4; } 142h2 { color: #1a5fb4; } 143h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 144table { font-size: 21px; } 145code { font-size: 18px; } 146section.wide table { font-size: 18px; } 147section.part { background-color: #1a5fb4 !important; } 148section.part h1, section.part h2, section.part p { color: #fff !important; } 149;background-color:#fff;background-image:none;--marpit-advanced-background-split:33%;" data-marpit-pagination-total="35" data-marpit-advanced-background="background" data-marpit-advanced-background-split="right"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url(&quot;img/forgejo_v16.jpg&quot;);background-size:contain;"></figure></div></section></foreignObject><foreignObject width="67%" height="720"><section id="6" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 150h1 { color: #1a5fb4; } 151h2 { color: #1a5fb4; } 152h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 153table { font-size: 21px; } 154code { font-size: 18px; } 155section.wide table { font-size: 18px; } 156section.part { background-color: #1a5fb4 !important; } 157section.part h1, section.part h2, section.part p { color: #fff !important; } 158" lang="fr-FR" data-marpit-pagination="6" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; } 159h1 { color: #1a5fb4; } 160h2 { color: #1a5fb4; } 161h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 162table { font-size: 21px; } 163code { font-size: 18px; } 164section.wide table { font-size: 18px; } 165section.part { background-color: #1a5fb4 !important; } 166section.part h1, section.part h2, section.part p { color: #fff !important; } 167;background-color:#fff;background-image:none;--marpit-advanced-background-split:33%;" data-marpit-pagination-total="35" data-marpit-advanced-background="content" data-marpit-advanced-background-split="right"> 168<h2 id="p%C3%A9rim%C3%A8tre-fonctionnel-de-la-f%C3%A9d%C3%A9ration-forgejo">Périmètre fonctionnel de la fédération <a href="https://forgejo.org">Forgejo</a></h2> 169<h3 id="fonctionne">Fonctionne</h3> 170<ul> 171<li>Le favori fédéré : un fork mis en favori transmet ce favori au dépôt<br /> 172d'origine.</li> 173<li>Le suivi de comptes distants, avec un flux de leur activité.</li> 174<li>Les fondations techniques : pages d'acteur, découverte, requêtes signées.</li> 175</ul> 176<h3 id="pas-impl%C3%A9ment%C3%A9">Pas implémenté</h3> 177<p>Tickets, commentaires et propositions de modification fédérés. Modération et<br /> 178contrôle d'accès entre serveurs.</p> 179</section> 180</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 181h1 { color: #1a5fb4; } 182h2 { color: #1a5fb4; } 183h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 184table { font-size: 21px; } 185code { font-size: 18px; } 186section.wide table { font-size: 18px; } 187section.part { background-color: #1a5fb4 !important; } 188section.part h1, section.part h2, section.part p { color: #fff !important; } 189" lang="fr-FR" data-marpit-pagination="6" style="" data-marpit-pagination-total="35" data-marpit-advanced-background="pseudo" data-marpit-advanced-background-split="right"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="7" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 190h1 { color: #1a5fb4; } 191h2 { color: #1a5fb4; } 192h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 193table { font-size: 21px; } 194code { font-size: 18px; } 195section.wide table { font-size: 18px; } 196section.part { background-color: #1a5fb4 !important; } 197section.part h1, section.part h2, section.part p { color: #fff !important; } 198" lang="fr-FR" data-marpit-pagination="7" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; } 199h1 { color: #1a5fb4; } 200h2 { color: #1a5fb4; } 201h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 202table { font-size: 21px; } 203code { font-size: 18px; } 204section.wide table { font-size: 18px; } 205section.part { background-color: #1a5fb4 !important; } 206section.part h1, section.part h2, section.part p { color: #fff !important; } 207;background-color:#fff;background-image:none;" data-marpit-pagination-total="35"> 208<h2 id="fonctionnement-du-favori-f%C3%A9d%C3%A9r%C3%A9">Fonctionnement du favori fédéré</h2> 209<pre is="marp-pre" data-auto-scaling="downscale-only"><code>@alice@forgeA --(c'est quoi, ce dépôt ?)--&gt; acteur du dépôt sur forgeB 210 --(« aimé », signé)---------&gt; boîte de réception sur forgeB 211forgeB vérifie la signature --&gt; compteur de favoris +1, favori ajouté au profil d'alice 212</code></pre> 213<p>Le message part à sens unique, il est signé, il ne contient aucun texte :<br /> 214rien à modérer.</p> 215<p>C'est le test le plus simple pour vérifier que l'échange entre deux serveurs<br /> 216fonctionne.</p> 217</section> 218</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="8" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 219h1 { color: #1a5fb4; } 220h2 { color: #1a5fb4; } 221h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 222table { font-size: 21px; } 223code { font-size: 18px; } 224section.wide table { font-size: 18px; } 225section.part { background-color: #1a5fb4 !important; } 226section.part h1, section.part h2, section.part p { color: #fff !important; } 227" lang="fr-FR" data-marpit-pagination="8" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; } 228h1 { color: #1a5fb4; } 229h2 { color: #1a5fb4; } 230h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 231table { font-size: 21px; } 232code { font-size: 18px; } 233section.wide table { font-size: 18px; } 234section.part { background-color: #1a5fb4 !important; } 235section.part h1, section.part h2, section.part p { color: #fff !important; } 236;background-color:#fff;background-image:none;" data-marpit-pagination-total="35"> 237<h2 id="suivi-de-comptes-entre-forgejo-et-la-f%C3%A9diverse">Suivi de comptes entre Forgejo et la fédiverse</h2> 238<p>Un compte Forgejo peut suivre un compte <a href="https://joinmastodon.org">Mastodon</a> ou <a href="https://gotosocial.org">GoToSocial</a>, et l'inverse.<br /> 239Les commits et les versions apparaissent alors dans un fil social.</p> 240<p>C'est la première fonction de fédération visible pour quelqu'un qui ne<br /> 241développe pas.</p> 242<p>Seuls Forgejo, <a href="https://joinmastodon.org">Mastodon</a> et <a href="https://gotosocial.org">GoToSocial</a> sont acceptés pour l'instant.</p> 243</section> 244</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="9" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 245h1 { color: #1a5fb4; } 246h2 { color: #1a5fb4; } 247h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 248table { font-size: 21px; } 249code { font-size: 18px; } 250section.wide table { font-size: 18px; } 251section.part { background-color: #1a5fb4 !important; } 252section.part h1, section.part h2, section.part p { color: #fff !important; } 253" lang="fr-FR" data-marpit-pagination="9" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; } 254h1 { color: #1a5fb4; } 255h2 { color: #1a5fb4; } 256h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 257table { font-size: 21px; } 258code { font-size: 18px; } 259section.wide table { font-size: 18px; } 260section.part { background-color: #1a5fb4 !important; } 261section.part h1, section.part h2, section.part p { color: #fff !important; } 262;background-color:#fff;background-image:none;" data-marpit-pagination-total="35"> 263<h2 id="risque-associ%C3%A9-%C3%A0-lactivation-de-la-f%C3%A9d%C3%A9ration">Risque associé à l'activation de la fédération</h2> 264<p>Le projet se réserve le droit de casser la fédération sans préavis.</p> 265<p>Les autres serveurs mémorisent le domaine et les clés d'une instance dès que la fédération est active. Une rupture peut rendre ce domaine définitivement<br /> 266inutilisable pour tout usage ActivityPub.</p> 267</section> 268</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 269h1 { color: #1a5fb4; } 270h2 { color: #1a5fb4; } 271h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 272table { font-size: 21px; } 273code { font-size: 18px; } 274section.wide table { font-size: 18px; } 275section.part { background-color: #1a5fb4 !important; } 276section.part h1, section.part h2, section.part p { color: #fff !important; } 277" lang="fr-FR" data-marpit-pagination="10" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; } 278h1 { color: #1a5fb4; } 279h2 { color: #1a5fb4; } 280h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 281table { font-size: 21px; } 282code { font-size: 18px; } 283section.wide table { font-size: 18px; } 284section.part { background-color: #1a5fb4 !important; } 285section.part h1, section.part h2, section.part p { color: #fff !important; } 286;background-color:#fff;background-image:none;--marpit-advanced-background-split:38%;" data-marpit-pagination-total="35" data-marpit-advanced-background="background" data-marpit-advanced-background-split="right"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url(&quot;img/term404.jpg&quot;);background-size:contain;"></figure></div></section></foreignObject><foreignObject width="62%" height="720"><section id="10" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 287h1 { color: #1a5fb4; } 288h2 { color: #1a5fb4; } 289h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 290table { font-size: 21px; } 291code { font-size: 18px; } 292section.wide table { font-size: 18px; } 293section.part { background-color: #1a5fb4 !important; } 294section.part h1, section.part h2, section.part p { color: #fff !important; } 295" lang="fr-FR" data-marpit-pagination="10" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; } 296h1 { color: #1a5fb4; } 297h2 { color: #1a5fb4; } 298h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 299table { font-size: 21px; } 300code { font-size: 18px; } 301section.wide table { font-size: 18px; } 302section.part { background-color: #1a5fb4 !important; } 303section.part h1, section.part h2, section.part p { color: #fff !important; } 304;background-color:#fff;background-image:none;--marpit-advanced-background-split:38%;" data-marpit-pagination-total="35" data-marpit-advanced-background="content" data-marpit-advanced-background-split="right"> 305<h2 id="adoption-en-production">Adoption en production</h2> 306<p>La fédération est désactivée par défaut, et les grandes instances publiques ne<br /> 307l'activent pas.</p> 308<p>Les points d'entrée de la fédération répondent 404 sur<br /> 309<a href="https://codeberg.org">codeberg.org</a>, <a href="https://disroot.org">disroot</a> et<br /> 310<a href="https://verdigado.com">verdigado</a>.</p> 311</section> 312</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 313h1 { color: #1a5fb4; } 314h2 { color: #1a5fb4; } 315h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 316table { font-size: 21px; } 317code { font-size: 18px; } 318section.wide table { font-size: 18px; } 319section.part { background-color: #1a5fb4 !important; } 320section.part h1, section.part h2, section.part p { color: #fff !important; } 321" lang="fr-FR" data-marpit-pagination="10" style="" data-marpit-pagination-total="35" data-marpit-advanced-background="pseudo" data-marpit-advanced-background-split="right"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="11" data-paginate="true" data-background-color="#1a5fb4" data-class="lead part" data-color="#ffffff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 322h1 { color: #1a5fb4; } 323h2 { color: #1a5fb4; } 324h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 325table { font-size: 21px; } 326code { font-size: 18px; } 327section.wide table { font-size: 18px; } 328section.part { background-color: #1a5fb4 !important; } 329section.part h1, section.part h2, section.part p { color: #fff !important; } 330" lang="fr-FR" class="lead part" data-marpit-pagination="11" style="--paginate:true;--background-color:#1a5fb4;--class:lead part;--color:#ffffff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; } 331h1 { color: #1a5fb4; } 332h2 { color: #1a5fb4; } 333h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 334table { font-size: 21px; } 335code { font-size: 18px; } 336section.wide table { font-size: 18px; } 337section.part { background-color: #1a5fb4 !important; } 338section.part h1, section.part h2, section.part p { color: #fff !important; } 339;color:#ffffff;background-color:#1a5fb4;background-image:none;" data-marpit-pagination-total="35"> 340<h1 id="3-autres-solutions">3. Autres solutions</h1> 341<h2 id="des-solutions-ind%C3%A9pendantes-dactivitypub">Des solutions indépendantes d'ActivityPub</h2> 342</section> 343</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="12" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 344h1 { color: #1a5fb4; } 345h2 { color: #1a5fb4; } 346h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 347table { font-size: 21px; } 348code { font-size: 18px; } 349section.wide table { font-size: 18px; } 350section.part { background-color: #1a5fb4 !important; } 351section.part h1, section.part h2, section.part p { color: #fff !important; } 352" lang="fr-FR" data-marpit-pagination="12" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; } 353h1 { color: #1a5fb4; } 354h2 { color: #1a5fb4; } 355h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 356table { font-size: 21px; } 357code { font-size: 18px; } 358section.wide table { font-size: 18px; } 359section.part { background-color: #1a5fb4 !important; } 360section.part h1, section.part h2, section.part p { color: #fff !important; } 361;background-color:#fff;background-image:none;" data-marpit-pagination-total="35"> 362<h2 id="mise-en-relation-de-deux-forges-par-miroir">Mise en relation de deux forges par miroir</h2> 363<p>Forgejo push ou pull déjà un dépôt vers une autre instance. Le code passe,<br /> 364les tickets non.</p> 365<p>Deux projets comblent une partie du manque :</p> 366<ul> 367<li><strong><a href="https://github.com/lukaswrz/forgesync">forgesync</a></strong> copie tous les dépôts d'une Forgejo vers une autre, tickets et propositions compris.</li> 368<li><strong><a href="https://github.com/RayLabsHQ/gitea-mirror">gitea-mirror</a></strong> fait la même chose avec une interface web, et transfère aussi étiquettes, jalons, versions et wikis.</li> 369<li></li> 370</ul> 371</section> 372</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="13" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 373h1 { color: #1a5fb4; } 374h2 { color: #1a5fb4; } 375h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 376table { font-size: 21px; } 377code { font-size: 18px; } 378section.wide table { font-size: 18px; } 379section.part { background-color: #1a5fb4 !important; } 380section.part h1, section.part h2, section.part p { color: #fff !important; } 381" lang="fr-FR" data-marpit-pagination="13" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; } 382h1 { color: #1a5fb4; } 383h2 { color: #1a5fb4; } 384h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 385table { font-size: 21px; } 386code { font-size: 18px; } 387section.wide table { font-size: 18px; } 388section.part { background-color: #1a5fb4 !important; } 389section.part h1, section.part h2, section.part p { color: #fff !important; } 390;background-color:#fff;background-image:none;" data-marpit-pagination-total="35"> 391<h2 id="f3--migrer-un-projet-pas-le-f%C3%A9d%C3%A9rer"><a href="https://code.forgejo.org/f3/f3-documentation">F3</a> : migrer un projet, pas le fédérer</h2> 392<p>F3 est un format d'export qui contient tout un projet : dépôt, tickets,<br /> 393propositions, commentaires, comptes.</p> 394<p>Le code de migration de Forgejo s'en sert déjà.</p> 395</section> 396</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 397h1 { color: #1a5fb4; } 398h2 { color: #1a5fb4; } 399h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 400table { font-size: 21px; } 401code { font-size: 18px; } 402section.wide table { font-size: 18px; } 403section.part { background-color: #1a5fb4 !important; } 404section.part h1, section.part h2, section.part p { color: #fff !important; } 405" lang="fr-FR" data-marpit-pagination="14" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; } 406h1 { color: #1a5fb4; } 407h2 { color: #1a5fb4; } 408h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 409table { font-size: 21px; } 410code { font-size: 18px; } 411section.wide table { font-size: 18px; } 412section.part { background-color: #1a5fb4 !important; } 413section.part h1, section.part h2, section.part p { color: #fff !important; } 414;background-color:#fff;background-image:none;--marpit-advanced-background-split:33%;" data-marpit-pagination-total="35" data-marpit-advanced-background="background" data-marpit-advanced-background-split="right"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url(&quot;img/authint.jpg&quot;);background-size:contain;"></figure></div></section></foreignObject><foreignObject width="67%" height="720"><section id="14" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 415h1 { color: #1a5fb4; } 416h2 { color: #1a5fb4; } 417h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 418table { font-size: 21px; } 419code { font-size: 18px; } 420section.wide table { font-size: 18px; } 421section.part { background-color: #1a5fb4 !important; } 422section.part h1, section.part h2, section.part p { color: #fff !important; } 423" lang="fr-FR" data-marpit-pagination="14" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; } 424h1 { color: #1a5fb4; } 425h2 { color: #1a5fb4; } 426h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 427table { font-size: 21px; } 428code { font-size: 18px; } 429section.wide table { font-size: 18px; } 430section.part { background-color: #1a5fb4 !important; } 431section.part h1, section.part h2, section.part p { color: #fff !important; } 432;background-color:#fff;background-image:none;--marpit-advanced-background-split:33%;" data-marpit-pagination-total="35" data-marpit-advanced-background="content" data-marpit-advanced-background-split="right"> 433<h2 id="authorized-integrations--authentification-entre-serveurs"><a href="https://forgejo.org/docs/latest/user/api/authorized-integrations/">Authorized Integrations</a> : authentification entre serveurs</h2> 434<p>Forgejo v16, juillet 2026 : <strong>Authorized Integrations</strong>. La CI d'une instance<br /> 435peut désormais s'authentifier sur les dépôts d'une autre, sans secret partagé<br /> 436ni jeton à renouveler.</p> 437<p>Un lien automatisable, arrivé cette année, sans ActivityPub. Nous l'avons<br /> 438testée en conditions réelles entre deux instances, f1 et f2.cyberwild.org.</p> 439</section> 440</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 441h1 { color: #1a5fb4; } 442h2 { color: #1a5fb4; } 443h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 444table { font-size: 21px; } 445code { font-size: 18px; } 446section.wide table { font-size: 18px; } 447section.part { background-color: #1a5fb4 !important; } 448section.part h1, section.part h2, section.part p { color: #fff !important; } 449" lang="fr-FR" data-marpit-pagination="14" style="" data-marpit-pagination-total="35" data-marpit-advanced-background="pseudo" data-marpit-advanced-background-split="right"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="15" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 450h1 { color: #1a5fb4; } 451h2 { color: #1a5fb4; } 452h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 453table { font-size: 21px; } 454code { font-size: 18px; } 455section.wide table { font-size: 18px; } 456section.part { background-color: #1a5fb4 !important; } 457section.part h1, section.part h2, section.part p { color: #fff !important; } 458" lang="fr-FR" data-marpit-pagination="15" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; } 459h1 { color: #1a5fb4; } 460h2 { color: #1a5fb4; } 461h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 462table { font-size: 21px; } 463code { font-size: 18px; } 464section.wide table { font-size: 18px; } 465section.part { background-color: #1a5fb4 !important; } 466section.part h1, section.part h2, section.part p { color: #fff !important; } 467;background-color:#fff;background-image:none;" data-marpit-pagination-total="35"> 468<h2 id="mise-en-place--ex%C3%A9cuteur-et-confiance">Mise en place : exécuteur et confiance</h2> 469<p>Un runner Forgejo (<code>forgejo-runner</code>), en mode host et sans Docker, est<br /> 470enregistré sur f1. Côté f2, une intégration autorisée fait confiance aux JWT<br /> 471émis par l'émetteur de f1, filtrés par une revendication.</p> 472<pre is="marp-pre" data-auto-scaling="downscale-only"><code>forgejo admin user create-authorized-integration \ 473 --username forgeadmin \ 474 --issuer https://f1.cyberwild.org/api/actions \ 475 --claim-eq repository=forgeadmin/testrepo \ 476 --scope write:repository \ 477 --repo forgeadmin/testrepo 478</code></pre> 479</section> 480</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="16" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 481h1 { color: #1a5fb4; } 482h2 { color: #1a5fb4; } 483h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 484table { font-size: 21px; } 485code { font-size: 18px; } 486section.wide table { font-size: 18px; } 487section.part { background-color: #1a5fb4 !important; } 488section.part h1, section.part h2, section.part p { color: #fff !important; } 489" lang="fr-FR" data-marpit-pagination="16" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; } 490h1 { color: #1a5fb4; } 491h2 { color: #1a5fb4; } 492h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 493table { font-size: 21px; } 494code { font-size: 18px; } 495section.wide table { font-size: 18px; } 496section.part { background-color: #1a5fb4 !important; } 497section.part h1, section.part h2, section.part p { color: #fff !important; } 498;background-color:#fff;background-image:none;" data-marpit-pagination-total="35"> 499<h2 id="le-ci-de-f1-demande-un-jeton-oidc-%C3%A0-sa-propre-instance">Le CI de f1 demande un jeton OIDC à sa propre instance</h2> 500<pre is="marp-pre" data-auto-scaling="downscale-only"><code>jobs: 501 inspect: 502 runs-on: linux-host 503 enable-openid-connect: true 504 steps: 505 - run: | 506 AUD=&quot;u:1:11412bf9-...-f06c&quot; 507 curl -s -H &quot;Authorization: bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN&quot; \ 508 &quot;$ACTIONS_ID_TOKEN_REQUEST_URL&amp;audience=$AUD&quot; 509</code></pre> 510<p>Revendications du JWT reçu : <code>iss</code>, <code>repository</code>, <code>ref</code>, <code>workflow</code>, <code>sub</code>. Le<br /> 511jeton est signé par f1 et vérifiable par f2 sans contact préalable.</p> 512</section> 513</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="17" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 514h1 { color: #1a5fb4; } 515h2 { color: #1a5fb4; } 516h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 517table { font-size: 21px; } 518code { font-size: 18px; } 519section.wide table { font-size: 18px; } 520section.part { background-color: #1a5fb4 !important; } 521section.part h1, section.part h2, section.part p { color: #fff !important; } 522" lang="fr-FR" data-marpit-pagination="17" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; } 523h1 { color: #1a5fb4; } 524h2 { color: #1a5fb4; } 525h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 526table { font-size: 21px; } 527code { font-size: 18px; } 528section.wide table { font-size: 18px; } 529section.part { background-color: #1a5fb4 !important; } 530section.part h1, section.part h2, section.part p { color: #fff !important; } 531;background-color:#fff;background-image:none;" data-marpit-pagination-total="35"> 532<h2 id="le-jeton-sert-directement-%C3%A0-sauthentifier-sur-f2">Le jeton sert directement à s'authentifier sur f2</h2> 533<pre is="marp-pre" data-auto-scaling="downscale-only"><code>curl -X POST \ 534 -H &quot;Authorization: Bearer $JWT&quot; \ 535 -H &quot;Content-Type: application/json&quot; \ 536 --data '{&quot;title&quot;:&quot;Proposition de test depuis le CI de f1&quot;,&quot;head&quot;:&quot;f1-ci-run-6&quot;,&quot;base&quot;:&quot;main&quot;}' \ 537 https://f2.cyberwild.org/api/v1/repos/forgeadmin/testrepo/pulls 538</code></pre> 539<p>Aucun jeton n'est stocké côté f2 pour f1 : la confiance repose sur la<br /> 540signature du JWT et les règles de revendications, pas sur un secret échangé à<br /> 541l'avance.</p> 542</section> 543</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="18" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 544h1 { color: #1a5fb4; } 545h2 { color: #1a5fb4; } 546h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 547table { font-size: 21px; } 548code { font-size: 18px; } 549section.wide table { font-size: 18px; } 550section.part { background-color: #1a5fb4 !important; } 551section.part h1, section.part h2, section.part p { color: #fff !important; } 552" lang="fr-FR" data-marpit-pagination="18" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; } 553h1 { color: #1a5fb4; } 554h2 { color: #1a5fb4; } 555h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 556table { font-size: 21px; } 557code { font-size: 18px; } 558section.wide table { font-size: 18px; } 559section.part { background-color: #1a5fb4 !important; } 560section.part h1, section.part h2, section.part p { color: #fff !important; } 561;background-color:#fff;background-image:none;" data-marpit-pagination-total="35"> 562<h2 id="r%C3%A9sultat--trois-actions-inter-instances-r%C3%A9ussies">Résultat : trois actions inter-instances réussies</h2> 563<table> 564<thead> 565<tr> 566<th>Action déclenchée depuis f1</th> 567<th>Résultat sur f2</th> 568</tr> 569</thead> 570<tbody> 571<tr> 572<td>Créer un fichier</td> 573<td>HTTP 201</td> 574</tr> 575<tr> 576<td>Créer une branche</td> 577<td>HTTP 201</td> 578</tr> 579<tr> 580<td>Ouvrir une proposition de modification</td> 581<td>HTTP 201</td> 582</tr> 583</tbody> 584</table> 585</section> 586</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="19" data-paginate="true" data-background-color="#1a5fb4" data-class="lead part" data-color="#ffffff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 587h1 { color: #1a5fb4; } 588h2 { color: #1a5fb4; } 589h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 590table { font-size: 21px; } 591code { font-size: 18px; } 592section.wide table { font-size: 18px; } 593section.part { background-color: #1a5fb4 !important; } 594section.part h1, section.part h2, section.part p { color: #fff !important; } 595" lang="fr-FR" class="lead part" data-marpit-pagination="19" style="--paginate:true;--background-color:#1a5fb4;--class:lead part;--color:#ffffff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; } 596h1 { color: #1a5fb4; } 597h2 { color: #1a5fb4; } 598h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 599table { font-size: 21px; } 600code { font-size: 18px; } 601section.wide table { font-size: 18px; } 602section.part { background-color: #1a5fb4 !important; } 603section.part h1, section.part h2, section.part p { color: #fff !important; } 604;color:#ffffff;background-color:#1a5fb4;background-image:none;" data-marpit-pagination-total="35"> 605<h1 id="4-comparaison-avec-dautres-syst%C3%A8mes-d%C3%A9centralis%C3%A9s">4. Comparaison avec d&quot;autres systèmes décentralisés</h1> 606<h2 id="panorama-des-syst%C3%A8mes-compar%C3%A9s">Panorama des systèmes comparés</h2> 607</section> 608</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 609h1 { color: #1a5fb4; } 610h2 { color: #1a5fb4; } 611h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 612table { font-size: 21px; } 613code { font-size: 18px; } 614section.wide table { font-size: 18px; } 615section.part { background-color: #1a5fb4 !important; } 616section.part h1, section.part h2, section.part p { color: #fff !important; } 617" lang="fr-FR" data-marpit-pagination="20" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; } 618h1 { color: #1a5fb4; } 619h2 { color: #1a5fb4; } 620h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 621table { font-size: 21px; } 622code { font-size: 18px; } 623section.wide table { font-size: 18px; } 624section.part { background-color: #1a5fb4 !important; } 625section.part h1, section.part h2, section.part p { color: #fff !important; } 626;background-color:#fff;background-image:none;--marpit-advanced-background-split:33%;" data-marpit-pagination-total="35" data-marpit-advanced-background="background" data-marpit-advanced-background-split="right"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url(&quot;img/forgefed.jpg&quot;);background-size:contain;"></figure></div></section></foreignObject><foreignObject width="67%" height="720"><section id="20" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 627h1 { color: #1a5fb4; } 628h2 { color: #1a5fb4; } 629h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 630table { font-size: 21px; } 631code { font-size: 18px; } 632section.wide table { font-size: 18px; } 633section.part { background-color: #1a5fb4 !important; } 634section.part h1, section.part h2, section.part p { color: #fff !important; } 635" lang="fr-FR" data-marpit-pagination="20" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; } 636h1 { color: #1a5fb4; } 637h2 { color: #1a5fb4; } 638h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 639table { font-size: 21px; } 640code { font-size: 18px; } 641section.wide table { font-size: 18px; } 642section.part { background-color: #1a5fb4 !important; } 643section.part h1, section.part h2, section.part p { color: #fff !important; } 644;background-color:#fff;background-image:none;--marpit-advanced-background-split:33%;" data-marpit-pagination-total="35" data-marpit-advanced-background="content" data-marpit-advanced-background-split="right"> 645<h2 id="forgefed--une-sp%C3%A9cification-distincte-de-forgejo"><a href="https://forgefed.org">ForgeFed</a> : une spécification distincte de Forgejo</h2> 646<p><strong>ForgeFed</strong> est une extension d'ActivityPub pensée pour les forges : dépôts,<br /> 647tickets, propositions, versions.</p> 648<p><strong><a href="https://hackage.haskell.org/package/vervis">Vervis</a></strong> en est l'implémentation de référence : une forge complète et<br /> 649séparée, pas un module à brancher sur Forgejo.</p> 650<p>Forgejo construit sa propre fédération. Le blog ForgeFed n'a rien publié depuis janvier 2025.</p> 651</section> 652</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 653h1 { color: #1a5fb4; } 654h2 { color: #1a5fb4; } 655h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 656table { font-size: 21px; } 657code { font-size: 18px; } 658section.wide table { font-size: 18px; } 659section.part { background-color: #1a5fb4 !important; } 660section.part h1, section.part h2, section.part p { color: #fff !important; } 661" lang="fr-FR" data-marpit-pagination="20" style="" data-marpit-pagination-total="35" data-marpit-advanced-background="pseudo" data-marpit-advanced-background-split="right"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="21" data-paginate="true" data-background-color="#fff" data-class="wide" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 662h1 { color: #1a5fb4; } 663h2 { color: #1a5fb4; } 664h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 665table { font-size: 21px; } 666code { font-size: 18px; } 667section.wide table { font-size: 18px; } 668section.part { background-color: #1a5fb4 !important; } 669section.part h1, section.part h2, section.part p { color: #fff !important; } 670" lang="fr-FR" class="wide" data-marpit-pagination="21" style="--paginate:true;--background-color:#fff;--class:wide;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; } 671h1 { color: #1a5fb4; } 672h2 { color: #1a5fb4; } 673h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 674table { font-size: 21px; } 675code { font-size: 18px; } 676section.wide table { font-size: 18px; } 677section.part { background-color: #1a5fb4 !important; } 678section.part h1, section.part h2, section.part p { color: #fff !important; } 679;background-color:#fff;background-image:none;" data-marpit-pagination-total="35"> 680<h2 id="comparaison-des-mod%C3%A8les-techniques">Comparaison des modèles techniques</h2> 681<table> 682<thead> 683<tr> 684<th></th> 685<th><a href="https://www.w3.org/TR/activitypub/">ActivityPub</a></th> 686<th><a href="https://atproto.com">ATProto</a></th> 687<th><a href="https://ipfs.tech">IPFS</a></th> 688<th><a href="https://radicle.dev">Radicle</a></th> 689</tr> 690</thead> 691<tbody> 692<tr> 693<td>Organisé autour de</td> 694<td>le serveur</td> 695<td>l'utilisateur</td> 696<td>le contenu</td> 697<td>le dépôt</td> 698</tr> 699<tr> 700<td>Identité</td> 701<td>une adresse sur un serveur</td> 702<td>un identifiant portable</td> 703<td>une clé</td> 704<td>une clé, sans compte</td> 705</tr> 706<tr> 707<td>Données stockées</td> 708<td>sur le serveur</td> 709<td>pointées par l'identifiant</td> 710<td>partout où copiées</td> 711<td>sur les nœuds relais</td> 712</tr> 713<tr> 714<td>Droits</td> 715<td>signatures, plus l'admin</td> 716<td>des clés, on peut déménager</td> 717<td>aucun</td> 718<td>une liste de clés signée</td> 719</tr> 720<tr> 721<td>Point faible</td> 722<td>changer de serveur = changer d'identité</td> 723<td>une société écrit les règles</td> 724<td>pas de contrôle d'accès</td> 725<td>sans relais, le projet disparaît</td> 726</tr> 727</tbody> 728</table> 729<p>Radicle range tickets et propositions <strong>dans le dépôt git lui-même</strong> .</p> 730</section> 731</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-background-color="#fff" data-class="wide" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 732h1 { color: #1a5fb4; } 733h2 { color: #1a5fb4; } 734h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 735table { font-size: 21px; } 736code { font-size: 18px; } 737section.wide table { font-size: 18px; } 738section.part { background-color: #1a5fb4 !important; } 739section.part h1, section.part h2, section.part p { color: #fff !important; } 740" lang="fr-FR" class="wide" data-marpit-pagination="22" style="--paginate:true;--background-color:#fff;--class:wide;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; } 741h1 { color: #1a5fb4; } 742h2 { color: #1a5fb4; } 743h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 744table { font-size: 21px; } 745code { font-size: 18px; } 746section.wide table { font-size: 18px; } 747section.part { background-color: #1a5fb4 !important; } 748section.part h1, section.part h2, section.part p { color: #fff !important; } 749;background-color:#fff;background-image:none;--marpit-advanced-background-split:26%;" data-marpit-pagination-total="35" data-marpit-advanced-background="background" data-marpit-advanced-background-split="right"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url(&quot;img/shipyard.jpg&quot;);background-size:contain;"></figure></div></section></foreignObject><foreignObject width="74%" height="720"><section id="22" data-paginate="true" data-background-color="#fff" data-class="wide" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 750h1 { color: #1a5fb4; } 751h2 { color: #1a5fb4; } 752h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 753table { font-size: 21px; } 754code { font-size: 18px; } 755section.wide table { font-size: 18px; } 756section.part { background-color: #1a5fb4 !important; } 757section.part h1, section.part h2, section.part p { color: #fff !important; } 758" lang="fr-FR" class="wide" data-marpit-pagination="22" style="--paginate:true;--background-color:#fff;--class:wide;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; } 759h1 { color: #1a5fb4; } 760h2 { color: #1a5fb4; } 761h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 762table { font-size: 21px; } 763code { font-size: 18px; } 764section.wide table { font-size: 18px; } 765section.part { background-color: #1a5fb4 !important; } 766section.part h1, section.part h2, section.part p { color: #fff !important; } 767;background-color:#fff;background-image:none;--marpit-advanced-background-split:26%;" data-marpit-pagination-total="35" data-marpit-advanced-background="content" data-marpit-advanced-background-split="right"> 768<h2 id="comparaison-des-mod%C3%A8les-de-gouvernance">Comparaison des modèles de gouvernance</h2> 769<table> 770<thead> 771<tr> 772<th></th> 773<th>Code</th> 774<th>Gouvernance</th> 775</tr> 776</thead> 777<tbody> 778<tr> 779<td>ActivityPub</td> 780<td>Mastodon, PeerTube, GoToSocial : AGPL</td> 781<td>spécification W3C figée en 2018. Threads est propriétaire et fédère quand même</td> 782</tr> 783<tr> 784<td>ATProto</td> 785<td>référence ouverte, auto-hébergeable</td> 786<td>une société écrit le protocole, tient l'infrastructure</td> 787</tr> 788<tr> 789<td>IPFS</td> 790<td><a href="https://github.com/ipfs/kubo">Kubo</a> et <a href="https://github.com/ipfs/helia">Helia</a>, MIT</td> 791<td>fondation, mais Protocol Labs possède les domaines et arrête son financement le 30 septembre 2026</td> 792</tr> 793<tr> 794<td>Radicle</td> 795<td><a href="https://github.com/radicle-dev/heartwood">Heartwood</a>, MIT et Apache 2.0</td> 796<td>mené par ses mainteneurs, financé par le <a href="https://radworks.org">DAO Radworks</a></td> 797</tr> 798</tbody> 799</table> 800<p>Ni ActivityPub ni Radicle ne dépendent d'une société..</p> 801</section> 802</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-paginate="true" data-background-color="#fff" data-class="wide" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 803h1 { color: #1a5fb4; } 804h2 { color: #1a5fb4; } 805h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 806table { font-size: 21px; } 807code { font-size: 18px; } 808section.wide table { font-size: 18px; } 809section.part { background-color: #1a5fb4 !important; } 810section.part h1, section.part h2, section.part p { color: #fff !important; } 811" lang="fr-FR" class="wide" data-marpit-pagination="22" style="" data-marpit-pagination-total="35" data-marpit-advanced-background="pseudo" data-marpit-advanced-background-split="right"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 812h1 { color: #1a5fb4; } 813h2 { color: #1a5fb4; } 814h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 815table { font-size: 21px; } 816code { font-size: 18px; } 817section.wide table { font-size: 18px; } 818section.part { background-color: #1a5fb4 !important; } 819section.part h1, section.part h2, section.part p { color: #fff !important; } 820" lang="fr-FR" data-marpit-pagination="23" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; } 821h1 { color: #1a5fb4; } 822h2 { color: #1a5fb4; } 823h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 824table { font-size: 21px; } 825code { font-size: 18px; } 826section.wide table { font-size: 18px; } 827section.part { background-color: #1a5fb4 !important; } 828section.part h1, section.part h2, section.part p { color: #fff !important; } 829;background-color:#fff;background-image:none;--marpit-advanced-background-split:33%;" data-marpit-pagination-total="35" data-marpit-advanced-background="background" data-marpit-advanced-background-split="right"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url(&quot;img/bridgy.jpg&quot;);background-size:contain;"></figure></div></section></foreignObject><foreignObject width="67%" height="720"><section id="23" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 830h1 { color: #1a5fb4; } 831h2 { color: #1a5fb4; } 832h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 833table { font-size: 21px; } 834code { font-size: 18px; } 835section.wide table { font-size: 18px; } 836section.part { background-color: #1a5fb4 !important; } 837section.part h1, section.part h2, section.part p { color: #fff !important; } 838" lang="fr-FR" data-marpit-pagination="23" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; } 839h1 { color: #1a5fb4; } 840h2 { color: #1a5fb4; } 841h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 842table { font-size: 21px; } 843code { font-size: 18px; } 844section.wide table { font-size: 18px; } 845section.part { background-color: #1a5fb4 !important; } 846section.part h1, section.part h2, section.part p { color: #fff !important; } 847;background-color:#fff;background-image:none;--marpit-advanced-background-split:33%;" data-marpit-pagination-total="35" data-marpit-advanced-background="content" data-marpit-advanced-background-split="right"> 848<h2 id="ponts-entre-r%C3%A9seaux-sociaux-d%C3%A9centralis%C3%A9s">Ponts entre réseaux sociaux décentralisés</h2> 849<p><strong><a href="https://fed.brid.gy">Bridgy Fed</a></strong> relie la fédiverse, Bluesky et le web<br /> 850ouvert dans les deux sens. <strong><a href="https://github.com/snarfed/granary">granary</a></strong>, en dessous traduit entre les formats.</p> 851<p>Ce sont des projets personnels.</p> 852</section> 853</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 854h1 { color: #1a5fb4; } 855h2 { color: #1a5fb4; } 856h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 857table { font-size: 21px; } 858code { font-size: 18px; } 859section.wide table { font-size: 18px; } 860section.part { background-color: #1a5fb4 !important; } 861section.part h1, section.part h2, section.part p { color: #fff !important; } 862" lang="fr-FR" data-marpit-pagination="23" style="" data-marpit-pagination-total="35" data-marpit-advanced-background="pseudo" data-marpit-advanced-background-split="right"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="24" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 863h1 { color: #1a5fb4; } 864h2 { color: #1a5fb4; } 865h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 866table { font-size: 21px; } 867code { font-size: 18px; } 868section.wide table { font-size: 18px; } 869section.part { background-color: #1a5fb4 !important; } 870section.part h1, section.part h2, section.part p { color: #fff !important; } 871" lang="fr-FR" data-marpit-pagination="24" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; } 872h1 { color: #1a5fb4; } 873h2 { color: #1a5fb4; } 874h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 875table { font-size: 21px; } 876code { font-size: 18px; } 877section.wide table { font-size: 18px; } 878section.part { background-color: #1a5fb4 !important; } 879section.part h1, section.part h2, section.part p { color: #fff !important; } 880;background-color:#fff;background-image:none;" data-marpit-pagination-total="35"> 881<h2 id="tentatives-dh%C3%A9bergement-de-git-sur-ipfs">Tentatives d'hébergement de git sur IPFS</h2> 882<table> 883<thead> 884<tr> 885<th>Projet</th> 886<th>État</th> 887</tr> 888</thead> 889<tbody> 890<tr> 891<td><a href="https://github.com/Gitlawb/node">Gitlawb/node</a>, <a href="https://github.com/meyer1994/ipgit">ipgit</a></td> 892<td>actifs en 2026, une centaine de favoris chacun</td> 893</tr> 894<tr> 895<td>git-remote-ipfs, pando, brig</td> 896<td>génération précédente, abandonnée</td> 897</tr> 898</tbody> 899</table> 900<p>Rien n'est utilisable en production.</p> 901<p>ATProto s'inspire du même principe : chaque contenu est identifié par une<br /> 902empreinte plutôt que par une adresse, comme sur IPFS. Mais contrairement à<br /> 903IPFS, ATProto associe ce contenu à des comptes utilisateurs identifiables.</p> 904</section> 905</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 906h1 { color: #1a5fb4; } 907h2 { color: #1a5fb4; } 908h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 909table { font-size: 21px; } 910code { font-size: 18px; } 911section.wide table { font-size: 18px; } 912section.part { background-color: #1a5fb4 !important; } 913section.part h1, section.part h2, section.part p { color: #fff !important; } 914" lang="fr-FR" data-marpit-pagination="25" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; } 915h1 { color: #1a5fb4; } 916h2 { color: #1a5fb4; } 917h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 918table { font-size: 21px; } 919code { font-size: 18px; } 920section.wide table { font-size: 18px; } 921section.part { background-color: #1a5fb4 !important; } 922section.part h1, section.part h2, section.part p { color: #fff !important; } 923;background-color:#fff;background-image:none;--marpit-advanced-background-split:33%;" data-marpit-pagination-total="35" data-marpit-advanced-background="background" data-marpit-advanced-background-split="right"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url(&quot;img/keyoxide.jpg&quot;);background-size:contain;"></figure></div></section></foreignObject><foreignObject width="67%" height="720"><section id="25" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 924h1 { color: #1a5fb4; } 925h2 { color: #1a5fb4; } 926h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 927table { font-size: 21px; } 928code { font-size: 18px; } 929section.wide table { font-size: 18px; } 930section.part { background-color: #1a5fb4 !important; } 931section.part h1, section.part h2, section.part p { color: #fff !important; } 932" lang="fr-FR" data-marpit-pagination="25" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; } 933h1 { color: #1a5fb4; } 934h2 { color: #1a5fb4; } 935h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 936table { font-size: 21px; } 937code { font-size: 18px; } 938section.wide table { font-size: 18px; } 939section.part { background-color: #1a5fb4 !important; } 940section.part h1, section.part h2, section.part p { color: #fff !important; } 941;background-color:#fff;background-image:none;--marpit-advanced-background-split:33%;" data-marpit-pagination-total="35" data-marpit-advanced-background="content" data-marpit-advanced-background-split="right"> 942<h2 id="portabilit%C3%A9-de-lidentit%C3%A9">Portabilité de l'identité</h2> 943<p><strong><a href="https://keyoxide.org">Keyoxide</a></strong> produit des preuves d'identité<br /> 944décentralisées, déjà utilisées par Forgejo pour ses propres contacts.<br /> 945<strong><a href="https://w3c-ccg.github.io/did-method-web/">did:web</a></strong> permet à un domaine de publier une identité portable dès aujourd'hui.</p> 946<p>Mais quitter une instance reste synonyme d'abandonner son identité, ses<br /> 947contributions et ses relations. Radicle évite ce défaut en fondant l'identité<br /> 948sur des clés plutôt que sur un compte.</p> 949</section> 950</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 951h1 { color: #1a5fb4; } 952h2 { color: #1a5fb4; } 953h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 954table { font-size: 21px; } 955code { font-size: 18px; } 956section.wide table { font-size: 18px; } 957section.part { background-color: #1a5fb4 !important; } 958section.part h1, section.part h2, section.part p { color: #fff !important; } 959" lang="fr-FR" data-marpit-pagination="25" style="" data-marpit-pagination-total="35" data-marpit-advanced-background="pseudo" data-marpit-advanced-background-split="right"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="26" data-paginate="true" data-background-color="#1a5fb4" data-class="lead part" data-color="#ffffff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 960h1 { color: #1a5fb4; } 961h2 { color: #1a5fb4; } 962h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 963table { font-size: 21px; } 964code { font-size: 18px; } 965section.wide table { font-size: 18px; } 966section.part { background-color: #1a5fb4 !important; } 967section.part h1, section.part h2, section.part p { color: #fff !important; } 968" lang="fr-FR" class="lead part" data-marpit-pagination="26" style="--paginate:true;--background-color:#1a5fb4;--class:lead part;--color:#ffffff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; } 969h1 { color: #1a5fb4; } 970h2 { color: #1a5fb4; } 971h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 972table { font-size: 21px; } 973code { font-size: 18px; } 974section.wide table { font-size: 18px; } 975section.part { background-color: #1a5fb4 !important; } 976section.part h1, section.part h2, section.part p { color: #fff !important; } 977;color:#ffffff;background-color:#1a5fb4;background-image:none;" data-marpit-pagination-total="35"> 978<h1 id="5-d%C3%A9monstration-pratique">5. Démonstration pratique</h1> 979<h2 id="radicle-test%C3%A9-entre-r1-et-r2cyberwildorg">Radicle testé entre r1 et r2.cyberwild.org</h2> 980</section> 981</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="27" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 982h1 { color: #1a5fb4; } 983h2 { color: #1a5fb4; } 984h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 985table { font-size: 21px; } 986code { font-size: 18px; } 987section.wide table { font-size: 18px; } 988section.part { background-color: #1a5fb4 !important; } 989section.part h1, section.part h2, section.part p { color: #fff !important; } 990" lang="fr-FR" data-marpit-pagination="27" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; } 991h1 { color: #1a5fb4; } 992h2 { color: #1a5fb4; } 993h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 994table { font-size: 21px; } 995code { font-size: 18px; } 996section.wide table { font-size: 18px; } 997section.part { background-color: #1a5fb4 !important; } 998section.part h1, section.part h2, section.part p { color: #fff !important; } 999;background-color:#fff;background-image:none;" data-marpit-pagination-total="35"> 1000<h2 id="mise-en-place--identit%C3%A9s-et-connexion-directe-entre-pairs">Mise en place : identités et connexion directe entre pairs</h2> 1001<p>Radicle 1.10.3 est installé sur les deux nœuds. Pas de serveur central :<br /> 1002chaque nœud a sa propre identité (clé Ed25519) et écoute en pair-à-pair.<br /> 1003Comme r1 et r2 sont sur le même réseau local, la connexion est directe, sans<br /> 1004tunnel.</p> 1005<pre is="marp-pre" data-auto-scaling="downscale-only"><code>rad auth --alias radicle1 1006radicle-node --listen 0.0.0.0:8776 1007 1008# depuis r1, connexion directe au nœud r2 1009rad node connect z6Mkfqb...2nbFDJg@192.168.1.108:8776 1010</code></pre> 1011</section> 1012</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="28" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 1013h1 { color: #1a5fb4; } 1014h2 { color: #1a5fb4; } 1015h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 1016table { font-size: 21px; } 1017code { font-size: 18px; } 1018section.wide table { font-size: 18px; } 1019section.part { background-color: #1a5fb4 !important; } 1020section.part h1, section.part h2, section.part p { color: #fff !important; } 1021" lang="fr-FR" data-marpit-pagination="28" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; } 1022h1 { color: #1a5fb4; } 1023h2 { color: #1a5fb4; } 1024h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 1025table { font-size: 21px; } 1026code { font-size: 18px; } 1027section.wide table { font-size: 18px; } 1028section.part { background-color: #1a5fb4 !important; } 1029section.part h1, section.part h2, section.part p { color: #fff !important; } 1030;background-color:#fff;background-image:none;" data-marpit-pagination-total="35"> 1031<h2 id="un-d%C3%A9p%C3%B4t-partag%C3%A9-sans-serveur">Un dépôt partagé, sans serveur</h2> 1032<pre is="marp-pre" data-auto-scaling="downscale-only"><code># sur r1 : publier un dépôt existant sur le réseau 1033rad init --name testrepo --default-branch master --public 1034# -&gt; rad:z2YWuPL53okTkr5mgb7WCKsfxG7h8 1035 1036# sur r2 : récupérer le même dépôt directement depuis r1 1037rad clone rad:z2YWuPL53okTkr5mgb7WCKsfxG7h8 1038</code></pre> 1039<p>Le dépôt, avec ses fichiers, est répliqué intégralement entre les deux nœuds<br /> 1040via le protocole pair-à-pair, sans jamais passer par un serveur HTTP.</p> 1041</section> 1042</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="29" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 1043h1 { color: #1a5fb4; } 1044h2 { color: #1a5fb4; } 1045h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 1046table { font-size: 21px; } 1047code { font-size: 18px; } 1048section.wide table { font-size: 18px; } 1049section.part { background-color: #1a5fb4 !important; } 1050section.part h1, section.part h2, section.part p { color: #fff !important; } 1051" lang="fr-FR" data-marpit-pagination="29" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; } 1052h1 { color: #1a5fb4; } 1053h2 { color: #1a5fb4; } 1054h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 1055table { font-size: 21px; } 1056code { font-size: 18px; } 1057section.wide table { font-size: 18px; } 1058section.part { background-color: #1a5fb4 !important; } 1059section.part h1, section.part h2, section.part p { color: #fff !important; } 1060;background-color:#fff;background-image:none;" data-marpit-pagination-total="35"> 1061<h2 id="un-patch-l%C3%A9quivalent-radicle-dune-proposition-de-modification">Un patch (l'équivalent Radicle d'une proposition de modification)</h2> 1062<pre is="marp-pre" data-auto-scaling="downscale-only"><code># sur r2 : proposer un changement 1063git checkout -b feature-dummy4 1064git commit -am &quot;add dummy4.txt&quot; 1065git push rad HEAD:refs/patches 1066# -&gt; Patch 922387e... ouvert 1067 1068# sur r1 (mainteneur) : relire et fusionner 1069rad patch checkout 922387e 1070git merge --no-ff feature-dummy4-review 1071git push rad master 1072</code></pre> 1073</section> 1074</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="30" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 1075h1 { color: #1a5fb4; } 1076h2 { color: #1a5fb4; } 1077h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 1078table { font-size: 21px; } 1079code { font-size: 18px; } 1080section.wide table { font-size: 18px; } 1081section.part { background-color: #1a5fb4 !important; } 1082section.part h1, section.part h2, section.part p { color: #fff !important; } 1083" lang="fr-FR" data-marpit-pagination="30" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; } 1084h1 { color: #1a5fb4; } 1085h2 { color: #1a5fb4; } 1086h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 1087table { font-size: 21px; } 1088code { font-size: 18px; } 1089section.wide table { font-size: 18px; } 1090section.part { background-color: #1a5fb4 !important; } 1091section.part h1, section.part h2, section.part p { color: #fff !important; } 1092;background-color:#fff;background-image:none;" data-marpit-pagination-total="35"> 1093<h2 id="r%C3%A9sultat--f%C3%A9d%C3%A9ration-pair-%C3%A0-pair-sans-passerelle-http-obligatoire">Résultat : fédération pair-à-pair, sans passerelle HTTP obligatoire</h2> 1094<table> 1095<thead> 1096<tr> 1097<th>Étape</th> 1098<th>Résultat</th> 1099</tr> 1100</thead> 1101<tbody> 1102<tr> 1103<td>Connexion directe r1 et r2</td> 1104<td>établie</td> 1105</tr> 1106<tr> 1107<td>Réplication du dépôt sur r2</td> 1108<td>fichiers identiques</td> 1109</tr> 1110<tr> 1111<td>Patch ouvert sur r2, visible sur r1</td> 1112<td>propagé automatiquement</td> 1113</tr> 1114<tr> 1115<td>Fusion du patch sur r1</td> 1116<td>master mis à jour</td> 1117</tr> 1118</tbody> 1119</table> 1120<p>Contrairement à Forgejo, aucune passerelle HTTP n'est nécessaire pour fédérer : l'identité et le partage reposent sur les clés des nœuds, pas sur un serveur public, cohérent avec le tableau de comparaison de la section précédente.</p> 1121</section> 1122</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="31" data-paginate="true" data-background-color="#1a5fb4" data-class="lead part" data-color="#ffffff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 1123h1 { color: #1a5fb4; } 1124h2 { color: #1a5fb4; } 1125h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 1126table { font-size: 21px; } 1127code { font-size: 18px; } 1128section.wide table { font-size: 18px; } 1129section.part { background-color: #1a5fb4 !important; } 1130section.part h1, section.part h2, section.part p { color: #fff !important; } 1131" lang="fr-FR" class="lead part" data-marpit-pagination="31" style="--paginate:true;--background-color:#1a5fb4;--class:lead part;--color:#ffffff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; } 1132h1 { color: #1a5fb4; } 1133h2 { color: #1a5fb4; } 1134h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 1135table { font-size: 21px; } 1136code { font-size: 18px; } 1137section.wide table { font-size: 18px; } 1138section.part { background-color: #1a5fb4 !important; } 1139section.part h1, section.part h2, section.part p { color: #fff !important; } 1140;color:#ffffff;background-color:#1a5fb4;background-image:none;" data-marpit-pagination-total="35"> 1141<h1 id="6-faire-dialoguer-forgejo-et-radicle">6. Faire dialoguer Forgejo et Radicle</h1> 1142<h2 id="graft--un-miroir-entre-les-deux-mondes-d%C3%A9j%C3%A0-test%C3%A9s">graft : un miroir entre les deux mondes déjà testés</h2> 1143</section> 1144</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="32" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 1145h1 { color: #1a5fb4; } 1146h2 { color: #1a5fb4; } 1147h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 1148table { font-size: 21px; } 1149code { font-size: 18px; } 1150section.wide table { font-size: 18px; } 1151section.part { background-color: #1a5fb4 !important; } 1152section.part h1, section.part h2, section.part p { color: #fff !important; } 1153" lang="fr-FR" data-marpit-pagination="32" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; } 1154h1 { color: #1a5fb4; } 1155h2 { color: #1a5fb4; } 1156h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 1157table { font-size: 21px; } 1158code { font-size: 18px; } 1159section.wide table { font-size: 18px; } 1160section.part { background-color: #1a5fb4 !important; } 1161section.part h1, section.part h2, section.part p { color: #fff !important; } 1162;background-color:#fff;background-image:none;" data-marpit-pagination-total="35"> 1163<h2 id="ce-que-fait-graft">Ce que fait <a href="https://github.com/jeanbaptiste/graft">graft</a></h2> 1164<p>Un démon qui synchronise, entre une instance Forgejo et un nœud Radicle : le code, les tickets, et les propositions de modification dans les deux sens.</p> 1165<p>Il tourne à intervalle régulier, garde son état dans une base SQLite locale, et<br /> 1166ne force jamais un push. Les vraies divergences sont signalées et laissées à<br /> 1167l'arbitrage humain plutôt que résolues automatiquement.</p> 1168<p>Projet récent (GPLv3, quatre commits, aucune version publiée) : une<br /> 1169démonstration de faisabilité, pas un outil éprouvé.</p> 1170</section> 1171</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="33" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 1172h1 { color: #1a5fb4; } 1173h2 { color: #1a5fb4; } 1174h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 1175table { font-size: 21px; } 1176code { font-size: 18px; } 1177section.wide table { font-size: 18px; } 1178section.part { background-color: #1a5fb4 !important; } 1179section.part h1, section.part h2, section.part p { color: #fff !important; } 1180" lang="fr-FR" data-marpit-pagination="33" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; } 1181h1 { color: #1a5fb4; } 1182h2 { color: #1a5fb4; } 1183h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 1184table { font-size: 21px; } 1185code { font-size: 18px; } 1186section.wide table { font-size: 18px; } 1187section.part { background-color: #1a5fb4 !important; } 1188section.part h1, section.part h2, section.part p { color: #fff !important; } 1189;background-color:#fff;background-image:none;" data-marpit-pagination-total="35"> 1190<h2 id="relier-f1-et-r1">Relier f1 et r1</h2> 1191<pre is="marp-pre" data-auto-scaling="downscale-only"><code class="language-yaml"><span class="hljs-attr">sync_interval:</span> <span class="hljs-string">5m</span> 1192<span class="hljs-attr">state_db:</span> <span class="hljs-string">/var/lib/graft/state.db</span> 1193 1194<span class="hljs-attr">repos:</span> 1195 <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">testrepo</span> 1196 <span class="hljs-attr">forgejo:</span> 1197 <span class="hljs-attr">base_url:</span> <span class="hljs-string">https://f1.cyberwild.org</span> 1198 <span class="hljs-attr">owner:</span> <span class="hljs-string">forgeadmin</span> 1199 <span class="hljs-attr">repo:</span> <span class="hljs-string">testrepo</span> 1200 <span class="hljs-attr">token_file:</span> <span class="hljs-string">/etc/graft/testrepo.token</span> 1201 <span class="hljs-attr">radicle:</span> 1202 <span class="hljs-attr">rid:</span> <span class="hljs-string">rad:z2YWuPL53okTkr5mgb7WCKsfxG7h8</span> 1203 <span class="hljs-attr">http_base_url:</span> <span class="hljs-string">https://r1.cyberwild.org</span> 1204 <span class="hljs-attr">rad_home:</span> <span class="hljs-string">/home/graft/.radicle</span> 1205 <span class="hljs-attr">sync:</span> 1206 <span class="hljs-attr">git:</span> <span class="hljs-literal">true</span> 1207 <span class="hljs-attr">issues:</span> <span class="hljs-literal">true</span> 1208 <span class="hljs-attr">patches:</span> <span class="hljs-literal">true</span> 1209</code></pre> 1210<p>Le même dépôt que dans la démonstration Radicle, maintenant relié à f1 plutôt<br /> 1211qu'à r2 seul.</p> 1212</section> 1213</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="34" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 1214h1 { color: #1a5fb4; } 1215h2 { color: #1a5fb4; } 1216h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 1217table { font-size: 21px; } 1218code { font-size: 18px; } 1219section.wide table { font-size: 18px; } 1220section.part { background-color: #1a5fb4 !important; } 1221section.part h1, section.part h2, section.part p { color: #fff !important; } 1222" lang="fr-FR" data-marpit-pagination="34" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; } 1223h1 { color: #1a5fb4; } 1224h2 { color: #1a5fb4; } 1225h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 1226table { font-size: 21px; } 1227code { font-size: 18px; } 1228section.wide table { font-size: 18px; } 1229section.part { background-color: #1a5fb4 !important; } 1230section.part h1, section.part h2, section.part p { color: #fff !important; } 1231;background-color:#fff;background-image:none;" data-marpit-pagination-total="35"> 1232<h2 id="ce-qui-se-synchronise-et-limites-actuelles">Ce qui se synchronise et limites actuelles</h2> 1233<ul> 1234<li><strong>Code</strong> : la branche par défaut, uniquement en avance rapide.</li> 1235<li><strong>Tickets</strong> : un ticket Forgejo devient un ticket Radicle et inversement,<br /> 1236mais seulement à la création.</li> 1237<li><strong>Propositions de modification</strong> : une PR Forgejo ouvre un patch Radicle en poussant son commit de tête vers <code>refs/patches</code>, et inversement un patch Radicle ouvre une PR Forgejo.</li> 1238</ul> 1239<h2 id="aucun-force-push">Aucun force-push.</h2> 1240<h2 id="compl%C3%A9mentarit%C3%A9">Complémentarité</h2> 1241<p>graft ne tranche pas entre Radicle et Forgejo, il les traite comme<br /> 1242complémentaires : le même projet existe sur les deux à la fois.</p> 1243<p>Ce que ça ne résout pas : l'identité reste double, un compte Forgejo d'un<br /> 1244côté, une clé Radicle de l'autre.</p> 1245</section> 1246</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 1247h1 { color: #1a5fb4; } 1248h2 { color: #1a5fb4; } 1249h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 1250table { font-size: 21px; } 1251code { font-size: 18px; } 1252section.wide table { font-size: 18px; } 1253section.part { background-color: #1a5fb4 !important; } 1254section.part h1, section.part h2, section.part p { color: #fff !important; } 1255" lang="fr-FR" data-marpit-pagination="35" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; } 1256h1 { color: #1a5fb4; } 1257h2 { color: #1a5fb4; } 1258h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 1259table { font-size: 21px; } 1260code { font-size: 18px; } 1261section.wide table { font-size: 18px; } 1262section.part { background-color: #1a5fb4 !important; } 1263section.part h1, section.part h2, section.part p { color: #fff !important; } 1264;background-color:#fff;background-image:none;--marpit-advanced-background-split:28%;" data-marpit-pagination-total="35" data-marpit-advanced-background="background" data-marpit-advanced-background-split="right"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url(&quot;img/radicle.jpg&quot;);background-size:contain;"></figure></div></section></foreignObject><foreignObject width="72%" height="720"><section id="35" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 1265h1 { color: #1a5fb4; } 1266h2 { color: #1a5fb4; } 1267h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 1268table { font-size: 21px; } 1269code { font-size: 18px; } 1270section.wide table { font-size: 18px; } 1271section.part { background-color: #1a5fb4 !important; } 1272section.part h1, section.part h2, section.part p { color: #fff !important; } 1273" lang="fr-FR" data-marpit-pagination="35" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; } 1274h1 { color: #1a5fb4; } 1275h2 { color: #1a5fb4; } 1276h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 1277table { font-size: 21px; } 1278code { font-size: 18px; } 1279section.wide table { font-size: 18px; } 1280section.part { background-color: #1a5fb4 !important; } 1281section.part h1, section.part h2, section.part p { color: #fff !important; } 1282;background-color:#fff;background-image:none;--marpit-advanced-background-split:28%;" data-marpit-pagination-total="35" data-marpit-advanced-background="content" data-marpit-advanced-background-split="right"> 1283<h2 id="synth%C3%A8se-et-questions">Synthèse et questions</h2> 1284<p><strong>Discussion :</strong></p> 1285<ul> 1286<li>Qui modère une proposition de modification abusive venue d'un autre<br /> 1287serveur ?</li> 1288<li>Les miroirs et F3 marchent déjà. ActivityPub résout-il le vrai problème ?</li> 1289<li>Radicle et Forgejo : rivaux, ou deux moitiés de la même réponse ?</li> 1290</ul> 1291</section> 1292<script>!function(){"use strict";const t={h1:{proto:()=>HTMLHeadingElement,attrs:{role:"heading","aria-level":"1"},style:"display: block; font-size: 2em; margin-block-start: 0.67em; margin-block-end: 0.67em; margin-inline-start: 0px; margin-inline-end: 0px; font-weight: bold;"},h2:{proto:()=>HTMLHeadingElement,attrs:{role:"heading","aria-level":"2"},style:"display: block; font-size: 1.5em; margin-block-start: 0.83em; margin-block-end: 0.83em; margin-inline-start: 0px; margin-inline-end: 0px; font-weight: bold;"},h3:{proto:()=>HTMLHeadingElement,attrs:{role:"heading","aria-level":"3"},style:"display: block; font-size: 1.17em; margin-block-start: 1em; margin-block-end: 1em; margin-inline-start: 0px; margin-inline-end: 0px; font-weight: bold;"},h4:{proto:()=>HTMLHeadingElement,attrs:{role:"heading","aria-level":"4"},style:"display: block; margin-block-start: 1.33em; margin-block-end: 1.33em; margin-inline-start: 0px; margin-inline-end: 0px; font-weight: bold;"},h5:{proto:()=>HTMLHeadingElement,attrs:{role:"heading","aria-level":"5"},style:"display: block; font-size: 0.83em; margin-block-start: 1.67em; margin-block-end: 1.67em; margin-inline-start: 0px; margin-inline-end: 0px; font-weight: bold;"},h6:{proto:()=>HTMLHeadingElement,attrs:{role:"heading","aria-level":"6"},style:"display: block; font-size: 0.67em; margin-block-start: 2.33em; margin-block-end: 2.33em; margin-inline-start: 0px; margin-inline-end: 0px; font-weight: bold;"},span:{proto:()=>HTMLSpanElement},pre:{proto:()=>HTMLElement,style:"display: block; font-family: monospace; white-space: pre; margin: 1em 0; --marp-auto-scaling-white-space: pre;"}},e="data-marp-auto-scaling-wrapper",i="data-marp-auto-scaling-svg",n="data-marp-auto-scaling-container";class s extends HTMLElement{container;containerSize;containerObserver;svg;svgComputedStyle;svgPreserveAspectRatio="xMinYMid meet";wrapper;wrapperSize;wrapperObserver;constructor(){super();const t=t=>([e])=>{const{width:i,height:n}=e.contentRect;this[t]={width:i,height:n},this.updateSVGRect()};this.attachShadow({mode:"open"}),this.containerObserver=new ResizeObserver(t("containerSize")),this.wrapperObserver=new ResizeObserver((...e)=>{t("wrapperSize")(...e),this.flushSvgDisplay()})}static get observedAttributes(){return["data-downscale-only"]}connectedCallback(){this.shadowRoot.innerHTML=`\n<style>\n svg[${i}] { display: block; width: 100%; height: auto; vertical-align: top; }\n span[${n}] { display: table; white-space: var(--marp-auto-scaling-white-space, nowrap); width: max-content; }\n</style>\n<div ${e}>\n <svg part="svg" ${i}>\n <foreignObject><span ${n}><slot></slot></span></foreignObject>\n </svg>\n</div>\n `.split(/\n\s*/).join(""),this.wrapper=this.shadowRoot.querySelector(`div[${e}]`)??void 0;const t=this.svg;this.svg=this.wrapper?.querySelector(`svg[${i}]`)??void 0,this.svg!==t&&(this.svgComputedStyle=this.svg?window.getComputedStyle(this.svg):void 0),this.container=this.svg?.querySelector(`span[${n}]`)??void 0,this.observe()}disconnectedCallback(){this.svg=void 0,this.svgComputedStyle=void 0,this.wrapper=void 0,this.container=void 0,this.observe()}attributeChangedCallback(){this.observe()}flushSvgDisplay(){const{svg:t}=this;t&&(t.style.display="inline",requestAnimationFrame(()=>{t.style.display=""}))}observe(){this.containerObserver.disconnect(),this.wrapperObserver.disconnect(),this.wrapper&&this.wrapperObserver.observe(this.wrapper),this.container&&this.containerObserver.observe(this.container),this.svgComputedStyle&&this.observeSVGStyle(this.svgComputedStyle)}observeSVGStyle(t){const e=()=>{const i=(()=>{const e=t.getPropertyValue("--preserve-aspect-ratio");if(e)return e.trim();return`x${(({textAlign:t,direction:e})=>{if(t.endsWith("left"))return"Min";if(t.endsWith("right"))return"Max";if("start"===t||"end"===t){let i="rtl"===e;return"end"===t&&(i=!i),i?"Max":"Min"}return"Mid"})(t)}YMid meet`})();i!==this.svgPreserveAspectRatio&&(this.svgPreserveAspectRatio=i,this.updateSVGRect()),t===this.svgComputedStyle&&requestAnimationFrame(e)};e()}updateSVGRect(){let t=Math.ceil(this.containerSize?.width??0);const e=Math.ceil(this.containerSize?.height??0);void 0!==this.dataset.downscaleOnly&&(t=Math.max(t,this.wrapperSize?.width??0));const i=this.svg?.querySelector(":scope > foreignObject");if(i?.setAttribute("width",`${t}`),i?.setAttribute("height",`${e}`),this.svg&&(this.svg.setAttribute("viewBox",`0 0 ${t} ${e}`),this.svg.setAttribute("preserveAspectRatio",this.svgPreserveAspectRatio),this.svg.style.height=t<=0||e<=0?"0":""),this.container){const t=this.svgPreserveAspectRatio.toLowerCase();this.container.style.marginLeft=t.startsWith("xmid")||t.startsWith("xmax")?"auto":"0",this.container.style.marginRight=t.startsWith("xmi")?"auto":"0"}}}const r=(t,{attrs:e={},style:i})=>class extends t{constructor(...t){super(...t);for(const[t,i]of Object.entries(e))this.hasAttribute(t)||this.setAttribute(t,i);this._shadow()}static get observedAttributes(){return["data-auto-scaling"]}connectedCallback(){this._update()}attributeChangedCallback(){this._update()}_shadow(){if(!this.shadowRoot)try{this.attachShadow({mode:"open"})}catch(t){if(!(t instanceof Error&&"NotSupportedError"===t.name))throw t}return this.shadowRoot}_update(){const t=this._shadow();if(t){const e=i?`<style>:host { ${i} }</style>`:"";let n="<slot></slot>";const{autoScaling:s}=this.dataset;if(void 0!==s){n=`<marp-auto-scaling exportparts="svg:auto-scaling" ${"downscale-only"===s?"data-downscale-only":""}>${n}</marp-auto-scaling>`}t.innerHTML=e+n}}};let o;const a=()=>o??(o=!!document.createElement("div",{is:"marp-auto-scaling"}).outerHTML.startsWith("<div is"),o),l=Symbol();let c;const d="marpitSVGPolyfill:setZoomFactor,",h=Symbol(),g=Symbol();const p=()=>{const t="Apple Computer, Inc."===navigator.vendor,e=t?[v]:[],i={then:e=>(t?(async()=>{if(void 0===c){const t=document.createElement("canvas");t.width=10,t.height=10;const e=t.getContext("2d"),i=new Image(10,10),n=new Promise(t=>{i.addEventListener("load",()=>t())});i.crossOrigin="anonymous",i.src="data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2210%22%20height%3D%2210%22%20viewBox%3D%220%200%201%201%22%3E%3CforeignObject%20width%3D%221%22%20height%3D%221%22%20requiredExtensions%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%3Cdiv%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%20style%3D%22width%3A%201px%3B%20height%3A%201px%3B%20background%3A%20red%3B%20position%3A%20relative%22%3E%3C%2Fdiv%3E%3C%2FforeignObject%3E%3C%2Fsvg%3E",await n,e.drawImage(i,0,0),c=e.getImageData(5,5,1,1).data[3]<128}return c})().then(t=>{null==e||e(t?[v]:[])}):null==e||e([]),i)};return Object.assign(e,i)};let m,u;function v(t){const e="object"==typeof t&&t.target||document,i="object"==typeof t?t.zoom:t;window[g]||(Object.defineProperty(window,g,{configurable:!0,value:!0}),document.body.style.zoom=1.0001,document.body.offsetHeight,document.body.style.zoom=1,window.addEventListener("message",({data:t,origin:e})=>{if(e===window.origin)try{if(t&&"string"==typeof t&&t.startsWith(d)){const[,e]=t.split(","),i=Number.parseFloat(e);Number.isNaN(i)||(u=i)}}catch(t){console.error(t)}}));let n=!1;Array.from(e.querySelectorAll("svg[data-marpit-svg]"),t=>{var e,s,r,o;t.style.transform||(t.style.transform="translateZ(0)");const a=i||u||t.currentScale||1;m!==a&&(m=a,n=a);const l=t.getBoundingClientRect(),{length:c}=t.children;for(let i=0;i<c;i+=1){const n=t.children[i];if(n.getScreenCTM){const t=n.getScreenCTM();if(t){const i=null!==(s=null===(e=n.x)||void 0===e?void 0:e.baseVal.value)&&void 0!==s?s:0,c=null!==(o=null===(r=n.y)||void 0===r?void 0:r.baseVal.value)&&void 0!==o?o:0,d=n.children.length;for(let e=0;e<d;e+=1){const s=n.children[e];if("SECTION"===s.tagName){const{style:e}=s;e.transformOrigin||(e.transformOrigin=`${-i}px ${-c}px`),e.transform=`scale(${a}) matrix(${t.a}, ${t.b}, ${t.c}, ${t.d}, ${t.e-l.left}, ${t.f-l.top}) translateZ(0.0001px)`;break}}}}}}),!1!==n&&Array.from(e.querySelectorAll("iframe"),({contentWindow:t})=>{null==t||t.postMessage(`${d}${n}`,"null"===window.origin?"*":window.origin)})}function w({once:t=!1,target:e=document}={}){const i=function(t=document){if(t[h])return t[h];let e=!0;const i=()=>{e=!1,delete t[h]};Object.defineProperty(t,h,{configurable:!0,value:i});let n=[],s=!1;(async()=>{try{n=await p()}finally{s=!0}})();const r=()=>{for(const e of n)e({target:t});s&&0===n.length||e&&window.requestAnimationFrame(r)};return r(),i}(e);return t?(i(),()=>{}):i}m=1,u=void 0;const b=Symbol(),y=(e=document)=>{if("undefined"==typeof window)throw new Error("Marp Core's browser script is valid only in browser context.");if(((e=document)=>{const i=window[l];i||customElements.define("marp-auto-scaling",s);for(const n of Object.keys(t)){const s=`marp-${n}`,o=t[n].proto();a()&&o!==HTMLElement?i||customElements.define(s,r(o,{style:t[n].style}),{extends:n}):(i||customElements.define(s,r(HTMLElement,t[n])),e.querySelectorAll(`${n}[is="${s}"]`).forEach(t=>{t.outerHTML=t.outerHTML.replace(new RegExp(`^<${n}`,"i"),`<${s}`).replace(new RegExp(`</${n}>$`,"i"),`</${s}>`)}))}window[l]=!0})(e),e[b])return e[b];const i=w({target:e}),n=()=>{i(),delete e[b]},o=Object.assign(n,{cleanup:n,update:()=>y(e)});return Object.defineProperty(e,b,{configurable:!0,value:o}),o},f=document.currentScript;y(f?f.getRootNode():document)}(); 1293</script></foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; } 1294h1 { color: #1a5fb4; } 1295h2 { color: #1a5fb4; } 1296h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; } 1297table { font-size: 21px; } 1298code { font-size: 18px; } 1299section.wide table { font-size: 18px; } 1300section.part { background-color: #1a5fb4 !important; } 1301section.part h1, section.part h2, section.part p { color: #fff !important; } 1302" lang="fr-FR" data-marpit-pagination="35" style="" data-marpit-pagination-total="35" data-marpit-advanced-background="pseudo" data-marpit-advanced-background-split="right"></section></foreignObject></svg></div><script>/*!! License: https://unpkg.com/@marp-team/marp-cli@4.5.1/lib/bespoke.js.LICENSE.txt */ 1303!function(){"use strict";function e(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var t,n,r=(n||(n=1,t={from:function(e,t){var n,r=1===(e.parent||e).nodeType?e.parent||e:document.querySelector(e.parent||e),o=[].filter.call("string"==typeof e.slides?r.querySelectorAll(e.slides):e.slides||r.children,function(e){return"SCRIPT"!==e.nodeName}),i={},a=function(e,t){return(t=t||{}).index=o.indexOf(e),t.slide=e,t},s=function(e,t){i[e]=(i[e]||[]).filter(function(e){return e!==t})},l=function(e,t){return(i[e]||[]).reduce(function(e,n){return e&&!1!==n(t)},!0)},c=function(e,t){o[e]&&(n&&l("deactivate",a(n,t)),n=o[e],l("activate",a(n,t)))},d=function(e,t){var r=o.indexOf(n)+e;l(e>0?"next":"prev",a(n,t))&&c(r,t)},u={off:s,on:function(e,t){return(i[e]||(i[e]=[])).push(t),s.bind(null,e,t)},fire:l,slide:function(e,t){if(!arguments.length)return o.indexOf(n);l("slide",a(o[e],t))&&c(e,t)},next:d.bind(null,1),prev:d.bind(null,-1),parent:r,slides:o,destroy:function(e){l("destroy",a(n,e)),i={}}};return(t||[]).forEach(function(e){e(u)}),n||c(0),u}}),t),o=e(r);const i=document.body,a=(...e)=>history.replaceState(...e),s="",l="presenter",c="next",d="overview",u=["",l,d,c],f="bespoke-marp-",m=`data-${f}`,g=(e,{protocol:t,host:n,pathname:r,hash:o}=location)=>{const i=e.toString();return`${t}//${n}${r}${i?"?":""}${i}${o}`},p=()=>i.dataset.bespokeView,v=e=>new URLSearchParams(location.search).get(e),h=(e,t={})=>{const n={location,setter:a,...t},r=new URLSearchParams(n.location.search);for(const t of Object.keys(e)){const n=e[t];"string"==typeof n?r.set(t,n):r.delete(t)}try{n.setter({...window.history.state??{}},"",g(r,n.location))}catch(e){console.error(e)}},w=(()=>{const e="bespoke-marp";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return!1}})(),y=e=>{try{return localStorage.getItem(e)}catch{return null}},b=(e,t)=>{try{return localStorage.setItem(e,t),!0}catch{return!1}},k=e=>{try{return localStorage.removeItem(e),!0}catch{return!1}},x=(e,t)=>{const n="aria-hidden";t?e.setAttribute(n,"true"):e.removeAttribute(n)},E=e=>{e.parent.classList.add(`${f}parent`),e.slides.forEach(e=>e.classList.add(`${f}slide`)),e.on("activate",t=>{const n=`${f}active`,r=t.slide,o=r.classList,i=!o.contains(n);if(e.slides.forEach(e=>{e.classList.remove(n),x(e,!0)}),o.add(n),x(r,!1),i){const e=`${n}-ready`;o.add(e),document.body.clientHeight,o.remove(e)}})},$=e=>{let t=0,n=0;Object.defineProperty(e,"fragments",{enumerable:!0,value:e.slides.map(e=>[null,...e.querySelectorAll("[data-marpit-fragment]")])});const r=r=>void 0!==e.fragments[t][n+r],o=(r,o)=>{t=r,n=o,e.fragments.forEach((e,t)=>{e.forEach((e,n)=>{if(null==e)return;const i=t<r||t===r&&n<=o;e.setAttribute(`${m}fragment`,(i?"":"in")+"active");const a=`${m}current-fragment`;t===r&&n===o?e.setAttribute(a,"current"):e.removeAttribute(a)})}),e.fragmentIndex=o;const i={slide:e.slides[r],index:r,fragments:e.fragments[r],fragmentIndex:o};e.fire("fragment",i)};e.on("next",({fragment:i=!0})=>{if(i){if(r(1))return o(t,n+1),!1;const i=t+1;e.fragments[i]&&o(i,0)}else{const r=e.fragments[t].length;if(n+1<r)return o(t,r-1),!1;const i=e.fragments[t+1];i&&o(t+1,i.length-1)}}),e.on("prev",({fragment:i=!0})=>{if(r(-1)&&i)return o(t,n-1),!1;const a=t-1;e.fragments[a]&&o(a,e.fragments[a].length-1)}),e.on("slide",({index:t,fragment:n})=>{let r=0;if(void 0!==n){const o=e.fragments[t];if(o){const{length:e}=o;r=-1===n?e-1:Math.min(Math.max(n,0),e-1)}}o(t,r)}),o(0,0)},L=document,S=()=>!(!L.fullscreenEnabled&&!L.webkitFullscreenEnabled),P=()=>!(!L.fullscreenElement&&!L.webkitFullscreenElement),_=e=>{e.fullscreen=()=>{S()&&(async()=>{P()?(L.exitFullscreen||L.webkitExitFullscreen)?.call(L):((e=L.body)=>{(e.requestFullscreen||e.webkitRequestFullscreen)?.call(e)})()})()},document.addEventListener("keydown",t=>{"f"!==t.key&&"F11"!==t.key||t.altKey||t.ctrlKey||t.metaKey||!S()||(e.fullscreen(),t.preventDefault())})},O=`${f}inactive`,T=(e=2e3)=>({parent:t,fire:n})=>{const r=t.classList,o=e=>n(`marp-${e?"":"in"}active`);let i;const a=()=>{i&&clearTimeout(i),i=setTimeout(()=>{r.add(O),o()},e),r.contains(O)&&(r.remove(O),o(!0))};for(const e of["mousedown","mousemove","touchend"])document.addEventListener(e,a);setTimeout(a,0)},I=["AUDIO","BUTTON","INPUT","SELECT","TEXTAREA","VIDEO"],M=e=>{e.parent.addEventListener("keydown",e=>{if(!e.target)return;const t=e.target;(I.includes(t.nodeName)||"true"===t.contentEditable)&&e.stopPropagation()})},A=e=>{window.addEventListener("load",()=>{for(const t of e.slides){const e=t.querySelector("marp-auto-scaling, [data-auto-scaling], [data-marp-fitting]");t.setAttribute(`${m}load`,e?"":"hideable")}})},C=({interval:e=250}={})=>t=>{document.addEventListener("keydown",e=>{if(" "===e.key&&e.shiftKey)t.prev();else if("ArrowLeft"===e.key||"ArrowUp"===e.key||"PageUp"===e.key)t.prev({fragment:!e.shiftKey});else if(" "!==e.key||e.shiftKey)if("ArrowRight"===e.key||"ArrowDown"===e.key||"PageDown"===e.key)t.next({fragment:!e.shiftKey});else if("End"===e.key)t.slide(t.slides.length-1,{fragment:-1});else{if("Home"!==e.key)return;t.slide(0)}else t.next();e.preventDefault()});let n,r,o=0;t.parent.addEventListener("wheel",i=>{let a=!1;const s=(e,t)=>{e&&(a=a||((e,t)=>((e,t)=>{const n="X"===t?"Width":"Height";return e[`client${n}`]<e[`scroll${n}`]})(e,t)&&((e,t)=>{const{overflow:n}=e,r=e[`overflow${t}`];return"auto"===n||"scroll"===n||"auto"===r||"scroll"===r})(getComputedStyle(e),t))(e,t)),e?.parentElement&&s(e.parentElement,t)};if(0!==i.deltaX&&s(i.target,"X"),0!==i.deltaY&&s(i.target,"Y"),a)return;i.preventDefault();const l=Math.sqrt(i.deltaX**2+i.deltaY**2);if(void 0!==i.wheelDelta){if(void 0===i.webkitForce&&Math.abs(i.wheelDelta)<40)return;if(i.deltaMode===i.DOM_DELTA_PIXEL&&l<4)return}else if(i.deltaMode===i.DOM_DELTA_PIXEL&&l<12)return;r&&clearTimeout(r),r=setTimeout(()=>{n=0},e);const c=Date.now()-o<e,d=l<=n;if(n=l,c||d)return;let u;(i.deltaX>0||i.deltaY>0)&&(u="next"),(i.deltaX<0||i.deltaY<0)&&(u="prev"),u&&(t[u](),o=Date.now())})},D=(e=`.${f}osc`)=>{const t=document.querySelector(e);if(!t)return()=>{};const n=(e,n)=>{t.querySelectorAll(`[${m}osc=${JSON.stringify(e)}]`).forEach(n)};if(S()||n("fullscreen",e=>e.style.display="none"),!w){const e=(e,t)=>{e.disabled=!0,e.title=`${t} is disabled due to restricted localStorage.`};n("presenter",t=>e(t,"Presenter view")),n("overview",t=>e(t,"Overview view"))}return e=>{t.addEventListener("click",t=>{if(t.target instanceof HTMLElement){const{bespokeMarpOsc:n}=t.target.dataset;n&&t.target.blur();const r={fragment:!t.shiftKey};"next"===n?e.next(r):"prev"===n?e.prev(r):"fullscreen"===n?e?.fullscreen():"presenter"===n?e.openPresenterView():"overview"===n&&e.toggleOverviewView()}}),e.parent.appendChild(t),e.on("activate",({index:t})=>{n("page",n=>n.textContent=`Page ${t+1} of ${e.slides.length}`)}),e.on("fragment",({index:t,fragments:r,fragmentIndex:o})=>{n("prev",e=>e.disabled=0===t&&0===o),n("next",n=>n.disabled=t===e.slides.length-1&&o===r.length-1)}),e.on("marp-active",()=>x(t,!1)),e.on("marp-inactive",()=>x(t,!0)),S()&&(e=>{for(const t of["","webkit"])L.addEventListener(t+"fullscreenchange",e)})(()=>n("fullscreen",e=>e.classList.toggle("exit",S()&&P())))}},N=e=>{if(e.syncKey&&"string"==typeof e.syncKey)return!0;throw new Error("The current instance of Bespoke.js is incompatible with Marp bespoke sync plugin.")},B=(e={})=>{const t=e.key||window.history.state?.marpBespokeSyncKey||Math.random().toString(36).slice(2),n=`bespoke-marp-sync-${t}`;var r;r={marpBespokeSyncKey:t},h({},{setter:(e,...t)=>a({...e,...r},...t)});const o=()=>{const e=y(n);return e?JSON.parse(e):Object.create(null)},i=e=>{const t=o(),r={...t,...e(t)};return b(n,JSON.stringify(r)),r},s=()=>{window.removeEventListener("pageshow",s),i(e=>({reference:(e.reference||0)+1}))};return e=>{s(),Object.defineProperty(e,"syncKey",{value:t,enumerable:!0});let r=!0;setTimeout(()=>{e.on("fragment",e=>{r&&i(()=>({index:e.index,fragmentIndex:e.fragmentIndex}))})},0),window.addEventListener("storage",t=>{if(t.key===n&&t.oldValue&&t.newValue){const n=JSON.parse(t.oldValue),o=JSON.parse(t.newValue);if(n.index!==o.index||n.fragmentIndex!==o.fragmentIndex)try{r=!1,e.slide(o.index,{fragment:o.fragmentIndex,forSync:!0})}finally{r=!0}}});const a=()=>{const{reference:e}=o();void 0===e||e<=1?k(n):i(()=>({reference:e-1}))};window.addEventListener("pagehide",e=>{e.persisted&&window.addEventListener("pageshow",s),a()}),e.on("destroy",a)}},K=e=>{w&&document.addEventListener("keydown",t=>{("o"!==t.key||t.altKey||t.ctrlKey||t.metaKey)&&"Escape"!==t.key||(t.preventDefault(),e())})};let q=null;const V=({closeOnSelect:e=!0}={})=>t=>{N(t);const n=n=>{const r=(()=>{if(!q||!q.isConnected){q=document.createElement("div"),q.className=`${f}overview`,q.inert=!0;const n=document.createElement("iframe");n.src=(()=>{const n=new URLSearchParams(location.search);return n.set("view","overview"),n.set("sync",t.syncKey),e&&n.set("closeOnSelect","1"),g(n)})(),q.append(n),document.body.append(q)}return q})(),o=n??!r.dataset.open;setTimeout(()=>{if(r.dataset.open=o?"1":"",r.inert=!o,t.skipTransition=o,o){const e=r.querySelector("iframe");try{e?.contentWindow?.focus()}catch{e?.focus()}}else window.focus()},0)};Object.defineProperties(t,{toggleOverviewView:{enumerable:!0,value:n}}),window.addEventListener("message",e=>{e.origin===window.origin&&"closeOverview"===e.data&&n(!1)}),K(n)},j=e=>{const{title:t}=document;document.title="[Overview]"+(t?` - ${t}`:"");const n=!!v("closeOnSelect"),r=()=>{window.parent.postMessage("closeOverview","null"===window.origin?"*":window.origin)};if(e.slides.forEach((t,o)=>{t.tabIndex=0;const i=()=>{e.slide(o,{fragment:-1}),n&&r()};t.addEventListener("click",i),t.addEventListener("keydown",e=>{"Enter"!==e.key&&" "!==e.key||(e.preventDefault(),i())})}),window.addEventListener("keydown",t=>{const n=e.slide(),r=t=>{const r=t=>{const n=e.slides[t].getBoundingClientRect();return[Math.round((n.left+n.right)/2),Math.round((n.top+n.bottom)/2)]};let o=null,i=n;do{const e=r(i);if(o){if(Math.abs(e[0]-o[0])<2)return i}else o=e;i+=t}while(i>=0&&i<e.slides.length);return n};if("ArrowLeft"===t.key)e.slide(Math.max(n-1,0),{fragment:-1});else if("ArrowRight"===t.key)e.slide(Math.min(n+1,e.slides.length-1),{fragment:-1});else if("ArrowUp"===t.key)e.slide(r(-1),{fragment:-1});else if("ArrowDown"===t.key)e.slide(r(1),{fragment:-1});else if("End"===t.key)e.slide(e.slides.length-1,{fragment:-1});else{if("Home"!==t.key)return;e.slide(0,{fragment:-1})}t.preventDefault();const o=e.slide();e.slides[o]?.focus?.(),e.slides[o]?.scrollIntoView?.({behavior:"smooth",block:"nearest"})}),e.on("slide",({index:t})=>{e.slides[t]?.scrollIntoView?.({behavior:"smooth",block:"nearest"})}),window.parent!==window){K(r);const e=document.createElement("header");e.className=`${f}overview-header`;const t=document.createElement("button");t.className=`${f}overview-close`,t.type="button",t.title="Close overview",t.textContent=t.title,t.addEventListener("click",r),e.append(t),document.body.prepend(e)}},F=()=>{const e=p();return{[s]:V(),[l]:V({closeOnSelect:!1}),[d]:j}[e]},U=e=>{window.addEventListener("message",t=>{if(t.origin!==window.origin)return;const[n,r]=t.data.split(":");if("navigate"===n){const[t,n]=r.split(",");let o=Number.parseInt(t,10),i=Number.parseInt(n,10)+1;i>=e.fragments[o].length&&(o+=1,i=0),e.slide(o,{fragment:i})}})};var R,X,H,W,J,Y,z,G={exports:{}},Q=(R||(R=1,G.exports=(X=["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"],H=function(e){return String(e).replace(/[&<>"']/g,function(e){return"&"+W[e]+";"})},W={"&":"amp","<":"lt",">":"gt",'"':"quot","'":"apos"},J="dangerouslySetInnerHTML",Y={className:"class",htmlFor:"for"},z={},function(e,t){var n=[],r="";t=t||{};for(var o=arguments.length;o-- >2;)n.push(arguments[o]);if("function"==typeof e)return t.children=n.reverse(),e(t);if(e){if(r+="<"+e,t)for(var i in t)!1!==t[i]&&null!=t[i]&&i!==J&&(r+=" "+(Y[i]?Y[i]:H(i))+'="'+H(t[i])+'"');r+=">"}if(-1===X.indexOf(e)){if(t[J])r+=t[J].__html;else for(;n.length;){var a=n.pop();if(a)if(a.pop)for(var s=a.length;s--;)n.push(a[s]);else r+=!0===z[a]?a:H(a)}r+=e?"</"+e+">":""}return z[r]=!0,r})),G.exports),Z=e(Q);const ee=({children:e})=>Z(null,null,...e),te=`${f}presenter-`,ne={container:`${te}container`,dragbar:`${te}dragbar-container`,next:`${te}next`,nextContainer:`${te}next-container`,noteContainer:`${te}note-container`,noteWrapper:`${te}note-wrapper`,noteButtons:`${te}note-buttons`,infoContainer:`${te}info-container`,infoPageArea:`${te}info-page-area`,infoPage:`${te}info-page`,infoPagePrev:`${te}info-page-prev`,infoPageNext:`${te}info-page-next`,noteButtonsBigger:`${te}note-bigger`,noteButtonsSmaller:`${te}note-smaller`,infoTime:`${te}info-time`,infoTimer:`${te}info-timer`},re=e=>{const{title:t}=document;document.title="[Presenter view]"+(t?` - ${t}`:"");const n={},r=e=>(n[e]=n[e]||document.querySelector(`.${e}`),n[e]);document.body.appendChild((e=>{const t=document.createElement("div");return t.className=ne.container,t.appendChild(e),t.insertAdjacentHTML("beforeend",Z(ee,null,Z("div",{class:ne.nextContainer},Z("iframe",{class:ne.next,src:"?view=next"})),Z("div",{class:ne.dragbar}),Z("div",{class:ne.noteContainer},Z("div",{class:ne.noteWrapper}),Z("div",{class:ne.noteButtons},Z("button",{class:ne.noteButtonsSmaller,tabindex:"-1",title:"Smaller notes font size"},"Smaller notes font size"),Z("button",{class:ne.noteButtonsBigger,tabindex:"-1",title:"Bigger notes font size"},"Bigger notes font size"))),Z("div",{class:ne.infoContainer},Z("div",{class:ne.infoPageArea},Z("button",{class:ne.infoPagePrev,tabindex:"-1",title:"Previous"},"Previous"),Z("button",{class:ne.infoPage}),Z("button",{class:ne.infoPageNext,tabindex:"-1",title:"Next"},"Next")),Z("time",{class:ne.infoTime,title:"Current time"}),Z("time",{class:ne.infoTimer,title:"Timer"})))),t})(e.parent)),(e=>{let t=!1;r(ne.dragbar).addEventListener("mousedown",()=>{t=!0,r(ne.dragbar).classList.add("active")}),window.addEventListener("mouseup",()=>{t=!1,r(ne.dragbar).classList.remove("active")}),window.addEventListener("mousemove",e=>{if(!t)return;const n=e.clientX/document.documentElement.clientWidth*100;r(ne.container).style.setProperty("--bespoke-marp-presenter-split-ratio",`${Math.max(0,Math.min(100,n))}%`)}),r(ne.nextContainer).addEventListener("click",()=>e.next());const n=r(ne.next),o=(i=n,(e,t)=>i.contentWindow?.postMessage(`navigate:${e},${t}`,"null"===window.origin?"*":window.origin));var i;n.addEventListener("load",()=>{r(ne.nextContainer).classList.add("active"),o(e.slide(),e.fragmentIndex),e.on("fragment",({index:e,fragmentIndex:t})=>o(e,t))});const a=document.querySelectorAll(".bespoke-marp-note");a.forEach(e=>{e.addEventListener("keydown",e=>e.stopPropagation()),r(ne.noteWrapper).appendChild(e)}),e.on("activate",()=>a.forEach(t=>t.classList.toggle("active",t.dataset.index==e.slide())));let s=0;const l=e=>{s=Math.max(-5,s+e),r(ne.noteContainer).style.setProperty("--bespoke-marp-note-font-scale",(1.2**s).toFixed(4))},c=()=>l(1),d=()=>l(-1),u=r(ne.noteButtonsBigger),f=r(ne.noteButtonsSmaller);u.addEventListener("click",()=>{u.blur(),c()}),f.addEventListener("click",()=>{f.blur(),d()}),document.addEventListener("keydown",e=>{"+"===e.key&&c(),"-"===e.key&&d()},!0);const m=r(ne.infoPage);e.on("activate",({index:t})=>{m.textContent=`${t+1} / ${e.slides.length}`}),m.addEventListener("click",()=>{m.blur(),e.toggleOverviewView()});const g=r(ne.infoPagePrev),p=r(ne.infoPageNext);g.addEventListener("click",t=>{g.blur(),e.prev({fragment:!t.shiftKey})}),p.addEventListener("click",t=>{p.blur(),e.next({fragment:!t.shiftKey})}),e.on("fragment",({index:t,fragments:n,fragmentIndex:r})=>{g.disabled=0===t&&0===r,p.disabled=t===e.slides.length-1&&r===n.length-1});let v=new Date;const h=()=>{const e=new Date,t=e=>`${Math.floor(e)}`.padStart(2,"0"),n=e.getTime()-v.getTime(),o=t(n/1e3%60),i=t(n/1e3/60%60),a=t(n/36e5%24);r(ne.infoTime).textContent=e.toLocaleTimeString(),r(ne.infoTimer).textContent=`${a}:${i}:${o}`};h(),setInterval(h,250),r(ne.infoTimer).addEventListener("click",()=>{v=new Date})})(e)},oe=e=>{N(e),Object.defineProperties(e,{openPresenterView:{enumerable:!0,value:ie},presenterUrl:{enumerable:!0,get:ae}}),w&&document.addEventListener("keydown",t=>{"p"!==t.key||t.altKey||t.ctrlKey||t.metaKey||(t.preventDefault(),e.openPresenterView())})};function ie(){const{max:e,floor:t}=Math,n=e(t(.85*window.innerWidth),640),r=e(t(.85*window.innerHeight),360);return window.open(this.presenterUrl,te+this.syncKey,`width=${n},height=${r},menubar=no,toolbar=no`)}function ae(){const e=new URLSearchParams(location.search);return e.set("view","presenter"),e.set("sync",this.syncKey),g(e)}const se=e=>{const t=p();return t===c&&e.appendChild(document.createElement("span")),{[s]:oe,[l]:re,[c]:U}[t]},le=e=>{e.on("activate",t=>{document.querySelectorAll(".bespoke-progress-parent > .bespoke-progress-bar").forEach(n=>{n.style.flexBasis=100*t.index/(e.slides.length-1)+"%"})})},ce=e=>{const t=Number.parseInt(e,10);return Number.isNaN(t)?null:t},de=(e={})=>{const t={history:!0,...e};return e=>{let n=!0;const r=e=>{const t=n;try{return n=!0,e()}finally{n=t}},o=(t={fragment:!0})=>{let n=t.fragment?ce(v("f")||""):null;((t,n)=>{const{min:r,max:o}=Math,{fragments:i,slides:a}=e,s=o(0,r(t,a.length-1)),l=o(0,r(n||0,i[s].length-1));s===e.slide()&&l===e.fragmentIndex||e.slide(s,{fragment:l})})((()=>{if(location.hash){const[t]=location.hash.slice(1).split(":~:");if(/^\d+$/.test(t))return(ce(t)??1)-1;const r=document.getElementById(t)||document.querySelector(`a[name="${CSS.escape(t)}"]`);if(r){const{length:t}=e.slides;for(let o=0;o<t;o+=1)if(e.slides[o].contains(r)){const t=e.fragments?.[o],i=r.closest("[data-marpit-fragment]");if(t&&i){const e=t.indexOf(i);e>=0&&(n=e)}return o}}}return 0})(),n)};e.on("fragment",({index:e,fragmentIndex:r})=>{n||h({f:0===r||r.toString()},{location:{...location,hash:`#${e+1}`},setter:(...e)=>t.history?history.pushState(...e):history.replaceState(...e)})}),setTimeout(()=>{o(),window.addEventListener("hashchange",()=>r(()=>{o({fragment:!1}),h({f:void 0})})),window.addEventListener("popstate",()=>{n||r(()=>o())}),n=!1},0)}},{PI:ue,abs:fe,sqrt:me,atan2:ge}=Math,pe={passive:!0},ve=({slope:e=-.7,swipeThreshold:t=30}={})=>n=>{let r;const o=n.parent,i=e=>{const t=o.getBoundingClientRect();return{x:e.pageX-(t.left+t.right)/2,y:e.pageY-(t.top+t.bottom)/2}};o.addEventListener("touchstart",({touches:e})=>{r=1===e.length?i(e[0]):void 0},pe),o.addEventListener("touchmove",e=>{if(r)if(1===e.touches.length){e.preventDefault();const t=i(e.touches[0]),n=t.x-r.x,o=t.y-r.y;r.delta=me(fe(n)**2+fe(o)**2),r.radian=ge(n,o)}else r=void 0}),o.addEventListener("touchend",o=>{if(r){if(r.delta&&r.delta>=t&&r.radian){const t=(r.radian-e+ue)%(2*ue)-ue;n[t<0?"next":"prev"](),o.stopPropagation()}r=void 0}},pe)},he=new Map;he.clear(),he.set("none",{backward:{both:void 0,incoming:void 0,outgoing:void 0},forward:{both:void 0,incoming:void 0,outgoing:void 0}});const we={both:"",outgoing:"outgoing-",incoming:"incoming-"},ye={forward:"",backward:"-backward"},be=e=>`--marp-bespoke-transition-animation-${e}`,ke=e=>`--marp-transition-${e}`,xe=be("name"),Ee=be("duration"),$e=e=>new Promise(t=>{const n={},r=document.createElement("div"),o=e=>{r.remove(),t(e)};r.addEventListener("animationstart",()=>o(n)),Object.assign(r.style,{animationName:e,animationDuration:"1s",animationFillMode:"both",animationPlayState:"paused",position:"absolute",pointerEvents:"none"}),document.body.appendChild(r);const i=getComputedStyle(r).getPropertyValue(ke("duration"));i&&Number.parseFloat(i)>=0&&(n.defaultDuration=i),((e,t)=>{requestAnimationFrame(()=>{e.style.animationPlayState="running",requestAnimationFrame(()=>t(void 0))})})(r,o)}),Le=async e=>he.has(e)?he.get(e):(e=>{const t={},n=[];for(const[r,o]of Object.entries(we))for(const[i,a]of Object.entries(ye)){const s=`marp-${o}transition${a}-${e}`;n.push($e(s).then(e=>{t[i]=t[i]||{},t[i][r]=e?{...e,name:s}:void 0}))}return Promise.all(n).then(()=>t)})(e).then(t=>(he.set(e,t),t)),Se=e=>Object.values(e).flatMap(Object.values).every(e=>!e),Pe=(e,{type:t,backward:n})=>{const r=e[n?"backward":"forward"],o=(()=>{const e=r[t],n=e=>({[xe]:e.name});if(e)return n(e);if(r.both){const e=n(r.both);return"incoming"===t&&(e[be("direction")]="reverse"),e}})();return!o&&n?Pe(e,{type:t,backward:!1}):o||{[xe]:"__bespoke_marp_transition_no_animation__"}},_e=e=>{if(e)try{const t=JSON.parse(e);if((e=>{if("object"!=typeof e)return!1;const t=e;return"string"==typeof t.name&&(void 0===t.duration||"string"==typeof t.duration)})(t))return t}catch{}},Oe="_tSId",Te="_tA",Ie="bespoke-marp-transition-warming-up",Me=window.matchMedia("(prefers-reduced-motion: reduce)"),Ae="__bespoke_marp_transition_reduced_outgoing__",Ce="__bespoke_marp_transition_reduced_incoming__",De={forward:{both:void 0,incoming:{name:Ce},outgoing:{name:Ae}},backward:{both:void 0,incoming:{name:Ce},outgoing:{name:Ae}}},Ne=e=>{if(!document.startViewTransition)return;const t=t=>(void 0!==t&&(e._tD=t),e._tD);let n;t(!1),((...e)=>{CSS.registerProperty({name:ke("duration"),syntax:"<time>",inherits:!0,initialValue:"-1s"});const t=[...new Set(e).values()];return Promise.all(t.map(e=>Le(e))).then()})(...Array.from(document.querySelectorAll("section[data-transition], section[data-transition-back]")).flatMap(e=>[e.dataset.transition,e.dataset.transitionBack].flatMap(e=>{const t=_e(e);return[t?.name,t?.builtinFallback?`__builtin__${t.name}`:void 0]}).filter(e=>!!e))).then(()=>{document.querySelectorAll("style").forEach(e=>{e.innerHTML=e.innerHTML.replace(/--marp-transition-duration:[^;}]*[;}]/g,e=>e.slice(0,-1)+"!important"+e.slice(-1))})});const r=(n,{back:r,cond:o})=>i=>{const a=t();if(a)return!!i[Te]||!("object"!=typeof a||(a.skipTransition(),!i.forSync));if(e.skipTransition)return!0;if(!o(i))return!0;const s=e.slides[e.slide()],l=()=>i.back??r,c="data-transition"+(l()?"-back":""),d=s.querySelector(`section[${c}]`);if(!d)return!0;const u=_e(d.getAttribute(c)??void 0);return!u||((async(e,{builtinFallback:t=!0}={})=>{let n=await Le(e);if(Se(n)){if(!t)return;return n=await Le(`__builtin__${e}`),Se(n)?void 0:n}return n})(u.name,{builtinFallback:u.builtinFallback}).then(e=>{if(!e){t(!0);try{n(i)}finally{t(!1)}return}let r=e;Me.matches&&(console.warn("Use a constant animation to transition because preferring reduced motion by viewer has detected."),r=De);const o=document.getElementById(Oe);o&&o.remove();const a=document.createElement("style");a.id=Oe,document.head.appendChild(a),((e,t)=>{const n=[`:root{${ke("direction")}:${t.backward?-1:1};}`,":root:has(.bespoke-marp-inactive){cursor:none;}"],r=t=>{const n=e[t].both?.defaultDuration||e[t].outgoing?.defaultDuration||e[t].incoming?.defaultDuration;return"forward"===t?n:n||r("forward")},o=t.duration||r(t.backward?"backward":"forward");void 0!==o&&n.push(`::view-transition-group(*){${Ee}:${o};}`);const i=e=>Object.entries(e).map(([e,t])=>`${e}:${t};`).join("");return n.push(`::view-transition-old(root){${i(Pe(e,{...t,type:"outgoing"}))}}`,`::view-transition-new(root){${i(Pe(e,{...t,type:"incoming"}))}}`),n})(r,{backward:l(),duration:u.duration}).forEach(e=>a.sheet?.insertRule(e));const s=document.documentElement.classList;s.add(Ie);let c=!1;const d=()=>{c||(n(i),c=!0,s.remove(Ie))},f=()=>{t(!1),a.remove(),s.remove(Ie)};try{t(!0);const e=document.startViewTransition(d);t(e),e.finished.finally(f)}catch(e){console.error(e),d(),f()}}),!1)};e.on("prev",r(t=>e.prev({...t,[Te]:!0}),{back:!0,cond:e=>e.index>0&&!((e.fragment??1)&&n.fragmentIndex>0)})),e.on("next",r(t=>e.next({...t,[Te]:!0}),{cond:t=>t.index+1<e.slides.length&&!(n.fragmentIndex+1<n.fragments.length)})),setTimeout(()=>{e.on("slide",r(t=>e.slide(t.index,{...t,[Te]:!0}),{cond:t=>{const n=e.slide();return t.index!==n&&(t.back=t.index<n,!0)}}))},0),e.on("fragment",e=>{n=e})};let Be;const Ke=()=>(void 0===Be&&(Be="wakeLock"in navigator&&navigator.wakeLock),Be),qe=async()=>{const e=Ke();if(e)try{return await e.request("screen")}catch(e){console.warn(e)}return null},Ve=async()=>{if(!Ke())return;let e;const t=()=>{e&&"visible"===document.visibilityState&&qe()};for(const e of["visibilitychange","fullscreenchange"])document.addEventListener(e,t);return e=await qe(),e};((e=document.getElementById(":$p"))=>{(()=>{const e=v("view");i.dataset.bespokeView=u.some(t=>t&&t===e)?e:""})();const t=(e=>{const t=v(e);return h({[e]:void 0}),t})("sync")||void 0;o.from(e,((...e)=>{const t=u.findIndex(e=>p()===e);return e.map(([e,n])=>e[t]&&n).filter(e=>e)})([[1,1,1,0],B({key:t})],[[1,1,0,1],se(e)],[[1,1,0,0],M],[[1,1,1,1],E],[[1,0,0,0],T()],[[1,1,1,1],A],[[1,1,1,1],de({history:!1})],[[1,1,0,0],C()],[[1,1,1,0],_],[[1,0,0,0],le],[[1,1,0,0],ve()],[[1,0,0,0],D()],[[1,1,1,0],F()],[[1,0,0,0],Ne],[[1,1,1,1],$],[[1,1,1,0],Ve]))})()}();</script></body></html>