1<!DOCTYPE html> 2<html lang="zh"> 3<head> 4 <meta charset="utf-8" /> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 6 <title>Yuuza</title> 7 <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css" /> 8 <link rel="stylesheet" href="/css/site.css?v=LcZ8YxuqT1qIA0WwnXVyftKW4ENLXfONF2ahtsnKoXo" /> 9
10<script> 11 let ssrBgData = {ok: true, timeSpent: 1796, data: {"img":"static/Prinz_Eugen_Azur_Lane_(2912x1638)_41b9c3.jpg.opt.jpg","img_src":"https://i.redd.it/6hzlg9e5eb1a1.jpg","original_path":"static/Prinz_Eugen_Azur_Lane_(2912x1638)_41b9c3.jpg","path":"static/Prinz_Eugen_Azur_Lane_(2912x1638)_41b9c3.jpg.opt.jpg","selected":0,"source":"https://www.reddit.com/r/Animewallpaper/comments/z10cp3/prinz_eugen_azur_lane_2912x1638/","thumb_data":"data:image/png;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wAARCAAkAEADASIAAhEBAxEB/8QAGwAAAgMBAQEAAAAAAAAAAAAAAgUAAwQGBwH/xAAtEAACAQMCBQMEAQUAAAAAAAABAgMABBEFIRITMUFRImFxFDKB0bEVI1KCwf/EABgBAAMBAQAAAAAAAAAAAAAAAAECAwQA/8QAHhEAAwEAAQUBAAAAAAAAAAAAAAECESEDEhMiMUH/2gAMAwEAAhEDEQA/AH+saamp2hjLBZk3jbwfHxXBTRzWlyUcGOWM79sGvVPpIAwBY8Xji60h1pdOuLhrIBWuVByHyMDHUHz0qlVLIdKLnhlmlXct1pEYvHMjtuXDZ2z/ADWzS35c0iy3bzAnKFzt+O/zXFXdpJBIWthJCPtJMgAGO4IO+aGNri9ntsSMpjODIxyM589+wqMp6arrJ+npTSRklGYA46Z7Uomv7aOdoIoeIAbsTsK5iG+1A6hNbMwkZQVx0/29qre8aAMUueckg4HHQ+1PTxeokdNU9vB6krW8yceVtZCPVj7M/wDK6S3SJUIiIbBwTnO9c9pGpjUrY208AlQKRJJxAHAO2BVeg6tAiXVlc3AQK3Ejd8dwfcVzvXn4Kuip1/WJLvU5L8xm7JaRBhZBtj8CjC3M6homxKm6yY9XxmlvMhJTB6+/SttnKIpSOPGBtv1pajt5QVTrhlGrO88pLrwsO3vQ2lwVypD8sDCx46+5NFfTu0gHG5LnBxR2xVoQsynBzlgdzRrRJ9UMYLhL66j+ukjjtgCrcJ9TjsGPileqcku4iYBDJwxhNhw+cVqaOC3i5ayf2wvVhkt8VjhTn8Tlft2G+TQ7W3pVUkuC4XKGNobRSq4K5JxjPXNA5WziXlMslw49TeK+LbumWHfbPtQwIzM/MCgL9uB1oeJ1yHyJcIzmBAT16jvW2O2hRxmMNjyTUqVqpLDNLehNFCplIiGVX/Jv3Q8SxxKUiQH8/upUoMVNhQn6mRVkAwfApxbabAj4UsM/H6qVKZCtvTe2iWpHGWlJxjGRj+Kzf0+3GwU4+alSuQlM/9k=","thumb_path":"static/Prinz_Eugen_Azur_Lane_(2912x1638)_41b9c3.jpg.64.jpg","title":"Prinz Eugen [Azur Lane] (2912x1638)"} 12}; 13 function loadHomeBg() { 14 let currentBg = null; 15 if (ssrBgData.ok && !ssrBgData.used) { 16 handleJson(ssrBgData.data); 17 ssrBgData.used = true; 18 } else { 19 fetch("https://yuuza.net/api/wp/random_anime_wallpaper?download&thumb_data") 20 .then(resp => resp.json()) 21 .then(json => handleJson(json), err => { 22 console.error("fetch home bg error", err); 23 setBgInfo("[ERROR FETCHING BACKGROUND]"); 24 }); 25 } 26 27 function handleJson(json) { 28 if (currentBg && currentBg.img === json.img) { 29 console.info("[HomeBG] got the same img, try again."); 30 loadHomeBg(); 31 return; 32 } 33 currentBg = json; 34 const thumbData = json.thumb_data; 35 const imgUrl = "https://yuuza.net/api/wp/" + json.img; 36 document.body.style.setProperty("--home-bg-thumb-url", `url("${thumbData}")`); 37 document.body.style.setProperty("--home-bg-url", `url(${JSON.stringify(imgUrl)})`); 38 setBgInfo(json.title, json.source, imgUrl); 39 waitImageLoaded(thumbData).then(img => { 40 console.info(getAverageColor(img)); 41 }); 42 waitImageLoaded(imgUrl).then(() => { 43 if (currentBg === json) { 44 document.querySelector('.home-bg-full').classList.add("loaded"); 45 } 46 }); 47 } 48 49 function setBgInfo(title, link, fileLink) { 50 const domTitle = document.querySelector("#home-bg-info-title"); 51 domTitle.textContent = title; 52 domTitle.href = link || ''; 53 document.querySelector(".home-bg-info").hidden = false; 54 const domFileLink = document.querySelector("#home-bg-info-file"); 55 if (domFileLink) domFileLink.href = fileLink || ""; 56 } 57 58 function waitImageLoaded(src) { 59 return new Promise(res => { 60 const img = new Image(); 61 img.onload = () => res(img); 62 img.src = src; 63 }); 64 } 65 66 function getAverageColor(img) { 67 const canvas = document.createElement('canvas');
68 canvas.height = img.height; 69 canvas.width = img.width; 70 const ctx = canvas.getContext('2d'); 71 ctx.drawImage(img, 0, 0); 72 const data = ctx.getImageData(0, 0, canvas.width, canvas.height).data; 73 let r = 0, g = 0, b = 0; 74 for (let i = 0; i < data.length; i += 4) { 75 r += data[i]; 76 g += data[i + 1]; 77 b += data[i + 2]; 78 } 79 const pixelCount = data.length / 4; 80 r = Math.floor(r / pixelCount); 81 g = Math.floor(g / pixelCount); 82 b = Math.floor(b / pixelCount); 83 return { r, g, b }; 84 } 85 } 86 function reloadHomeBg() { 87 document.querySelector(".home-bg-info").hidden = true; 88 document.querySelector('.home-bg-full').classList.remove("loaded"); 89 loadHomeBg(); 90 } 91 92 const initHomeIntro = (() => { 93 loadHomeBg(); 94 95 const sidebarInfo = document.querySelector('.sidebar-info'); 96 const sidebar = document.querySelector('.sidebar'); 97 98 const feedHref = document.getElementById('feed-blog-link').href; 99 100 let introShown = 1; 101 102 const getIntroHeight = () => window.innerHeight - 70; 103 let introHeight = getIntroHeight(); 104 105 const update = () => { 106 introHeight = getIntroHeight(); 107 introShown = (introHeight - window.scrollY) / introHeight; 108 introShown = Math.min(1, Math.max(0, introShown)); 109 110 const infoXOffset = window.innerWidth / 2 111 - (sidebar.offsetLeft + parseFloat(getComputedStyle(sidebar).paddingLeft)) 112 - parseFloat(getComputedStyle(sidebarInfo).paddingLeft); 113 114 if (introShown > 0) { 115 document.querySelector('.sidebar-sticky').scrollTop = 0; 116 } 117 document.body.classList.toggle('homeintro', introShown !== 0) 118 document.body.classList.toggle('homeintro-fully', introShown === 1) 119 document.body.classList.toggle('homeintro-mostly', introShown >= 0.9) 120 document.body.classList.toggle('homeintro-not-barely', introShown >= 0.1) 121 document.body.style.setProperty('--homeintro', introShown); 122 document.body.style.setProperty('--info-x-offset', infoXOffset + 'px'); 123 124 const isFeedNotBlog = introShown >= 0.1; 125 document.getElementById('feed-blog-link').href = isFeedNotBlog ? 'javascript:showBlog()' : feedHref; 126 document.getElementById('feed-blog-text').textContent = isFeedNotBlog ? "Blog" : "Feed"; 127 } 128 129 window.showBlog = () => animateScrollIntro(1); 130 131 //document.addEventListener('DOMContentLoaded', () => { 132 // update(); 133 //}); 134 window.addEventListener('scroll', () => { 135 update(); 136 }, {passive: false}); 137 window.addEventListener('wheel', (ev) => { 138 // ev.preventDefault(); 139 if (Math.abs(ev.deltaY) > 10) { 140 delayScrollIntro(ev.deltaY); 141 } 142 }, {passive: false}) 143 window.addEventListener('resize', () => { 144 update(); 145 delayScrollIntro(0); 146 }); 147 148 let snapDelayTimer = null; 149 let snapRaf = null; 150 151 const delayScrollIntro = (inputDeltaY) => { 152 if (snapDelayTimer != null) clearTimeout(snapDelayTimer); 153 cancelAnimate(); 154 snapDelayTimer = setTimeout(() => { 155 if (introShown === 1 || introShown === 0) return; 156 const targetThreshold = (0.5 - Math.sign(inputDeltaY) * 0.2) * introHeight; 157 const show = window.scrollY > targetThreshold; 158 animateScrollIntro(show); 159 }, 100); 160 } 161 162 function cancelAnimate() { 163 if (snapRaf != null) cancelAnimationFrame(snapRaf); 164 } 165 166 const animateScrollIntro = (showBlog) => { 167 const targetY = showBlog ? introHeight + 1 : 0; 168 let lastTime = Date.now(); 169 function animate() { 170 const time = Date.now();
171 const deltaTime = time - lastTime; 172 lastTime = time; 173 if (Math.abs(targetY - window.scrollY) < 2) { 174 window.scrollTo(0, targetY); 175 return; 176 } 177 let deltaY = (targetY - window.scrollY) * (deltaTime * 0.010); 178 deltaY = Math.max(2, Math.abs(deltaY)) * Math.sign(deltaY); 179 window.scrollTo(0, window.scrollY + deltaY); 180 snapRaf = requestAnimationFrame(animate); 181 } 182 snapRaf = requestAnimationFrame(animate); 183 } 184 185 const urlParams = new URLSearchParams(window.location.search); 186 if (urlParams.get("before") || urlParams.get("after")) { 187 window.scrollTo(0, introHeight); 188 } 189 190 const setParallaxOffset = (x, y) => { 191 //document.querySelector('.home-bg').style.transform = `translate(${x}%, ${y}%) scale(1.02)`; 192 document.body.style.setProperty('--parallax-offset-x', x); 193 document.body.style.setProperty('--parallax-offset-y', y); 194 } 195 196 document.addEventListener('mousemove', (ev) => { 197 if (introShown > 0.5) { 198 const windowX = ev.pageX - window.scrollX; 199 const windowY = ev.pageY - window.scrollY; 200 const x = 1 - (windowX / window.innerWidth * 2); 201 const y = 1 - (windowY / window.innerHeight * 2); 202 setParallaxOffset(x, y); 203 } 204 }); 205 206 sidebarInfo.classList.add('no-transition-within'); 207 update(); 208 sidebarInfo.offsetTop; 209 sidebarInfo.classList.remove('no-transition-within'); 210 delayScrollIntro(0); 211 }); 212</script>
212 213<style> 214 :root { 215 scroll-behavior: auto !important; 216 } 217 218 body { 219 overflow-x: hidden; 220 --homeintro: 1; 221 --info-x-offset: -50vw; 222 --intro-scaleup: 0.5; 223 --home-bg-url: none; 224 --home-bg-thumb-url: none; 225 --parallax-offset-x: 0; 226 --parallax-offset-y: 0; 227 } 228 229 .home-bg { 230 position: fixed; 231 left: 0; 232 top: 0; 233 right: 0; 234 bottom: 0; 235 padding: 0; 236 z-index: -1; 237 opacity: calc(.4 + (var(--homeintro) * .3)); 238 transform: translate(calc(1% * var(--parallax-offset-x)), calc(1% * var(--parallax-offset-y))) 239 scale(1.02); 240 transition: transform .3s linear; 241 } 242 243 .home-intro-box { 244 position: absolute; 245 left: 0; 246 top: 0; 247 width: 100%; 248 height: 100vh; 249 } 250 251 .inner-relative { 252 position: relative; 253 width: 100%; 254 height: 100%; 255 } 256 257 .home-bg-full, 258 .home-bg-thumb { 259 position: absolute; 260 width: 100%; 261 height: 100%; 262 background-color: transparent; 263 background: var(--home-bg-url) center/cover; 264 } 265 266 .home-bg-thumb { 267 background: var(--home-bg-thumb-url) center/cover; 268 filter: blur(1vmax); 269 } 270 271 .home-bg-full { 272 opacity: 0; 273 transition: opacity .5s; 274 } 275 276 .home-bg-full.loaded { 277 opacity: 1; 278 } 279 280 .home-bg-info { 281 position: absolute; 282 left: 10px; 283 bottom: 10px; 284 opacity: 0; 285 } 286 287 .home-bg-info a { 288 opacity: 0.5; 289 color: black; 290 } 291 292 .main-container { 293 margin-top: 100vh; 294 min-height: calc(100vh - 70px); 295 } 296 297 body>header { 298 position: fixed; 299 top: 0; 300 left: 0; 301 right: 0; 302 z-index: 1; 303 /* transform: translate(0, calc(var(--homeintro) * -100%)); */ 304 } 305 306 body>header .navbar { 307 border-bottom: none !important; 308 --bs-bg-opacity: calc(1 - var(--homeintro) * 0.5); 309 } 310 311 .homeintro .navbar { 312 backdrop-filter: blur(5px); 313 } 314 315 #goto-path { 316 background: none; 317 } 318 319 .sidebar-info { 320 transform: translate( 321 calc(var(--homeintro) * (var(--info-x-offset) - 50% + .7vw * var(--parallax-offset-x) )), 322 calc(var(--homeintro) * (-50vh - 50% - 0px + .7vh * var(--parallax-offset-y) )) 323 ) scale(calc(var(--homeintro) * var(--intro-scaleup) + 1)); 324 transition: background .3s, box-shadow .3s; 325 } 326 327 .homeintro-fully .sidebar-info { 328 transition: background .3s, box-shadow .3s, transform .3s linear; 329 } 330 331 .sidebar-info-content { 332 text-shadow: 0 0 30px rgba(255, 255, 255, var(--homeintro)); 333 transition: all .3s; 334 } 335 336 .sidebar-info h3, 337 .sidebar-links, 338 .sidebar-extra, 339 .sidebar-info .avatar { 340 transition: opacity .3s; 341 } 342 343 344 .homeintro-not-barely .sidebar-info h3 { 345 opacity: 0; 346 } 347 348 .homeintro-not-barely .sidebar-info { 349 background: none; 350 box-shadow: none; 351 } 352 353 .homeintro-not-barely .sidebar-info .avatar { 354 opacity: 0; 355 } 356 357 .homeintro-not-barely .sidebar-links, 358 .homeintro-not-barely .sidebar-extra { 359 opacity: 0; 360 } 361 362 .home-bg-info { 363 transition: opacity .1s; 364 left: 0; 365 bottom: 0; 366 padding: 8px; 367 border-radius: 0 16px 0 0; 368 background-color: rgba(var(--bs-white-rgb), 0.5) !important; 369 backdrop-filter: blur(5px); 370 } 371 372 .homeintro-fully .home-bg-info { 373 opacity: 1; 374 } 375 376 .homeintro .sidebar-sticky { 377 overflow: visible; 378 } 379 380 .no-transition-within, 381 .no-transition-within * { 382 transition: none !important; 383 } 384 385 386 @media (min-width: 768px) { 387 388 .sidebar-sticky { 389 position: sticky; 390 top: 60px; 391 max-height: calc(100vh - 60px); 392 overflow-y: auto; 393 padding: 10px 16px; 394 margin: -10px -16px 0; 395 scrollbar-width: none; 396 } 397 398 .sidebar-sticky::-webkit-scrollbar { 399 display: none; 400 } 401 402 403 404 .homeintro-not-barely .sidebar-info:hover { 405 background: rgba(255, 255, 255, .7); 406 } 407 408 .homeintro .sidebar-info-avatar { 409 pointer-events: none; 410 } 411 412 .homeintro-not-barely .sidebar-info-content { 413 margin-top: -110px; 414 } 415 } 416 417 .sidebar-block { 418 position: relative; 419 } 420 421 .sidebar-block p { 422 margin: 10px 0; 423 } 424 425 .sidebar-block h3 { 426 position: absolute; 427 right: .5rem; 428 top: .5rem; 429 opacity: .3; 430 font-size: 120%; 431 line-height: 1; 432 margin: 0; 433 pointer-events: none; 434 } 435 436 .avatar { 437 display: block; 438 margin: 10px auto; 439 width: 100px; 440 height: 100px; 441 border-radius: 50%; 442 } 443 444 .sidebar-info .name { 445 font-size: 20px; 446 font-weight: 600; 447 margin-bottom: 10px; 448 text-align: center; 449 } 450 451 .sidebar-info .links { 452 font-size: 18px; 453 text-align: center; 454 margin: 10px 0; 455 } 456 457 .sidebar-info .links > a { 458 color: black; 459 margin: 0 10px; 460 display: inline-block; 461 line-height: 1.2; 462 } 463 464 .friend-note { 465 font-size: 80%; 466 opacity: .5; 467 } 468 469 .friend-note::before { 470 content: " - "; 471 } 472 473 .read-more { 474 text-align: right; 475 } 476 477 @media (max-width: 767px) { 478 body { 479 --intro-scaleup: 0; 480 } 481 482 .homeintro .sidebar-links { 483 opacity: 1;
484 } 485 486 .homeintro-not-barely .sidebar-info-avatar { 487 display: none; 488 } 489 490 .sidebar-links p { 491 display: inline-block; 492 margin: 5px 10px 5px 0; 493 } 494 495 .sidebar-links h3 { 496 display: block; 497 float: right; 498 position: static; 499 } 500 501 .sidebar-info { 502 display: flex; 503 justify-content: space-evenly; 504 align-items: center; 505 } 506 507 .sidebar-cert { 508 display: none; 509 } 510 } 511</style> 512 513 514 <!-- Global site tag (gtag.js) - Google Analytics -->
vendor: 69 bytes, lines 514-515
514 515 <script async src="https://www.googletagmanager.com/gtag/js?id=
515G-WZ1PLLGEH9
vendor: 17 bytes, lines 515-516
515"></script> 516
516<script> 517
vendor: 156 bytes, lines 517-521
517window.dataLayer = window.dataLayer || []; 518 function gtag(){dataLayer.push(arguments);} 519 gtag('js', new Date()); 520 521 gtag('config', '
521G-WZ1PLLGEH9
vendor: 9 bytes, lines 521-522
521'); 522
522</script>
522 523
523<script src="/js/vendor.js?v=NyePYMraPLoqR6YHyQH1lOLc-2ha_mb01n-JTA1GVhE"></script>
523 524</head> 525<body class="bggray"> 526 <header> 527 <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3"> 528 <div class="container-xl"> 529 <a class="navbar-brand" href="/">Yuuza</a> 530 <button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent" 531 aria-expanded="false" aria-label="Toggle navigation"> 532 <span class="navbar-toggler-icon"></span> 533 </button> 534 <div class="collapse navbar-collapse"> 535 <ul class="navbar-nav flex-grow-1"> 536 <li class="nav-item"> 537 <a class="nav-link text-dark" href="/">Home</a> 538 </li> 539 <li class="nav-item"> 540 <a class="nav-link text-dark" href="/Posts">Posts</a> 541 </li> 542 <li class="nav-item"> 543 <a class="nav-link text-dark" href="/about">About</a> 544 </li> 545 </ul> 546 <ul class="navbar-nav ml-auto"> 547 <li class="nav-item"> 548 <a class="nav-link text-dark" href="/Admin/Login?ReturnUrl=/"> 549 Login 550 </a> 551 </li> 552 </ul> 553 <form class="navbar-nav form-inline d-sm-inline-flex mx-md-2" id="goto-form"> 554 <input class="form-control mr-sm-2" type="search" placeholder="Secret" id="goto-path" aria-label="Search"> 555 </form> 556 </div> 557 </div> 558 </nav> 559 </header> 560 561 <main role="main" class="main-container container-xl pb-3"> 562 563 564<div class="row"> 565 <div class="home-post-preview col-12 col-md-9 order-1"> 566 <article class="post-preview mycard"> 567 <header> 568 <h1 class="title"><a href="/Posts/less-chromium-better-world">如果您在使用触摸板/手机</a></h1> 569 </header> 570 <section class="content"><!-- md --> 571<p>é£ä¹é¦é¡µç intro <-> blog è¿æ¸¡å¨ç»å¤§æ¦æ¯åæçã</p> 572<p>é¢è®¡ä¿®å¤æ¶é´ï¼ä¸æ¬¡ä¸å®</p> 573</section> 574 <div class="post-preview-footer"> 575 <div class="date-tags"> 576 <time class="date">2024-03-31</time> 577 <span class="tags"> 578 <a href="/Posts?tag=Notice"><span class="tag">Notice</span></a> 579 <a href="/Posts?tag=no-chromium"><span class="tag">no-chromium</span></a> 580 </span> 581 </div> 582 </div> 583 </article> 584 <article class="post-preview mycard"> 585 <header> 586 <h1 class="title"><a href="/Posts/missing-http-request-headers-in-deno-compat-mode">Deno 的 Node 兼容踩坑</a></h1> 587 </header> 588 <section class="content"><!-- md --> 589<blockquote> 590<p>TL;DR: Node å ¼å®¹å±ç <code>http.request()</code> æ¾ç»ä¸æ¯æ <code>headers</code>ï¼è¢«ææ°´äºä¸ª PR</p> 591</blockquote> 592<h2 id="import-from-npm">è¯ç¨ import from <code>npm:</code></h2> 593<p>ç¨ Deno åé£ä¹¦æºå¨äººçæ¶åï¼éæè¯äºä¸ä¸éè¿ <code>npm:</code> è°ç¨é£ä¹¦ç Node.js SDKã</p> 594<p>çä¸å»ççè½ç¨ï¼</p> 595<p><img src="https://md.yuuza.net/uploads/5d837f1c-2160-43b9-8d26-1fa5f6afb05b.png" alt="" /></p> 596<p>ï¼ç´å¼å¥½ç¨ï¼è¿ TypeScript ç±»åå®ä¹é½æäº~ï¼</p> 597</section> 598 <div class="post-preview-footer"> 599 <div class="date-tags"> 600 <time class="date">2022-11-17</time>
601 <span class="tags"> 602 <a href="/Posts?tag=Deno"><span class="tag">Deno</span></a> 603 <a href="/Posts?tag=lark"><span class="tag">lark</span></a> 604 <a href="/Posts?tag=feishu"><span class="tag">feishu</span></a> 605 <a href="/Posts?tag=bot"><span class="tag">bot</span></a> 606 <a href="/Posts?tag=Node.js"><span class="tag">Node.js</span></a> 607 </span> 608 </div> 609 <a class="read-more" href="/Posts/missing-http-request-headers-in-deno-compat-mode">Full post ></a> 610 </div> 611 </article> 612 <article class="post-preview mycard"> 613 <header> 614 <h1 class="title"><a href="/Posts/lark-bot-msg-from-shell">从 shell 发送飞书(Lark)机器人消息</a></h1> 615 </header> 616 <section class="content"><style> 617.gist{/*! 618 * GitHub Light v0.4.1 619 * Copyright (c) 2012 - 2017 GitHub, Inc. 620 * Licensed under MIT (https://github.com/primer/github-syntax-theme-generator/blob/master/LICENSE) 621 */font-size:16px;color:#333;text-align:left;direction:ltr}.gist{--color-canvas-default-transparent: rgba(255,255,255,0);--color-page-header-bg: #f6f8fa;--color-marketing-icon-primary: #218bff;--color-marketing-icon-secondary: #54aeff;--color-diff-blob-addition-num-text: #24292f;--color-diff-blob-addition-fg: #24292f;--color-diff-blob-addition-num-bg: #ccffd8;--color-diff-blob-addition-line-bg: #e6ffec;--color-diff-blob-addition-word-bg: #abf2bc;--color-diff-blob-deletion-num-text: #24292f;--color-diff-blob-deletion-fg: #24292f;--color-diff-blob-deletion-num-bg: #ffd7d5;--color-diff-blob-deletion-line-bg: #ffebe9;--color-diff-blob-deletion-word-bg: rgba(255,129,130,0.4);--color-diff-blob-hunk-num-bg: rgba(84,174,255,0.4);--color-diff-blob-expander-icon: #57606a;--color-diff-blob-selected-line-highlight-mix-blend-mode: multiply;--color-diffstat-deletion-border: rgba(27,31,36,0.15);--color-diffstat-addition-border: rgba(27,31,36,0.15);--color-diffstat-addition-bg: #2da44e;--color-search-keyword-hl: #fff8c5;--color-prettylights-syntax-comment: #6e7781;--color-prettylights-syntax-constant: #0550ae;--color-prettylights-syntax-entity: #8250df;--color-prettylights-syntax-storage-modifier-import: #24292f;--color-prettylights-syntax-entity-tag: #116329;--color-prettylights-syntax-keyword: #cf222e;--color-prettylights-syntax-string: #0a3069;--color-prettylights-syntax-variable: #953800;--color-prettylights-syntax-brackethighlighter-unmatched: #82071e;--color-prettylights-syntax-invalid-illegal-text: #f6f8fa;--color-prettylights-syntax-invalid-illegal-bg: #82071e;--color-prettylights-syntax-carriage-return-text: #f6f8fa;--color-prettylights-syntax-carriage-return-bg: #cf222e;--color-prettylights-syntax-string-regexp: #116329;--color-prettylights-syntax-markup-list: #3b2300;--color-prettylights-syntax-markup-heading: #0550ae;--color-prettylights-syntax-markup-italic: #24292f;--color-prettylights-syntax-markup-bold: #24292f;--color-prettylights-syntax-markup-deleted-text: #82071e;--color-prettylights-syntax-markup-deleted-bg: #ffebe9;--color-prettylights-syntax-markup-inserted-text: #116329;--color-prettylights-syntax-markup-inserted-bg: #dafbe1;--color-prettylights-syntax-markup-changed-text: #953800;--color-prettylights-syntax-markup-changed-bg: #ffd8b5;--color-prettylights-syntax-markup-ignored-text: #eaeef2;--color-prettylights-syntax-markup-ignored-bg: #0550ae;--color-prettylights-syntax-meta-diff-range: #8250df;--color-prettylights-syntax-brackethighlighter-angle: #57606a;--color-prettylights-syntax-sublimelinter-gutter-mark: #8c959f;--color-prettylights-syntax-constant-other-reference-link: #0a3069;--color-codemirror-text: #24292f;--color-codemirror-bg: #ffffff;--color-codemirror-gutters-bg: #ffffff;--color-codemirror-guttermarker-text: #ffffff;--color-codemirror-guttermarker-subtle-text: #6e7781;--color-codemirror-linenumber-text: #57606a;--color-codemirror-cursor: #24292f;--color-codemirror-selection-bg: rgba(84,174,255,0.4);--color-codemirror-activeline-bg: rgba(234,238,242,0.5);--color-codemirror-matchingbracket-text: #24292f;--color-codemirror-lines-bg: #ffffff;--color-codemirror-syntax-comment: #24292f;--color-codemirror-syntax-constant: #0550ae;--color-codemirror-syntax-entity: #8250df;--color-codemirror-syntax-keyword: #cf222e;--color-codemirror-syntax-storage: #cf222e;--color-codemirror-syntax-string: #0a3069;--color-codemirror-syntax-support: #0550ae;--color-codemirror-syntax-variable: #953800;--color-checks-bg: #24292f;--color-checks-run-border-width: 0px;--color-checks-container-border-width: 0px;--color-checks-text-primary: #f6f8fa;--color-checks-text-secondary: #8c959f;--color-checks-text-link: #54aeff;--color-checks-btn-icon: #afb8c1;--color-checks-btn-hover-icon: #f6f8fa;--color-checks-btn-hover-bg: rgba(255,255,255,0.125);--color-checks-input-text: #eaeef2;--color-checks-input-placeholder-text: #8c959f;--color-checks-input-focus-text: #8c959f;--color-checks-input-bg: #32383f;--color-checks-input-shadow: none;--color-checks-donut-error: #fa4549;--color-checks-donut-pending: #bf8700;--color-checks-donut-success: #2da44e;--color-checks-donut-neutral: #afb8c1;--color-checks-dropdown-text: #afb8c1;--color-checks-dropdown-bg: #32383f;--color-checks-dropdown-border: #424a53;--color-checks-dropdown-shadow: rgba(27,31,36,0.3);--color-checks-dropdown-hover-text: #f6f8fa;--color-checks-dropdown-hover-bg: #424a53;--color-checks-dropdown-btn-hover-text: #f6f8fa;--color-checks-dropdown-btn-hover-bg: #32383f;--color-checks-scrollbar-thumb-bg: #57606a;--color-checks-header-label-text: #d0d7de;--color-checks-header-label-open-text: #f6f8fa;--color-checks-header-border: #32383f;--color-checks-header-icon: #8c959f;--color-checks-line-text: #d0d7de;--color-checks-line-num-text: rgba(140,149,159,0.75);--color-checks-line-timestamp-text: #8c959f;--color-checks-line-hover-bg: #32383f;--color-checks-line-selected-bg: rgba(33,139,255,0.15);--color-checks-line-selected-num-text: #54aeff;--color-checks-line-dt-fm-text: #24292f;--color-checks-line-dt-fm-bg: #9a6700;--color-checks-gate-bg: rgba(125,78,0,0.15);--color-checks-gate-text: #d0d7de;--color-checks-gate-waiting-text: #d4a72c;--color-checks-step-header-open-bg: #32383f;--color-checks-step-error-text: #ff8182;--color-checks-step-warning-text: #d4a72c;--color-checks-logline-text: #8c959f;--color-checks-logline-num-text: rgba(140,149,159,0.75);--color-checks-logline-debug-text: #c297ff;--color-checks-logline-error-text: #d0d7de;--color-checks-logline-error-num-text: #ff8182;--color-checks-logline-error-bg: rgba(164,14,38,0.15);--color-checks-logline-warning-text: #d0d7de;--color-checks-logline-warning-num-text: #d4a72c;--color-checks-logline-warning-bg: rgba(125,78,0,0.15);--color-checks-logline-command-text: #54aeff;--color-checks-logline-section-text: #4ac26b;--color-checks-ansi-black: #24292f;--color-checks-ansi-black-bright: #32383f;--color-checks-ansi-white: #d0d7de;--color-checks-ansi-white-bright: #d0d7de;--color-checks-ansi-gray: #8c959f;--color-checks-ansi-red: #ff8182;--color-checks-ansi-red-bright: #ffaba8;--color-checks-ansi-green: #4ac26b;--color-checks-ansi-green-bright: #6fdd8b;--color-checks-ansi-yellow: #d4a72c;--color-checks-ansi-yellow-bright: #eac54f;--color-checks-ansi-blue: #54aeff;--color-checks-ansi-blue-bright: #80ccff;--color-checks-ansi-magenta: #c297ff;--color-checks-ansi-magenta-bright: #d8b9ff;--color-checks-ansi-cyan: #76e3ea;--color-checks-ansi-cyan-bright: #b3f0ff;--color-project-header-bg: #24292f;--color-project-sidebar-bg: #ffffff;--color-project-gradient-in: #ffffff;--color-project-gradient-out: rgba(255,255,255,0);--color-mktg-btn-bg: #1b1f23;--color-mktg-btn-shadow-outline: rgb(0 0 0 / 15%) 0 0 0 1px inset;--color-mktg-btn-shadow-focus: rgb(0 0 0 / 15%) 0 0 0 4px;--color-mktg-btn-shadow-hover: 0 3px 2px rgba(0, 0, 0, 0.07), 0 7px 5px rgba(0, 0, 0, 0.04), 0 12px 10px rgba(0, 0, 0, 0.03), 0 22px 18px rgba(0, 0, 0, 0.03), 0 42px 33px rgba(0, 0, 0, 0.02), 0 100px 80px rgba(0, 0, 0, 0.02);--color-mktg-btn-shadow-hover-muted: rgb(0 0 0 / 70%) 0 0 0 2px inset;--color-avatar-bg: #ffffff;--color-avatar-border: rgba(27,31,36,0.15);--color-avatar-stack-fade: #afb8c1;--color-avatar-stack-fade-more: #d0d7de;--color-avatar-child-shadow: -2px -2px 0 rgba(255,255,255,0.8);--color-topic-tag-border: rgba(0,0,0,0);--color-counter-border: rgba(0,0,0,0);--color-select-menu-backdrop-border: rgba(0,0,0,0);--color-select-menu-tap-highlight: rgba(175,184,193,0.5);--color-select-menu-tap-focus-bg: #b6e3ff;--color-overlay-shadow: 0 1px 3px rgba(27,31,36,0.12), 0 8px 24px rgba(66,74,83,0.12);--color-header-text: rgba(255,255,255,0.7);--color-header-bg: #24292f;--color-header-divider: #57606a;--color-header-logo: #ffffff;--color-header-search-bg: #24292f;--color-header-search-border: #57606a;--color-sidenav-selected-bg: #ffffff;--color-menu-bg-active: rgba(0,0,0,0);--color-input-disabled-bg: rgba(175,184,193,0.2);--color-timeline-badge-bg: #eaeef2;--color-ansi-black: #24292f;--color-ansi-black-bright: #57606a;--color-ansi-white: #6e7781;--color-ansi-white-bright: #8c959f;--color-ansi-gray: #6e7781;--color-ansi-red: #cf222e;--color-ansi-red-bright: #a40e26;--color-ansi-green: #116329;--color-ansi-green-bright: #1a7f37;--color-ansi-yellow: #4d2d00;--color-ansi-yellow-bright: #633c01;--color-ansi-blue: #0969da;--color-ansi-blue-bright: #218bff;--color-ansi-magenta: #8250df;--color-ansi-magenta-bright: #a475f9;--color-ansi-cyan: #1b7c83;--color-ansi-cyan-bright: #3192aa;--color-btn-text: #24292f;--color-btn-bg: #f6f8fa;--color-btn-border: rgba(27,31,36,0.15);--color-btn-shadow: 0 1px 0 rgba(27,31,36,0.04);--color-btn-inset-shadow: inset 0 1px 0 rgba(255,255,255,0.25);--color-btn-hover-bg: #f3f4f6;--color-btn-hover-border: rgba(27,31,36,0.15);--color-btn-active-bg: hsla(220,14%,93%,1);--color-btn-active-border: rgba(27,31,36,0.15);--color-btn-selected-bg: hsla(220,14%,94%,1);--color-btn-focus-bg: #f6f8fa;--color-btn-focus-border: rgba(27,31,36,0.15);--color-btn-focus-shadow: 0 0 0 3px rgba(9,105,218,0.3);--color-btn-shadow-active: inset 0 0.15em 0.3em rgba(27,31,36,0.15);--color-btn-shadow-input-focus: 0 0 0 0.2em rgba(9,105,218,0.3);--color-btn-counter-bg: rgba(27,31,36,0.08);--color-btn-primary-text: #ffffff;--color-btn-primary-bg: #2da44e;--color-btn-primary-border: rgba(27,31,36,0.15);--color-btn-primary-shadow: 0 1px 0 rgba(27,31,36,0.1);--color-btn-primary-inset-shadow: inset 0 1px 0 rgba(255,255,255,0.03);--color-btn-primary-hover-bg: #2c974b;--color-btn-primary-hover-border: rgba(27,31,36,0.15);--color-btn-primary-selected-bg: hsla(137,55%,36%,1);--color-btn-primary-selected-shadow: inset 0 1px 0 rgba(0,45,17,0.2);--color-btn-primary-disabled-text: rgba(255,255,255,0.8);--color-btn-primary-disabled-bg: #94d3a2;--color-btn-primary-disabled-border: rgba(27,31,36,0.15);--color-btn-primary-focus-bg: #2da44e;--color-btn-primary-focus-border: rgba(27,31,36,0.15);--color-btn-primary-focus-shadow: 0 0 0 3px rgba(45,164,78,0.4);--color-btn-primary-icon: rgba(255,255,255,0.8);--color-btn-primary-counter-bg: rgba(255,255,255,0.2);--color-btn-outline-text: #0969da;--color-btn-outline-hover-text: #ffffff;--color-btn-outline-hover-bg: #0969da;--color-btn-outline-hover-border: rgba(27,31,36,0.15);--color-btn-outline-hover-shadow: 0 1px 0 rgba(27,31,36,0.1);--color-btn-outline-hover-inset-shadow: inset 0 1px 0 rgba(255,255,255,0.03);--color-btn-outline-hover-counter-bg: rgba(255,255,255,0.2);--color-btn-outline-selected-text: #ffffff;--color-btn-outline-selected-bg: hsla(212,92%,42%,1);--color-btn-outline-selected-border: rgba(27,31,36,0.15);--color-btn-outline-selected-shadow: inset 0 1px 0 rgba(0,33,85,0.2);--color-btn-outline-disabled-text: rgba(9,105,218,0.5);--color-btn-outline-disabled-bg: #f6f8fa;--color-btn-outline-disabled-counter-bg: rgba(9,105,218,0.05);--color-btn-outline-focus-border: rgba(27,31,36,0.15);--color-btn-outline-focus-shadow: 0 0 0 3px rgba(5,80,174,0.4);--color-btn-outline-counter-bg: rgba(9,105,218,0.1);--color-btn-danger-text: #cf222e;--color-btn-danger-hover-text: #ffffff;--color-btn-danger-hover-bg: #a40e26;--color-btn-danger-hover-border: rgba(27,31,36,0.15);--color-btn-danger-hover-shadow: 0 1px 0 rgba(27,31,36,0.1);--color-btn-danger-hover-inset-shadow: inset 0 1px 0 rgba(255,255,255,0.03);--color-btn-danger-hover-counter-bg: rgba(255,255,255,0.2);--color-btn-danger-selected-text: #ffffff;--color-btn-danger-selected-bg: hsla(356,72%,44%,1);--color-btn-danger-selected-border: rgba(27,31,36,0.15);--color-btn-danger-selected-shadow: inset 0 1px 0 rgba(76,0,20,0.2);--color-btn-danger-disabled-text: rgba(207,34,46,0.5);--color-btn-danger-disabled-bg: #f6f8fa;--color-btn-danger-disabled-counter-bg: rgba(207,34,46,0.05);--color-btn-danger-focus-border: rgba(27,31,36,0.15);--color-btn-danger-focus-shadow: 0 0 0 3px rgba(164,14,38,0.4);--color-btn-danger-counter-bg: rgba(207,34,46,0.1);--color-btn-danger-icon: #cf222e;--color-btn-danger-hover-icon: #ffffff;--color-underlinenav-icon: #6e7781;--color-underlinenav-border-hover: rgba(175,184,193,0.2);--color-action-list-item-inline-divider: rgba(208,215,222,0.48);--color-action-list-item-default-hover-bg: rgba(208,215,222,0.32);--color-action-list-item-default-hover-border: rgba(0,0,0,0);--color-action-list-item-default-active-bg: rgba(208,215,222,0.48);--color-action-list-item-default-active-border: rgba(0,0,0,0);--color-action-list-item-default-selected-bg: rgba(208,215,222,0.24);--color-action-list-item-danger-hover-bg: rgba(255,235,233,0.64);--color-action-list-item-danger-active-bg: #ffebe9;--color-action-list-item-danger-hover-text: #cf222e;--color-switch-track-bg: #eaeef2;--color-switch-track-border: #afb8c1;--color-switch-track-checked-bg: #ddf4ff;--color-switch-track-checked-hover-bg: #b6e3ff;--color-switch-track-checked-active-bg: #80ccff;--color-switch-track-checked-border: #54aeff;--color-switch-knob-checked-bg: #0969da;--color-switch-knob-checked-disabled-bg: #6e7781;--color-segmented-control-bg: #eaeef2;--color-segmented-control-button-hover-bg: rgba(175,184,193,0.2);--color-segmented-control-button-active-bg: rgba(175,184,193,0.4);--color-segmented-control-button-selected-border: #6e7781;--color-tree-view-item-chevron-hover-bg: rgba(208,215,222,0.32);--color-tree-view-item-directory-fill: #54aeff;--color-fg-default: #24292f;--color-fg-muted: #57606a;--color-fg-subtle: #6e7781;--color-fg-on-emphasis: #ffffff;--color-canvas-default: #ffffff;--color-canvas-overlay: #ffffff;--color-canvas-inset: #f6f8fa;--color-canvas-subtle: #f6f8fa;--color-border-default: #d0d7de;--color-border-muted: hsla(210,18%,87%,1);--color-border-subtle: rgba(27,31,36,0.15);--color-shadow-small: 0 1px 0 rgba(27,31,36,0.04);--color-shadow-medium: 0 3px 6px rgba(140,149,159,0.15);--color-shadow-large: 0 8px 24px rgba(140,149,159,0.2);--color-shadow-extra-large: 0 12px 28px rgba(140,149,159,0.3);--color-neutral-emphasis-plus: #24292f;--color-neutral-emphasis: #6e7781;--color-neutral-muted: rgba(175,184,193,0.2);--color-neutral-subtle: rgba(234,238,242,0.5);--color-accent-fg: #0969da;--color-accent-emphasis: #0969da;--color-accent-muted: rgba(84,174,255,0.4);--color-accent-subtle: #ddf4ff;--color-success-fg: #1a7f37;--color-success-emphasis: #2da44e;--color-success-muted: rgba(74,194,107,0.4);--color-success-subtle: #dafbe1;--color-attention-fg: #9a6700;--color-attention-emphasis: #bf8700;--color-attention-muted: rgba(212,167,44,0.4);--color-attention-subtle: #fff8c5;--color-severe-fg: #bc4c00;--color-severe-emphasis: #bc4c00;--color-severe-muted: rgba(251,143,68,0.4);--color-severe-subtle: #fff1e5;--color-danger-fg: #cf222e;--color-danger-emphasis: #cf222e;--color-danger-muted: rgba(255,129,130,0.4);--color-danger-subtle: #ffebe9;--color-open-fg: #1a7f37;--color-open-emphasis: #2da44e;--color-open-muted: rgba(74,194,107,0.4);--color-open-subtle: #dafbe1;--color-closed-fg: #cf222e;--color-closed-emphasis: #cf222e;--color-closed-muted: rgba(255,129,130,0.4);--color-closed-subtle: #ffebe9;--color-done-fg: #8250df;--color-done-emphasis: #8250df;--color-done-muted: rgba(194,151,255,0.4);
621--color-done-subtle: #fbefff;--color-sponsors-fg: #bf3989;--color-sponsors-emphasis: #bf3989;--color-sponsors-muted: rgba(255,128,200,0.4);--color-sponsors-subtle: #ffeff7;--color-primer-fg-disabled: #8c959f;--color-primer-canvas-backdrop: rgba(27,31,36,0.5);--color-primer-canvas-sticky: rgba(255,255,255,0.95);--color-primer-border-active: #fd8c73;--color-primer-border-contrast: rgba(27,31,36,0.1);--color-primer-shadow-highlight: inset 0 1px 0 rgba(255,255,255,0.25);--color-primer-shadow-inset: inset 0 1px 0 rgba(208,215,222,0.2);--color-primer-shadow-focus: 0 0 0 3px rgba(9,105,218,0.3);--color-scale-black: #1b1f24;--color-scale-white: #ffffff;--color-scale-gray-0: #f6f8fa;--color-scale-gray-1: #eaeef2;--color-scale-gray-2: #d0d7de;--color-scale-gray-3: #afb8c1;--color-scale-gray-4: #8c959f;--color-scale-gray-5: #6e7781;--color-scale-gray-6: #57606a;--color-scale-gray-7: #424a53;--color-scale-gray-8: #32383f;--color-scale-gray-9: #24292f;--color-scale-blue-0: #ddf4ff;--color-scale-blue-1: #b6e3ff;--color-scale-blue-2: #80ccff;--color-scale-blue-3: #54aeff;--color-scale-blue-4: #218bff;--color-scale-blue-5: #0969da;--color-scale-blue-6: #0550ae;--color-scale-blue-7: #033d8b;--color-scale-blue-8: #0a3069;--color-scale-blue-9: #002155;--color-scale-green-0: #dafbe1;--color-scale-green-1: #aceebb;--color-scale-green-2: #6fdd8b;--color-scale-green-3: #4ac26b;--color-scale-green-4: #2da44e;--color-scale-green-5: #1a7f37;--color-scale-green-6: #116329;--color-scale-green-7: #044f1e;--color-scale-green-8: #003d16;--color-scale-green-9: #002d11;--color-scale-yellow-0: #fff8c5;--color-scale-yellow-1: #fae17d;--color-scale-yellow-2: #eac54f;--color-scale-yellow-3: #d4a72c;--color-scale-yellow-4: #bf8700;--color-scale-yellow-5: #9a6700;--color-scale-yellow-6: #7d4e00;--color-scale-yellow-7: #633c01;--color-scale-yellow-8: #4d2d00;--color-scale-yellow-9: #3b2300;--color-scale-orange-0: #fff1e5;--color-scale-orange-1: #ffd8b5;--color-scale-orange-2: #ffb77c;--color-scale-orange-3: #fb8f44;--color-scale-orange-4: #e16f24;--color-scale-orange-5: #bc4c00;--color-scale-orange-6: #953800;--color-scale-orange-7: #762c00;--color-scale-orange-8: #5c2200;--color-scale-orange-9: #471700;--color-scale-red-0: #ffebe9;--color-scale-red-1: #ffcecb;--color-scale-red-2: #ffaba8;--color-scale-red-3: #ff8182;--color-scale-red-4: #fa4549;--color-scale-red-5: #cf222e;--color-scale-red-6: #a40e26;--color-scale-red-7: #82071e;--color-scale-red-8: #660018;--color-scale-red-9: #4c0014;--color-scale-purple-0: #fbefff;--color-scale-purple-1: #ecd8ff;--color-scale-purple-2: #d8b9ff;--color-scale-purple-3: #c297ff;--color-scale-purple-4: #a475f9;--color-scale-purple-5: #8250df;--color-scale-purple-6: #6639ba;--color-scale-purple-7: #512a97;--color-scale-purple-8: #3e1f79;--color-scale-purple-9: #2e1461;--color-scale-pink-0: #ffeff7;--color-scale-pink-1: #ffd3eb;--color-scale-pink-2: #ffadda;--color-scale-pink-3: #ff80c8;--color-scale-pink-4: #e85aad;--color-scale-pink-5: #bf3989;--color-scale-pink-6: #99286e;--color-scale-pink-7: #772057;--color-scale-pink-8: #611347;--color-scale-pink-9: #4d0336;--color-scale-coral-0: #fff0eb;--color-scale-coral-1: #ffd6cc;--color-scale-coral-2: #ffb4a1;--color-scale-coral-3: #fd8c73;--color-scale-coral-4: #ec6547;--color-scale-coral-5: #c4432b;--color-scale-coral-6: #9e2f1c;--color-scale-coral-7: #801f0f;--color-scale-coral-8: #691105;--color-scale-coral-9: #510901}.gist .markdown-body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:16px;line-height:1.5;word-wrap:break-word}.gist .markdown-body::before{display:table;content:""}.gist .markdown-body::after{display:table;clear:both;content:""}.gist .markdown-body>*:first-child{margin-top:0 !important}.gist .markdown-body>*:last-child{margin-bottom:0 !important}.gist .markdown-body a:not([href]){color:inherit;text-decoration:none}.gist .markdown-body .absent{color:var(--color-danger-fg)}.gist .markdown-body .anchor{float:left;padding-right:4px;margin-left:-20px;line-height:1}.gist .markdown-body .anchor:focus{outline:none}.gist .markdown-body p,.gist .markdown-body blockquote,.gist .markdown-body ul,.gist .markdown-body ol,.gist .markdown-body dl,.gist .markdown-body table,.g
621ist .markdown-body pre,.gist .markdown-body details{margin-top:0;margin-bottom:16px}.gist .markdown-body hr{height:.25em;padding:0;margin:24px 0;background-color:var(--color-border-default);border:0}.gist .markdown-body blockquote{padding:0 1em;color:var(--color-fg-muted);border-left:.25em solid var(--color-border-default)}.gist .markdown-body blockquote>:first-child{margin-top:0}.gist .markdown-body blockquote>:last-child{margin-bottom:0}.gist .markdown-body h1,.gist .markdown-body h2,.gist .markdown-body h3,.gist .markdown-body h4,.gist .markdown-body h5,.gist .markdown-body h6{margin-top:24px;margin-bottom:16px;font-weight:600;line-height:1.25}.gist .markdown-body h1 .octicon-link,.gist .markdown-body h2 .octicon-link,.gist .markdown-body h3 .octicon-link,.gist .markdown-body h4 .octicon-link,.gist .markdown-body h5 .octicon-link,.gist .markdown-body h6 .octicon-link{color:var(--color-fg-default);vertical-align:middle;visibility:hidden}.gist .markdown-body h1:hover .anchor,.gist .markdown-body h2:hover .anchor,.gist .markdown-body h3:hover .anchor,.gist .markdown-body h4:hover .anchor,.gist .markdown-body h5:hover .anchor,.gist .markdown-body h6:hover .anchor{text-decoration:none}.gist .markdown-body h1:hover .anchor .octicon-link,.gist .markdown-body h2:hover .anchor .octicon-link,.gist .markdown-body h3:hover .anchor .octicon-link,.gist .markdown-body h4:hover .anchor .octicon-link,.gist .markdown-body h5:hover .anchor .octicon-link,.gist .markdown-body h6:hover .anchor .octicon-link{visibility:visible}.gist .markdown-body h1 tt,.gist .markdown-body h1 code,.gist .markdown-body h2 tt,.gist .markdown-body h2 code,.gist .markdown-body h3 tt,.gist .markdown-body h3 code,.gist .markdown-body h4 tt,.gist .markdown-body h4 code,.gist .markdown-body h5 tt,.gist .markdown-body h5 code,.gist .markdown-body h6 tt,.gist .markdown-body h6 code{padding:0 .2em;font-size:inherit}.gist .markdown-body h1{padding-bottom:.3em;font-size:2em;border-bottom:1px solid var(--color-border-muted)}.gist .markdown-body h2{padding-bottom:.3em;font-size:1.5em;border-bottom:1px solid var(--color-border-muted)}.gist .markdown-body h3{font-size:1.25em}.gist .markdown-body h4{font-size:1em}.gist .markdown-body h5{font-size:.875em}.gist .markdown-body h6{font-size:.85em;color:var(--color-fg-muted)}.gist .markdown-body summary h1,.gist .markdown-body summary h2,.gist .markdown-body summary h3,.gist .markdown-body summary h4,.gist .markdown-body summary h
6215,.gist .markdown-body summary h6{display:inline-block}.gist .markdown-body summary h1 .anchor,.gist .markdown-body summary h2 .anchor,.gist .markdown-body summary h3 .anchor,.gist .markdown-body summary h4 .anchor,.gist .markdown-body summary h5 .anchor,.gist .markdown-body summary h6 .anchor{margin-left:-40px}.gist .markdown-body summary h1,.gist .markdown-body summary h2{padding-bottom:0;border-bottom:0}.gist .markdown-body ul,.gist .markdown-body ol{padding-left:2em}.gist .markdown-body ul.no-list,.gist .markdown-body ol.no-list{padding:0;list-style-type:none}.gist .markdown-body ol[type="1"]{list-style-type:decimal}.gist .markdown-body ol[type=a]{list-style-type:lower-alpha}.gist .markdown-body ol[type=i]{list-style-type:lower-roman}.gist .markdown-body div>ol:not([type]){list-style-type:decimal}.gist .markdown-body ul ul,.gist .markdown-body ul ol,.gist .markdown-body ol ol,.gist .markdown-body ol ul{margin-top:0;margin-bottom:0}.gist .markdown-body li>p{margin-top:16px}.gist .markdown-body li+li{margin-top:.25em}.gist .markdown-body dl{padding:0}.gist .markdown-body dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:600}.gist .markdown-body dl dd{padding:0 16px;margin-bottom:16px}.gist .markdown-body table{display:block;width:100%;width:max-content;max-width:100%;overflow:auto}.gist .markdown-body table th{font-weight:600}.gist .markdown-body table th,.gist .markdown-body table td{padding:6px 13px;border:1px solid var(--color-border-default)}.gist .markdown-body table tr{background-color:var(--color-canvas-default);border-top:1px solid var(--color-border-muted)}.gist .markdown-body table tr:nth-child(2n){background-color:var(--color-canvas-subtle)}.gist .markdown-body table img{background-color:transparent}.gist .markdown-body img{max-width:100%;box-sizing:content-box;background-color:var(--color-canvas-default)}.gist .markdown-body img[align=right]{padding-left:20px}.gist .markdown-body img[align=left]{padding-right:20px}.gist .markdown-body .emoji{max-width:none;vertical-align:text-top;background-color:transparent}.gist .markdown-body span.frame{display:block;overflow:hidden}.gist .markdown-body span.frame>span{display:block;float:left;width:auto;padding:7px;margin:13px 0 0;overflow:hidden;border:1px solid var(--color-border-default)}.gist .markdown-body span.frame span img{display:block;float:left}.gist .markdown-body span.frame span span{display:block;padding:5px 0 0;clear:both;color:var(--color-fg-default)}.gist .markdown-body span.align-center{display:block;overflow:hidden;clear:both}.gist .markdown-body span.align-center>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.gist .markdown-body span.align-center span img{margin:0 auto;text-align:center}.gist .markdown-body span.align-right{display:block;overflow:hidden;clear:both}.gist .markdown-body span.align-right>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.gist .markdown-body span.align-right span img{margin:0;text-align:right}.gist .markdown-body span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.gist .markdown-body span.float-left span{margin:13px 0 0}.gist .markdown-body span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.gist .markdown-body span.float-right>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.gist .markdown-body code,.gist .markdown-body tt{padding:.2em .4em;margin:0;font-size:85%;background-color:var(--color-neutral-muted);border-radius:6px}.gist .markdown-body code br,.gist .markdown-body tt br{display:none}.gist .markdown-body del code{text-decoration:inherit}.gist .markdown-body samp{font-size:85%}.gist .markdown-body pre{word-wrap:normal}.gist .markdown-body pre code{font-size:100%}.gist .markdown-body pre>code{padding:0;margin:0;word-break:normal;white-space:pre;background:transparent;border:0}.gist .markdown-body .highlight{margin-bottom:16px}.gist .markdown-body .highlight pre{margin-bottom:0;word-break:normal}.gist .markdown-body .highlight pre,.gist .markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;background-color:var(--color-canvas-subtle);border-radius:6px}.gist .markdown-body pre code,.gist .markdown-body pre tt{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}.gist .markdown-body .csv-data td,.gist .markdown-body .csv-data th{padding:5px;overflow:hidden;font-size:12px;line-height:1;text-align:left;white-space:nowrap}.gist .markdown-body .csv-data .blob-num{padding:10px 8px 9px;text-align:right;background:var(--color-canvas-default);border:0}.gist .markdown-body .csv-data tr{border-top:0}.gist .markdown-body .csv-data th{font-weight:600;background:var(--color-canvas-subtle);border-top:0}.gist .markdown-body [data-footnote-ref]::before{content:"["}.gist .markdown-body [data-footnote-ref]::after{content:"]"}.gist .markdown-body .footnotes{font-size:12px;color:var(--color-fg-muted);border-top:1px solid var(--color-border-default)}.gist .markdown-body .footnotes ol{padding-left:16px}.gist .markdown-body .footnotes ol ul{display:inline-block;padding-left:16px;margin-top:16px}.gist .markdown-body .footnotes li{position:relative}.gist .markdown-body .footnotes li:target::before{position:absolute;top:-8px;right:-8px;bottom:-8px;left:-24px;pointer-events:none;content:"";border:2px solid var(--color-accent-emphasis);border-radius:6px}.gist .markdown-body .footnotes li:target{color:var(--color-fg-default)}.gist .markdown-body .footnotes .data-footnote-backref g-emoji{font-family:monospace}.gist .pl-c{color:#6a737d}.gist .pl-c1,.gist .pl-s .pl-v{color:#005cc5}.gist .pl-e,.gist .pl-en{color:#6f42c1}.gist .pl-smi,.gist .pl-s .pl-s1{color:#24292e}.gist .pl-ent{color:#22863a}.gist .pl-k{color:#d73a49}.gist .pl-s,.gist .pl-pds,.gist .pl-s .pl-pse .pl-s1,.gist .pl-sr,.gist .pl-sr .pl-cce,.gist .pl-sr .pl-sre,.gist .pl-sr .pl-sra{color:#032f62}.gist .pl-v,.gist .pl-smw{color:#e36209}.gist .pl-bu{color:#b31d28}.gist .pl-ii{color:#fafbfc;background-color:#b31d28}.gist .pl-c2{color:#fafbfc;background-color:#d73a49}.gist .pl-c2::before{content:"^M"}.gist .pl-sr .pl-cce{font-weight:bold;color:#22863a}.gist .pl-ml{color:#735c0f}.gist .pl-mh,.gist .pl-mh .pl-en,.gist .pl-ms{font-weight:bold;color:#005cc5}.gist .pl-mi{font-style:italic;color:#24292e}.gist .pl-mb{font-weight:bold;color:#24292e}.gist .pl-md{color:#b31d28;background-color:#ffeef0}.gist .pl-mi1{color:#22863a;background-color:#f0fff4}.gist .pl-mc{color:#e36209;background-color:#ffebda}.gist .pl-mi2{color:#f6f8fa;background-color:#005cc5}.gist .pl-mdr{font-weight:bold;color:#6f42c1}.gist .pl-ba{color:#586069}.gist .pl-sg{color:#959da5}.gist .pl-corl{text-decoration:underline;color:#032f62}.gist .breadcrumb{font-size:16px;color:var(--color-fg-muted)}.gist .breadcrumb .separator{white-space:pre-wrap}.gist .breadcrumb .separator::before,.gist .breadcrumb .separator::after{content:" "}.gist .breadcrumb strong.final-path{color:var(--color-fg-default)}.gist .blob-interaction-bar{position:relative;background-color:var(--color-canvas-subtle);border-bottom:1px solid var(--color-border-default)}.gist .blob-interaction-bar::before{display:table;content:""}.gist .blob-interaction-bar::after{display:table;clear:both;content:""}.gist .blob-interaction-bar .octicon-search{position:absolute;top:6px;left:10px;font-size:12px;color:var(--color-fg-muted)}.gist .blob-filter{width:100%;padding:4px 16px 4px 32px;font-size:12px;border:0;border-radius:0;outline:none}.gist .blob-filter:focus{outline:none}.gist .TagsearchPopover{width:inherit;max-width:600px}.gist .TagsearchPopover-content{max-height:300px}.gist .TagsearchPopover-list .TagsearchPopover-list-item:hover{background-color:var(--color-canvas-subtle)}.gist .TagsearchPopover-list .TagsearchPopover-list-item .TagsearchPopover-item:hover{text-decoration:none}.gist .TagsearchPopover-list .blob-code-inner{white-space:pre-wrap}.gist .diff-table .line-alert,.gist .blob-code-content .line-alert{position:absolute;
621left:0;margin:-2px 2px}.gist .diff-table .codeowners-error,.gist .blob-code-content .codeowners-error{color:var(--color-danger-fg)}.gist .diff-table .error-highlight,.gist .blob-code-content .error-highlight{position:relative;cursor:help;font-style:italic;color:var(--color-danger-fg)}.gist .diff-table .error-highlight::before,.gist .blob-code-content .error-highlight::before{position:absolute;top:101%;width:100%;height:.25em;content:"";background:linear-gradient(135deg, transparent, transparent 45%, var(--color-danger-fg), transparent 55%, transparent 100%),linear-gradient(45deg, transparent, transparent 45%, var(--color-danger-fg), transparent 55%, transparent 100%);background-repeat:repeat-x,repeat-x;background-size:.5em .5em}.gist .blob-code-content .blob-num .line-alert{margin-top:1px}.gist .diff-table .blob-num .line-alert{margin:2px -2px}.gist .csv-data .line-alert{position:absolute;margin:2px 4px}.gist .CopyBlock{line-height:20px;cursor:pointer}.gist .CopyBlock .octicon-copy{display:none}.gist .CopyBlock:hover,.gist .CopyBlock:focus,.gist .CopyBlock:active{background-color:var(--color-canvas-default);outline:none}.gist .CopyBlock:hover .octicon-copy,.gist .CopyBlock:focus .octicon-copy,.gist .CopyBlock:active .octicon-copy{display:inline-block}.gist .blob-header.is-stuck{border-top:0;border-top-left-radius:0;border-top-right-radius:0}.gist .blob-wrapper{overflow-x:auto;overflow-y:hidden}.gist .blob-wrapper table tr:nth-child(2n){background-color:transparent}.gist .page-edit-blob.height-full .CodeMirror{height:300px}.gist .page-edit-blob.height-full .CodeMirror,.gist .page-edit-blob.height-full .CodeMirror-scroll{display:flex;flex-direction:column;flex:1 1 auto}.gist .blob-wrapper-embedded{max-height:240px;overflow-y:auto}.gist .diff-table{width:100%;border-collapse:separate}.gist .diff-table .blob-code.blob-code-inner{padding-left:22px}.gist .diff-table .line-comments{padding:10px;vertical-align:top;border-top:1px solid var(--color-border-default)}.gist .diff-table .line-comments:first-child+.empty-cell{border-left-width:1px}.gist .diff-table tr:not(:last-child) .line-comments{border-top:1px solid var(--color-border-default);border-bottom:1px solid var(--color-border-default)}.gist .diff-view .blob-code-marker-context::before,.gist .diff-view .blob-code-marker-injected_context::before,.gist .diff-view .blob-code-marker-addition::before,.gist .diff-view .blob-code-marker-deletion::before{top:4px}.gist .diff-view .line-alert,.gist .diff-table .line-alert{position:absolute;left:-60px;margin:2px}.gist .comment-body .diff-view .line-alert{left:0}.gist .blob-num{position:relative;width:1%;min-width:50px;padding-right:10px;padding-left:10px;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;font-size:12px;line-height:20px;color:var(--color-fg-subtle);text-align:right;white-space:nowrap;vertical-align:top;cursor:pointer;-webkit-user-select:none;user-select:none}.gist .blob-num:hover{color:var(--color-fg-default)}.gist .blob-num::before{content:attr(data-line-number)}.gist .blob-num.non-expandable{cursor:default}.gist .blob-num.non-expandable:hover{color:var(--color-fg-subtle)}.gist .blob-num-hidden::before{visibility:hidden}.gist .blob-code{position:relative;padding-right:10px;padding-left:10px;line-height:20px;vertical-align:top}.gist .blob-code-inner{display:table-cell;overflow:visible;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;font-size:12px;color:var(--color-fg-default);word-wrap:anywhere;white-space:pre}.gist .blob-code-inner .x-first{border-top-left-radius:.2em;border-bottom-left-radius:.2em}.gist .blob-code-inner .x-last{border-top-right-radius:.2em;border-bottom-right-radius:.2em}.gist .blob-code-inner.highlighted,.gist .blob-code-inner .highlighted{background-color:var(--color-attention-subtle);box-shadow:inset 2px 0 0 var(--color-attention-muted)}.gist .blob-code-inner::selection,.gist .blob-code-inner *::selection{background-color:var(--color-accent-muted)}.gist .blob-code-inner.blob-code-addition,.gist .blob-code-inner.blob-code-deletion{position:relative;padding-left:22px !important}.gist .blob-code-marker::before{position:absolute;top:1px;left:8px;padding-right:8px;content:attr(data-code-marker)}.gist .blob-code-context,.gist .blob-code-addition,.gist .blob-code-deletion{padding-left:22px}
621.gist .blob-code-marker-addition::before{position:absolute;top:1px;left:8px;content:"+ "}.gist .blob-code-marker-deletion::before{position:absolute;top:1px;left:8px;content:"- "}.gist .blob-code-marker-context::before{position:absolute;top:1px;left:8px;content:" "}.gist .blob-code-marker-injected_context::before{position:absolute;top:1px;left:8px;content:" "}.gist .soft-wrap .diff-table{table-layout:fixed}.gist .soft-wrap .blob-code{padding-left:18px;text-indent:0}.gist .soft-wrap .blob-code-inner{white-space:pre-wrap}.gist .soft-wrap .no-nl-marker{display:none}.gist .soft-wrap .add-line-comment{margin-top:0;margin-left:-24px}.gist .soft-wrap .blob-code-context,.gist .soft-wrap .blob-code-addition,.gist .soft-wrap .blob-code-deletion{padding-left:22px;text-indent:0}.gist .blob-num-hunk,.gist .blob-code-hunk,.gist .blob-num-expandable{color:var(--color-fg-muted);vertical-align:middle}.gist .blob-num-hunk,.gist .blob-num-expandable{background-color:var(--color-diff-blob-hunk-num-bg)}.gist .blob-code-hunk{padding-top:4px;padding-bottom:4px;background-color:var(--color-accent-subtle);border-width:1px 0}.gist .blob-expanded .blob-num:not(.blob-num-context-outside-diff),.gist .blob-expanded .blob-code:not(.blob-code-context){background-color:var(--color-canvas-subtle)}.gist .blob-expanded+tr.show-top-border:not(.blob-expanded) .blob-num,.gist .blob-expanded+tr.show-top-border:not(.blob-expanded) .blob-code{border-top:1px solid var(--color-border-muted)}.gist .blob-expanded tr.show-top-border .blob-num-hunk,.gist .blob-expanded tr.show-top-border .blob-num{border-top:1px solid var(--color-border-muted)}.gist tr.show-top-border+.blob-expanded .blob-num,.gist tr.show-top-border+.blob-expanded .blob-code{border-top:1px solid var(--color-border-muted)}.gist .blob-num-expandable{width:auto;padding:0;font-size:12px;text-align:center}.gist .blob-num-expandable .directional-expander{display:block;width:auto;height:auto;margin-right:-1px;color:var(--color-diff-blob-expander-icon);cursor:pointer}.gist .blob-num-expandable .single-expander{padding-top:4px;padding-bottom:4px}.gist .blob-num-expandable .directional-expander:hover{color:var(--color-fg-on-emphasis);text-shadow:none;background-color:var(--color-accent-emphasis);border-color:var(--color-accent-emphasis)}.gist .blob-code-addition{background-color:var(--color-diff-blob-addition-line-bg);outline:1px dotted transparent}.gist .blob-code-addition .x{color:var(--color-diff-blob-addition-fg);background-color:var(--color-diff-blob-addition-word-bg)}.gist .blob-num-addition{color:var(--color-diff-blob-addition-num-text);background-color:var(--color-diff-blob-addition-num-bg);border-color:var(--color-success-emphasis)}.gist .blob-num-addition:hover{color:var(--color-fg-default)}.gist .blob-code-deletion{background-color:var(--color-diff-blob-deletion-line-bg);outline:1px dashed transparent}.gist .blob-code-deletion .x{color:var(--color-diff-blob-deletion-fg);background-color:var(--color-diff-blob-deletion-word-bg)}.gist .blob-num-deletion{color:var(--color-diff-blob-deletion-num-text);background-color:var(--color-diff-blob-deletion-num-bg);border-color:var(--color-danger-emphasis)}.gist .blob-num-deletion:hover{color:var(--color-fg-default)}.gist .is-selecting{cursor:ns-resize !important}.gist .is-selecting .blob-num{cursor:ns-resize !important}.gist .is-selecting .add-line-comment,.gist .is-selecting a{pointer-events:none;cursor:ns-resize !important}.gist .is-selecting .is-hovered .add-line-comment{opacity:0}.gist .is-selecting.file-diff-split{cursor:nwse-resize !important}.gist .is-selecting.file-diff-split .blob-num{cursor:nwse-resize !important}.gist .is-selecting.file-diff-split .empty-cell,.gist .is-selecting.file-diff-split .add-line-comment,.gist .is-selecting.file-diff-split a{pointer-events:none;cursor:nwse-resize !important}.gist .selected-line{position:relative}.gist .selected-line::after{position:absolute;top:0;left:0;display:block;width:100%;height:100%;box-sizing:border-box;pointer-events:none;content:"";background:var(--color-attention-subtle);mix-blend-mode:var(--color-diff-blob-selected-line-highlight-mix-blend-mode)}.gist .selected-line.selected-line-top::after{border-top:1px solid var(--color-attention-muted)}.gist .selected-line.selected-line-bottom::after{border-bottom:1px solid var(--color-attention-muted)}.gist .selected-line:first-child::after,.gist .selected-line.selected-line-left::after{border-left:1px solid var(--color-attention-muted)}.gist .selected-line:last-child::after,.gist .selected-line.selected-line-right::after{border-right:1px solid var(--color-attention-muted)}.gist .is-commenting .selected-line.blob-code::before{position:absolute;top:0;left:-1px;display:block;width:4px;height:100%;content:"";background:var(--color-accent-emphasis)}.gist .add-line-comment{position:relative;z-index:1;float:left;width:22px;height:22px;
621margin:-2px -10px -2px -32px;line-height:21px;color:var(--color-fg-on-emphasis);text-align:center;text-indent:0;cursor:pointer;background-color:var(--color-accent-emphasis);border-radius:6px;box-shadow:var(--color-shadow-medium);opacity:0;transition:transform .1s ease-in-out;transform:scale(0.8, 0.8)}.gist .add-line-comment:hover{transform:scale(1, 1)}.is-hovered .gist .add-line-comment,.gist .add-line-comment:focus{opacity:1}.gist .add-line-comment .octicon{vertical-align:text-top;pointer-events:none}.gist .add-line-comment.octicon-check{background:#333;opacity:1}.gist .inline-comment-form{border:1px solid #dfe2e5;border-radius:6px}.gist .timeline-inline-comments{width:100%;table-layout:fixed}.gist .timeline-inline-comments .inline-comments,.gist .show-inline-notes .inline-comments{display:table-row}.gist .inline-comments{display:none}.gist .inline-comments .line-comments+.blob-num{border-left-width:1px}.gist .inline-comments .timeline-comment{margin-bottom:10px}.gist .inline-comments .inline-comment-form,.gist .inline-comments .inline-comment-form-container{max-width:780px}.gist .comment-holder{max-width:780px}.gist .comment-holder+.comment-holder{margin-top:16px}.gist .line-comments+.line-comments,.gist .empty-cell+.line-comments{border-left:1px solid var(--color-border-muted)}.gist .inline-comment-form-container .inline-comment-form-box,.gist .inline-comment-form-container.open .inline-comment-form-actions{display:none}.gist .inline-comment-form-container .inline-comment-form-actions,.gist .inline-comment-form-container.open .inline-comment-form-box{display:block}.gist body.full-width .container,.gist body.full-width .container-lg:not(.markdown-body),.gist body.full-width .container-xl{width:100%;max-width:none;padding-right:20px;padding-left:20px}.gist body.full-width .repository-content{width:100%}.gist body.full-width .new-pr-form{max-width:980px}.gist .file-diff-split{table-layout:fixed}.gist .file-diff-split .blob-code+.blob-num{border-left:1px solid var(--color-border-muted)}.gist .file-diff-split .blob-code-inner{white-space:pre-wrap}.gist .file-diff-split .empty-cell{cursor:default;background-color:var(--color-neutral-subtle);border-right-color:var(--color-border-muted)}@media(max-width: 1280px){.gist .file-diff-split .tabnav:not(.CommentBox-header) .write-selected .comment-form-head{margin-bottom:48px !important}.gist .file-diff-split .tabnav:not(.CommentBox-header) markdown-toolbar{position:absolute;right:8px;bottom:-40px}}.gist .submodule-diff-stats .octicon-diff-removed{color:var(--color-danger-fg)}.gist .submodule-diff-stats .octicon-diff-renamed{color:var(--color-fg-muted)}.gist .submodule-diff-stats .octicon-diff-modified{color:var(--color-attention-fg)}.gist .submodule-diff-stats .octicon-diff-added{color:var(--color-success-fg)}.gist .BlobToolbar{left:-17px}.gist .BlobToolbar-dropdown{margin-left:-2px}.gist .pl-token:hover,.gist .pl-token.active{cursor:pointer;background:var(--color-attention-muted)}.gist .task-list-item{list-style-type:none}.gist .task-list-item label{font-weight:400}.gist .task-list-item.enabled label{cursor:pointer}.gist .task-list-item+.task-list-item{margin-top:4px}.gist .task-list-item .handle{display:none}.gist .task-list-item-checkbox{margin:0 .2em .25em -1.6em;vertical-align:middle}.gist .contains-task-list:dir(rtl) .task-list-item-checkbox{margin:0 -1.6em .25em .2em}.gist .convert-to-issue-button{top:2px;right:4px;padding:0 2px;margin-right:8px;-webkit-user-select:none;user-select:none;background-color:var(--color-canvas-subtle)}.gist .convert-to-issue-button .octicon{fill:var(--color-fg-default)}.gist .convert-to-issue-button:hover .octicon,.gist .convert-to-issue-button:focus .octicon{fill:var(--color-accent-fg)}.gist .reorderable-task-lists .markdown-body .contains-task-list{padding:0}.gist .reorderable-task-lists .markdown-body li:not(.task-list-item){margin-left:24px}.gist .reorderable-task-lists .markdown-body ol:not(.contains-task-list) li,.gist .reorderable-task-lists .markdown-body ul:not(.contains-task-list) li{margin-left:0}.gist .reorderable-task-lists .markdown-body .task-list-item{padding:2px 15px 2px 42px;margin-right:-15px;margin-left:-15px;line-height:1.5;border:0}.gist .reorderable-task-lists .markdown-body .task-list-item+.task-list-item{margin-top:0}.gist .reorderable-task-lists .markdown-body .task-list-item .handle{display:block;float:left;width:20px;padding:2px 0 0 2px;margin-left:-43px;opacity:0}
621.gist .reorderable-task-lists .markdown-body .task-list-item .drag-handle{fill:var(--color-fg-default)}.gist .reorderable-task-lists .markdown-body .task-list-item.hovered>.handle{opacity:1}.gist .reorderable-task-lists .markdown-body .task-list-item.is-dragging{opacity:0}.gist .reorderable-task-lists .markdown-body .contains-task-list:dir(rtl) .task-list-item{margin-right:0}.gist .comment-body .reference{font-weight:600;white-space:nowrap}.gist .comment-body .issue-link{white-space:normal}.gist .comment-body .issue-link .issue-shorthand{font-weight:400;color:var(--color-fg-muted)}.gist .comment-body .issue-link:hover .issue-shorthand,.gist .comment-body .issue-link:focus .issue-shorthand{color:var(--color-accent-fg)}.gist .review-comment-contents .markdown-body .task-list-item{padding-left:42px;margin-right:-12px;margin-left:-12px;border-top-left-radius:6px;border-bottom-left-radius:6px}.gist .convert-to-issue-enabled .task-list-item .contains-task-list{padding:4px 15px 0 43px;margin:0 -15px 0 -42px}.gist .convert-to-issue-enabled .task-list-item.hovered{background-color:var(--color-canvas-subtle)}.gist .convert-to-issue-enabled .task-list-item.hovered .contains-task-list{background-color:var(--color-canvas-default)}.gist .convert-to-issue-enabled .task-list-item.hovered>.convert-to-issue-button{z-index:20;width:auto;height:auto;overflow:visible;clip:auto}.gist .convert-to-issue-enabled .task-list-item.hovered>.convert-to-issue-button svg{overflow:visible}.gist .convert-to-issue-enabled .task-list-item.is-loading{color:var(--color-fg-muted);background-color:var(--color-accent-subtle);border-top:1px solid var(--color-accent-subtle);border-bottom:1px solid var(--color-canvas-default);border-left:1px solid var(--color-canvas-default)}.gist .convert-to-issue-enabled .task-list-item.is-loading ul{color:var(--color-fg-default);background-color:var(--color-canvas-default)}.gist .convert-to-issue-enabled .task-list-item.is-loading>.handle{opacity:0}.gist .task-list-item-convert-container{position:absolute !important;top:calc(100% - 4px);right:0;left:0;display:none;margin-top:0}.gist .task-list-item-convert-container:hover,.gist .task-list-item-convert-container:focus{display:block}.gist .task-list-item-convert-button-container{top:4px;right:0;left:auto;width:auto}.gist .contains-task-list{position:relative;list-style-type:none}.gist .contains-task-list:hover .task-list-item-convert-container,.gist .contains-task-list:focus-within .task-list-item-convert-container{display:block;width:auto;height:24px;overflow:visible;clip:auto}.gist .convert-to-block-button{margin:0 4px}.gist .highlight{padding:0;margin:0;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;font-size:12px;font-weight:400;line-height:1.4;color:#333;background:var(--color-canvas-default);border:0}.gist .render-viewer-error,.gist .render-viewer-fatal,.gist .render-viewer-invalid,.gist .octospinner{display:none}.gist iframe.render-viewer{width:100%;height:480px;overflow:hidden;border:0}.gist pre,.gist code{font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace !important;white-space:pre}.gist .gist-meta{padding:10px;overflow:hidden;font:12px -apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";color:var(--color-fg-muted);background-color:#f7f7f7;border-radius:0 0 6px 6px}.gist .gist-meta a{font-weight:600;color:#666;text-decoration:none;border:0}.gist .gist-data{overflow:auto;word-wrap:normal;background-color:var(--color-canvas-default);border-bottom:1px solid #ddd;border-radius:6px 6px 0 0}.gist .gist-file{margin-bottom:1em;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;border:1px solid #ddd;border-bottom:1px solid #ccc;border-radius:6px}.gist .gist-file article{padding:6px}.gist .gist-file .scroll .gist-data{position:absolute;top:0;right:0;bottom:30px;left:0;overflow:scroll}.gist .gist-file .scroll .gist-meta{position:absolute;right:0;bottom:0;left:0}.gist .blob-num{min-width:inherit;padding:1px 10px !important;background:rgba(0,0,0,0)}.gist .blob-code{padding:1px 10px !important;text-align:left;background:rgba(0,0,0,0);border:0}.gist .blob-code-inner::selection,.gist .blob-code-inner *::selection{background-color:#c8e1ff}.gist .blob-wrapper table{border-collapse:collapse}.gist .blob-wrapper tr:first-child td{padding-top:4px}.gist .markdown-body .anchor{display:none} 622 623/*# sourceMappingURL=gist-embed-d3eb7079f000.css.map*/
624.content .gist td { 625 border: none; 626} 627</style> 628<!--
628<script src="https://gist.github.com/lideming/3ea6b3502c69d2f928cad5f8b7aab4d5.js"></script>
628 --> 629<!-- <link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-598610950903.css"> --> 630 631<div id="gist119295072" class="gist"> 632 <div class="gist-file" translate="no"> 633 <div class="gist-data"> 634 <div class="js-gist-file-update-container js-task-list-container file-box"> 635 <div id="file-lark_msg" class="file my-2"> 636 637 <div itemprop="text" class="Box-body p-0 blob-wrapper data type-shell "> 638 639 640<div class="js-check-bidi js-blob-code-container blob-code-content"> 641 642 <template class="js-file-alert-template"> 643 <div data-view-component="true" class="flash flash-warn flash-full d-flex flex-items-center"> 644 <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert"> 645 <path fill-rule="evenodd" d="M8.22 1.754a.25.25 0 00-.44 0L1.698 13.132a.25.25 0 00.22.368h12.164a.25.25 0 00.22-.368L8.22 1.754zm-1.763-.707c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0114.082 15H1.918a1.75 1.75 0 01-1.543-2.575L6.457 1.047zM9 11a1 1 0 11-2 0 1 1 0 012 0zm-.25-5.25a.75.75 0 00-1.5 0v2.5a.75.75 0 001.5 0v-2.5z"></path> 646</svg> 647 648 <span> 649 This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. 650 <a href="https://github.co/hiddenchars" target="_blank">Learn more about bidirectional Unicode characters</a> 651 </span> 652 653 654 <div data-view-component="true" class="flash-action"> <a href="{{ revealButtonHref }}" data-view-component="true" class="btn-sm btn"> Show hidden characters 655</a> 656</div> 657</div></template> 658<template class="js-line-alert-template"> 659 <span aria-label="This line has hidden Unicode characters" data-view-component="true" class="line-alert tooltipped tooltipped-e"> 660 <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert"> 661 <path fill-rule="evenodd" d="M8.22 1.754a.25.25 0 00-.44 0L1.698 13.132a.25.25 0 00.22.368h12.164a.25.25 0 00.22-.368L8.22 1.754zm-1.763-.707c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0114.082 15H1.918a1.75 1.75 0 01-1.543-2.575L6.457 1.047zM9 11a1 1 0 11-2 0 1 1 0 012 0zm-.25-5.25a.75.75 0 00-1.5 0v2.5a.75.75 0 001.5 0v-2.5z"></path> 662</svg> 663</span></template> 664 665 <table data-hpc="" class="highlight tab-size js-file-line-container js-code-nav-container js-tagsearch-file" data-tab-size="8" data-paste-markdown-skip="" data-tagsearch-lang="Shell" data-tagsearch-path="lark_msg"> 666 <tbody><tr> 667 <td id="file-lark_msg-L1" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="1"></td> 668 <td id="file-lark_msg-LC1" class="blob-code blob-code-inner js-file-line"><span class="pl-c"><span class="pl-c">#!</span>/bin/sh</span></td> 669 </tr> 670 <tr> 671 <td id="file-lark_msg-L2" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="2"></td> 672 <td id="file-lark_msg-LC2" class="blob-code blob-code-inner js-file-line"> 673</td> 674 </tr> 675 <tr> 676 <td id="file-lark_msg-L3" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="3"></td> 677 <td id="file-lark_msg-LC3" class="blob-code blob-code-inner js-file-line">WEBHOOK=YOUR_WEBHOOK_HERE</td> 678 </tr> 679 <tr> 680 <td id="file-lark_msg-L4" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="4"></td> 681 <td id="file-lark_msg-LC4" class="blob-code blob-code-inner js-file-line"> 682</td> 683 </tr> 684 <tr> 685 <td id="file-lark_msg-L5" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="5"></td> 686 <td id="file-lark_msg-LC5" class="blob-code blob-code-inner js-file-line"><span class="pl-k">if</span> [ <span class="pl-s"><span class="pl-pds">"</span><span class="pl-smi">$*</span><span class="pl-pds">"</span></span> <span class="pl-k">==</span> <span class="pl-s"><span class="pl-pds">"</span>--help<span class="pl-pds">"</span></span> ] <span class="pl-k">;</span> <span class="pl-k">then</span></td> 687 </tr> 688 <tr> 689 <td id="file-lark_msg-L6" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="6"></td> 690 <td id="file-lark_msg-LC6" class="blob-code blob-code-inner js-file-line">
690 <span class="pl-c1">echo</span> <span class="pl-s"><span class="pl-pds">"</span>Usage: lark_msg <msg>...<span class="pl-pds">"</span></span></td> 691 </tr> 692 <tr> 693 <td id="file-lark_msg-L7" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="7"></td> 694 <td id="file-lark_msg-LC7" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">exit</span> 0</td> 695 </tr> 696 <tr> 697 <td id="file-lark_msg-L8" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="8"></td> 698 <td id="file-lark_msg-LC8" class="blob-code blob-code-inner js-file-line"><span class="pl-k">fi</span></td> 699 </tr> 700 <tr> 701 <td id="file-lark_msg-L9" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="9"></td> 702 <td id="file-lark_msg-LC9" class="blob-code blob-code-inner js-file-line"> 703</td> 704 </tr> 705 <tr> 706 <td id="file-lark_msg-L10" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="10"></td> 707 <td id="file-lark_msg-LC10" class="blob-code blob-code-inner js-file-line">msg=<span class="pl-s"><span class="pl-pds">"</span><span class="pl-smi">$*</span><span class="pl-pds">"</span></span></td> 708 </tr> 709 <tr> 710 <td id="file-lark_msg-L11" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="11"></td> 711 <td id="file-lark_msg-LC11" class="blob-code blob-code-inner js-file-line"> 712</td> 713 </tr> 714 <tr> 715 <td id="file-lark_msg-L12" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="12"></td> 716 <td id="file-lark_msg-LC12" class="blob-code blob-code-inner js-file-line"><span class="pl-c1">echo</span> <span class="pl-s"><span class="pl-pds">"</span>sending:<span class="pl-pds">"</span></span> <span class="pl-s"><span class="pl-pds">"</span><span class="pl-smi">$*</span><span class="pl-pds">"</span></span> <span class="pl-k">|</span> systemd-cat -t lark_msg -p info</td> 717 </tr> 718 <tr> 719 <td id="file-lark_msg-L13" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="13"></td> 720 <td id="file-lark_msg-LC13" class="blob-code blob-code-inner js-file-line"> 721</td> 722 </tr> 723 <tr> 724 <td id="file-lark_msg-L14" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="14"></td> 725 <td id="file-lark_msg-LC14" class="blob-code blob-code-inner js-file-line">json=<span class="pl-s"><span class="pl-pds">$(</span>jq -n --arg msg <span class="pl-s"><span class="pl-pds">"</span><span class="pl-smi">$msg</span><span class="pl-pds">"</span></span> <span class="pl-s"><span class="pl-pds">'</span>{"msg_type":"text","content":{"text": $msg}}<span class="pl-pds">'</span></span><span class="pl-pds">)</span></span></td> 726 </tr> 727 <tr> 728 <td id="file-lark_msg-L15" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="15"></td> 729 <td id="file-lark_msg-LC15" class="blob-code blob-code-inner js-file-line"> 730</td> 731 </tr> 732 <tr> 733 <td id="file-lark_msg-L16" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="16"></td> 734 <td id="file-lark_msg-LC16" class="blob-code blob-code-inner js-file-line">ret=<span class="pl-s"><span class="pl-pds">$(</span>curl -s -X POST -H <span class="pl-s"><span class="pl-pds">"</span>Content-Type: application/json<span class="pl-pds">"</span></span> -d <span class="pl-s"><span class="pl-pds">"</span><span class="pl-smi">$json</span><span class="pl-pds">"</span></span> <span class="pl-s"><span class="pl-pds">"</span><span class="pl-smi">$WEBHOOK</span><span class="pl-pds">"</span></span> <span class="pl-pds">)</span></span></td> 735 </tr> 736 <tr> 737 <td id="file-lark_msg-L17" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="17"></td> 738 <td id="file-lark_msg-LC17" class="blob-code blob-code-inner js-file-line"> 739</td> 740 </tr> 741 <tr> 742 <td id="file-lark_msg-L18" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="18"></td> 743 <td id="file-lark_msg-LC18" class="blob-code blob-code-inner js-file-line"><span class="pl-k">if</span> [ <span class="pl-s"><span class="pl-pds">"</span><span class="pl-s"><span class="pl-pds">$(</span> <span class="pl-c1">echo</span> <span class="pl-s"><span class="pl-pds">"</span><span class="pl-smi">$ret</span><span class="pl-pds">"</span></span> <span class="pl-k">|</span> jq .StatusCode <span class="pl-pds">)</span></span><span class="pl-pds">"</span></span> <span class="pl-k">!=</span> <span class="pl-s"><span class="pl-pds">"</span>0<span class="pl-pds">"</span></span> ] <span class="pl-k">;</span> <span class="pl-k">then</span></td> 744 </tr> 745 <tr> 746 <td id="file-lark_msg-L19" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="19"></td> 747 <td id="file-lark_msg-LC19" class="blob-code blob-code-inner js-file-line">
747 <span class="pl-c1">echo</span> <span class="pl-s"><span class="pl-pds">"</span>failed:<span class="pl-pds">"</span></span> <span class="pl-s"><span class="pl-pds">"</span><span class="pl-smi">$ret</span><span class="pl-pds">"</span></span> <span class="pl-k">|</span> systemd-cat -t lark_msg -p warning</td> 748 </tr> 749 <tr> 750 <td id="file-lark_msg-L20" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="20"></td> 751 <td id="file-lark_msg-LC20" class="blob-code blob-code-inner js-file-line"><span class="pl-k">fi</span></td> 752 </tr> 753 </tbody></table> 754</div> 755 756 757 </div> 758 759 </div> 760</div> 761 762 </div> 763 <div class="gist-meta"> 764 <a href="https://gist.github.com/lideming/3ea6b3502c69d2f928cad5f8b7aab4d5/raw/2100845a950323f401ddbc4fd509bd2c53b673d1/lark_msg" style="float:right">view raw</a> 765 <a href="https://gist.github.com/lideming/3ea6b3502c69d2f928cad5f8b7aab4d5#file-lark_msg"> 766 lark_msg 767 </a> 768 hosted with ⤠by <a href="https://github.com">GitHub</a> 769 </div> 770 </div> 771</div></section> 772 <div class="post-preview-footer"> 773 <div class="date-tags"> 774 <time class="date">2022-11-11</time> 775 <span class="tags"> 776 <a href="/Posts?tag=Linux"><span class="tag">Linux</span></a> 777 <a href="/Posts?tag=server"><span class="tag">server</span></a> 778 <a href="/Posts?tag=shell"><span class="tag">shell</span></a> 779 <a href="/Posts?tag=lark"><span class="tag">lark</span></a> 780 <a href="/Posts?tag=feishu"><span class="tag">feishu</span></a> 781 <a href="/Posts?tag=bot"><span class="tag">bot</span></a> 782 </span> 783 </div> 784 </div> 785 </article> 786 <article class="post-preview mycard"> 787 <header> 788 <h1 class="title"><a href="/Posts/fail2ban-for-ssh-behind-frp">为 frp 后的 SSH 配置 fail2ban</a></h1> 789 </header> 790 <section class="content"><!-- md --> 791<p>å®¶éç NAS ä¸ç´è¢« SSH çç ´ï¼å³ä½¿æå·²ç»æå¯ç ç»å½å ³äºï¼è¿æ¯å¨ä¸åå°å· SSH ç»å½å¤±è´¥çç³»ç»æ¥å¿ã</p> 792<p>äºæ¯å°è¯é ç½® fail2ban è§£å³è¿ä¸ªé®é¢ã</p> 793</section> 794 <div class="post-preview-footer"> 795 <div class="date-tags"> 796 <time class="date">2022-04-13</time> 797 <span class="tags"> 798 <a href="/Posts?tag=Linux"><span class="tag">Linux</span></a> 799 <a href="/Posts?tag=server"><span class="tag">server</span></a> 800 <a href="/Posts?tag=frp"><span class="tag">frp</span></a> 801 <a href="/Posts?tag=fail2ban"><span class="tag">fail2ban</span></a> 802 </span> 803 </div> 804 <a class="read-more" href="/Posts/fail2ban-for-ssh-behind-frp">Full post ></a> 805 </div> 806 </article> 807 <article class="post-preview mycard"> 808 <header> 809 <h1 class="title"><a href="/Posts/backup-server-data-to-nextcloud">自动备份服务器数据到 NextCloud</a></h1> 810 </header> 811 <section class="content"><!-- md --> 812<blockquote> 813<p>2024-02-28 æ´æ°ï¼ä½¿ç¨ zstd å缩ï¼<code>.tar.gz</code> -> <code>.tar.zst</code>ï¼<code>tar czvf</code> -> <code>tar cavf</code>ï¼</p> 814</blockquote> 815<p>çªå奿³ï¼å¨ NextCloud å建ä¸ä¸ª File drop å享ï¼ç¶ååä¸ä¸ªæå ä¸ä¼ èæ¬ï¼å°±å¯ä»¥æå®å½å¤ä»½æå¡å¨ç¨å¦ã</p> 816<p>
816åè½/ç¹ç¹ï¼</p> 817<ul> 818<li>åå«å¤ä»½å¤ä¸ªæºç®å½å° tar æä»¶å¹¶ä¸ä¼ å° NextCloud shareï¼</li> 819<li>æ¯å¨ä¸ä¼ 宿´å¤ä»½ï¼æ¯å¤©ä¸ä¼ å¢éå¤ä»½ï¼å©ç¨ tar å¢éå¤ä»½ï¼ï¼</li> 820<li>åªéè¦ NextCloud ç File drop 龿¥ï¼ç±äº File drop åªè½ç¨äºä¸ä¼ ï¼ç¦æ¢ååº/ä¸è½½æä»¶ï¼èæ¬æ³é²ä¸ä¼é æå ¶å®æ°æ®çæ³é²ã</li> 821</ul> 822</section> 823 <div class="post-preview-footer"> 824 <div class="date-tags"> 825 <time class="date">2022-03-25</time> 826 <span class="tags"> 827 <a href="/Posts?tag=Linux"><span class="tag">Linux</span></a> 828 <a href="/Posts?tag=server"><span class="tag">server</span></a> 829 <a href="/Posts?tag=NextCloud"><span class="tag">NextCloud</span></a> 830 <a href="/Posts?tag=bash"><span class="tag">bash</span></a> 831 <a href="/Posts?tag=shell"><span class="tag">shell</span></a> 832 <a href="/Posts?tag=backup"><span class="tag">backup</span></a> 833 </span> 834 </div> 835 <a class="read-more" href="/Posts/backup-server-data-to-nextcloud">Full post ></a> 836 </div> 837 </article> 838 <article class="post-preview mycard"> 839 <header> 840 <h1 class="title"><a href="/Posts/caddy-server">Caddy server</a></h1> 841 </header> 842 <section class="content"><!-- md --> 843<p><a href="https://caddyserver.com/">Caddy</a> æ¯ä¸ä¸ªä½¿ç¨ Go ç¼åç髿§è½ HTTP æå¡å¨è½¯ä»¶ãä¸ Nginx ç¸ä¼¼ï¼å®ä¸»è¦ä½ä¸ºéæç½ç«æå¡å¨æåå代çè¿è¡ã</p> 844</section> 845 <div class="post-preview-footer"> 846 <div class="date-tags"> 847 <time class="date">2021-11-25</time> 848 <span class="tags"> 849 <a href="/Posts?tag=Linux"><span class="tag">Linux</span></a> 850 <a href="/Posts?tag=Tutorial"><span class="tag">Tutorial</span></a> 851 <a href="/Posts?tag=Caddy"><span class="tag">Caddy</span></a> 852 <a href="/Posts?tag=server"><span class="tag">server</span></a> 853 </span> 854 </div> 855 <a class="read-more" href="/Posts/caddy-server">Full post ></a> 856 </div> 857 </article> 858 <article class="post-preview mycard"> 859 <header> 860 <h1 class="title"><a href="/Posts/btrfs-as-the-vm-disk-storage">使用 Btrfs 作为虚拟磁盘文件的底层存储</a></h1> 861 </header> 862 <section class="content"><!-- md --> 863<p>ï¼2022-05-12 æ´æ°ï¼</p> 864<p>å°èæç£çæä»¶åå¨å¨ Btrfs æä»¶ç³»ç»ä¸å ·æå 个ä¼ç¹ï¼</p> 865<ul> 866<li>Btrfs çæ°æ®éæå缩åè½å¯ä»¥èç硬ç空é´ï¼</li> 867<li>Btrfs ç reflinkï¼å ±äº«æ°æ®åï¼ å subvolume snapshotï¼åå·å¿«ç §ï¼å¯ç¨äºç»èæç£çåå»ºå¿«ç §ï¼</li> 868<li>Btrfs ç Copy-on-Write (CoW) transaction æºå¶åå¯ä¿è¯èæç£çæä»¶çä¸è´æ§ï¼å¨å¤§ééæºåå ¥æ¶å¯ä»¥å é¤é¢ç¹ç硬ç flush æä½ã</li> 869</ul> 870</section> 871 <div class="post-preview-footer"> 872 <div class="date-tags"> 873 <time class="date">2021-05-28</time> 874 <span class="tags"> 875 <a href="/Posts?tag=Btrfs"><span class="tag">Btrfs</span></a> 876 <a href="/Posts?tag=Linux"><span class="tag">Linux</span></a> 877 <a href="/Posts?tag=libvirt"><span class="tag">
877libvirt</span></a> 878 <a href="/Posts?tag=QEMU"><span class="tag">QEMU</span></a> 879 <a href="/Posts?tag=Tutorial"><span class="tag">Tutorial</span></a> 880 </span> 881 </div> 882 <a class="read-more" href="/Posts/btrfs-as-the-vm-disk-storage">Full post ></a> 883 </div> 884 </article> 885 <article class="post-preview mycard"> 886 <header> 887 <h1 class="title"><a href="/Posts/clone-arch-linux-to-other-devices">将 Arch Linux 克隆到其它存储设备(硬盘 / U盘)</a></h1> 888 </header> 889 <section class="content"><!-- md --> 890<p>å设系ç»å®è£ å¨ Btrfs çä¸ä¸ªåå·ä¸ï¼å¹¶ä¸æ²¡æåç¬ç <code>/boot</code>, <code>/home</code> çååºã</p> 891<pre><code class="language-bash">$root_dev=/dev/sda2 # "/" æå¨çåè®¾å¤ 892$root_subvol=@ # "/" æå¨ç btrfs åå· 893 894$target_dev=/dev/sdb2 # ç®æ åè®¾å¤ 895$target_esp=/dev/sdb1 # ç®æ EFI ç³»ç»ååºåè®¾å¤ 896</code></pre> 897</section> 898 <div class="post-preview-footer"> 899 <div class="date-tags"> 900 <time class="date">2021-03-14</time> 901 <span class="tags"> 902 <a href="/Posts?tag=Linux"><span class="tag">Linux</span></a> 903 <a href="/Posts?tag=Tutorial"><span class="tag">Tutorial</span></a> 904 <a href="/Posts?tag=Arch Linux"><span class="tag">Arch Linux</span></a> 905 <a href="/Posts?tag=Btrfs"><span class="tag">Btrfs</span></a> 906 </span> 907 </div> 908 <a class="read-more" href="/Posts/clone-arch-linux-to-other-devices">Full post ></a> 909 </div> 910 </article> 911 <article class="post-preview mycard"> 912 <header> 913 <h1 class="title"><a href="/Posts/tmux">tmux - 终端多路复用器 / 应用服务管理器(误)</a></h1> 914 </header> 915 <section class="content"><!-- md --> 916<p><code>tmux</code> æä¸º terminal multiplexer (ç»ç«¯å¤è·¯å¤ç¨å¨)ï¼å®å è®¸ç¨æ·å¨ç»ç«¯ä¸ä½¿ç¨å¤ä¸ªèæç»ç«¯ï¼æ¯æå¤ä¼è¯ãå¤çªå£ãå¸å±çåè½ã</p> 917</section> 918 <div class="post-preview-footer"> 919 <div class="date-tags"> 920 <time class="date">2021-03-14</time> 921 <span class="tags"> 922 <a href="/Posts?tag=Linux"><span class="tag">Linux</span></a> 923 <a href="/Posts?tag=Tutorial"><span class="tag">Tutorial</span></a> 924 <a href="/Posts?tag=server"><span class="tag">server</span></a> 925 <a href="/Posts?tag=tmux"><span class="tag">tmux</span></a> 926 </span> 927 </div> 928 <a class="read-more" href="/Posts/tmux">Full post ></a> 929 </div> 930 </article> 931 <article class="post-preview mycard"> 932 <header> 933 <h1 class="title"><a href="/Posts/the-website-is-updated">网站更新了!</a></h1> 934 </header> 935 <section class="content"><!-- md --> 936<p>ï¼2022 å¹´ååååæ´æ°äºï¼ä¿®æ¹é¦é¡µå¸å±ãæ·»å About 页é¢ãæ·»å 代ç é«äº®â¦â¦ï¼</p> 937<p>æ´æ°äºç½ç«æ ·å¼ï¼ç¯ç滥ç¨å¡çï¼ã</p> 938<p>é¦é¡µæ¯æå页ï¼å ¶å®å¹¶ä¸æ¯åâ页âï¼åæ°æ¯ post id è䏿¯é¡µæ°ï¼ã</p> 939<p>å端代ç 太èäºãå端é¨åæ²¡ææ··æ·ï¼æ F12 å°±è½çå°ã</p> 940<p>å 为æ¤ç½ç«åºäº ASP.NET Core é»è®¤æ¨¡æ¿ï¼æä»¥<ruby>èª<rt>diu</rt></ruby><ruby>豪<rt>ren</rt></ruby>å°ä½¿ç¨äº jQuery å Bootstrapï¼ä»¥åä¹è®¸ä¼æè¿ä¸¤ä¸ªä¾èµå»æâ¦â¦</p> 941</section> 942 <div class="post-preview-footer"> 943 <div class="date-tags"> 944 <time class="date">2020-09-22</time>
945 <span class="tags"> 946 <a href="/Posts?tag=Yuuza.net"><span class="tag">Yuuza.net</span></a> 947 <a href="/Posts?tag=前端"><span class="tag">前端</span></a> 948 </span> 949 </div> 950 </div> 951 </article> 952 <div class="px-0 my-1 text-end d-flex"> 953 <div class="col-4 px-0 text-start"> 954 </div> 955 <div class="col-4 text-center"> 956 <a class="btn btn-link" href="/Posts">List</a> 957 </div> 958 <div class="col-4 px-0 text-end"> 959 <a class="btn btn-link" href="?after=8">Older ></a> 960 </div> 961 </div> 962 </div> 963<div class="home-bg"> 964 <div class="home-bg-thumb"></div> 965 <div class="home-bg-full"></div> 966</div> 967 968<div class="home-intro-box"> 969 <div class="inner-relative"> 970 <div class="home-bg-info" hidden> 971 <a href="javascript:reloadHomeBg()">[RANDOM]</a> 972 <!-- <a target="_blank" id="home-bg-info-file">[FILE]</a> --> 973 <a target="_blank" id="home-bg-info-title"></a> 974 <!-- by <a target="_blank" href="https://github.com/lideming/random_anime_wallpaper">random_anime_wallpaper</a> --> 975 </div> 976 </div> 977</div> 978
979<script> 980 document.body.insertBefore(document.querySelector('.home-bg'), document.body.firstChild); 981 document.body.insertBefore(document.querySelector('.home-intro-box'), document.body.firstChild); 982</script>
982 983 984<div class="sidebar col-12 col-md-3 order-0 order-md-2"> 985 <div class="sidebar-sticky"> 986 <div class="sidebar-block sidebar-info mycard mb-3 p-2"> 987 <h3>Me</h3> 988 <div class="sidebar-info-avatar"> 989 <img class="avatar" src="data:image/jpeg;base64,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" alt="avatar"> 990 </div> 991 <div class="sidebar-info-content"> 992 <h4 class="name"><a href="/about" style="color: inherit">lideming<br/>at Yuuza.net</a></h4> 993 <div class="links"> 994 <a href="https://github.com/lideming"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" 995 fill="currentColor" class="bi bi-github" viewBox="0 0 16 16"> 996 <path 997 d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.012 8.012 0 0 0 16 8c0-4.42-3.58-8-8-8z" /> 998 </svg> GitHub</a><a id="feed-blog-link" href="/Posts/atom.xml"><svg version="1.1" id="Layer_1" 999 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" 1000 y="0px" width="16" height="16" viewB
1000ox="0 0 291.319 291.319" 1001 style="enable-background:new 0 0 291.319 291.319;" xml:space="preserve"> 1002 <g> 1003 <path style="fill:#F4B459;" d="M145.659,0c80.44,0,145.66,65.219,145.66,145.66c0,80.45-65.219,145.659-145.66,145.659 1004 S0,226.109,0,145.66C0,65.219,65.21,0,145.659,0z" /> 1005 <path style="fill:#FFFFFF;" d="M109.254,163.831c-10.06,0-18.226,8.157-18.226,18.226s8.157,18.226,18.226,18.226 1006 s18.226-8.157,18.226-18.226S119.322,163.831,109.254,163.831z M103.873,118.367c-7.074,0-12.8,5.726-12.8,12.8 1007 c0,7.064,5.726,12.8,12.8,12.8c23.997,0,43.525,19.527,43.525,43.525c0,7.064,5.726,12.8,12.809,12.8c7.055,0,12.8-5.735,12.8-12.8 1008 C173.007,149.374,141.991,118.367,103.873,118.367z M104.119,72.839c-7.228,0-13.091,5.863-13.091,13.091 1009 s5.863,13.091,13.091,13.091c48.623,0,88.188,39.556,88.188,88.179c0,7.228,5.854,13.091,13.091,13.091s13.091-5.872,13.091-13.091 1010 C218.48,124.138,167.172,72.839,104.119,72.839z" /> 1011 </svg> <span id="feed-blog-text">Feed</span></a> 1012 </div> 1013 </div> 1014 </div> 1015 1016 <div class="sidebar-block sidebar-links mycard mb-3 p-2 px-3" id="links-friends"> 1017 <h3>Links</h3> 1018 <p> 1019 <a href="https://www.z233.me/" target="_blank">Fronz</a> 1020 <span class="friend-note">å端大佬</span> 1021 </p> 1022 <p> 1023 <a href="https://gavin.gong.host/" target="_blank">VisualDust</a> 1024 <span class="friend-note">ç¾å½èè AI å士</span></a> 1025 </p> 1026 <p> 1027 <a href="https://dsstudio.tech/" target="_blank">è±æ²å·¥ä½å®¤</a> 1028 <span class="friend-note">å ¨æ 大佬</span></a> 1029 </p> 1030 <p> 1031 <a href="https://blog.therainisme.com/" target="_blank">Therainisme</a> 1032 <span class="friend-note">转ä¸ä¸ä¿ç 大佬</span></a> 1033 </p> 1034 <p> 1035 <a href="https://memo.xiee.ltd/" target="_blank">PommesPeter</a> 1036 <span class="friend-note">深度ç¼ä¸¹ä¿ç 大佬</span></a> 1037 </p> 1038 </div> 1039 1040
1040<script> 1041 Array.from(document.querySelectorAll('#links-friends p')) 1042 .map(x => [x, Math.random()]) 1043 .sort((a, b) => a[1] - b[1]) 1044 .forEach(x => { 1045 document.getElementById('links-friends').appendChild(x[0]); 1046 }); 1047 </script>
1047 1048 1049 <div class="sidebar-block sidebar-links mycard mb-3 p-2 px-3"> 1050 <h3>Stuffs</h3> 1051 <p><a href="https://csd.moe/" target="_blank">GUET æ ¡åºå°è½¯ä»¶é¨</a></p> 1052 <p><a href="https://gh.yuuza.net/" target="_blank">Yuuza ToolBox (EN only)</a></p> 1053 <p><a href="https://mc.yuuza.net/" target="_blank">MusicCloud</a></p> 1054 <p><a href="https://md.yuuza.net/index" target="_blank">Markdown Docs</a></p> 1055 <!-- <p><a href="https://id.yuuza.net/auth/realms/master/account/" target="_blank">Yuuza ID Profile</a></p> --> 1056 <p><a href="https://track.yuuza.net/" target="_blank">Track</a></p> 1057 <!-- <p><a href="https://gobang.yuuza.net/" target="_blank">Gobang</a></p> --> 1058 </div> 1059 1060
1060<script> 1061 initHomeIntro(); 1062 </script>
1062 1063
1063<script> 1064 function initFpsCounter() { 1065 const dom = document.createElement('div'); 1066 dom.style = "position: fixed; right: 10px; bottom: 10px; background: white; transition: all .3s"; 1067 document.body.appendChild(dom); 1068 1069 let lastTime = 0; 1070 1071 const frameCallback = (time) => { 1072 const frameTime = time - lastTime; 1073 if (lastTime) { 1074 //dom.textContent = frameTime.toFixed(1) + ' ms'; 1075 } 1076 lastTime = time; 1077 requestAnimationFrame(frameCallback); 1078 }; 1079 requestAnimationFrame(frameCallback); 1080 } 1081 </script>
1081 1082 1083 <div class="sidebar-block sidebar-extra mycard mb-3 p-2 px-3"> 1084 <h3>Network</h3> 1085 <iframe src="https://ip.skk.moe/simple" style="width: 100%; border: 0; margin-top: 10px; height: 300px;"></iframe> 1086 <small style="color: gray; font-size: 10px;">æ¾ç¤ºä¸åºæ¥ï¼å¯è½ä½ ç IP 被 CloudFlare æ è®°äº</small> 1087 </div> 1088 </div> 1089 <style> 1090 .subpage { 1091 display: block; 1092 position: fixed; 1093 top: 0; 1094 left: 0; 1095 bottom: 0; 1096 right: 0; 1097 z-index: 10000; 1098 } 1099 </style> 1100
1100<script> 1101 document.body.addEventListener('click', (e) => { 1102 const target = e.target; 1103 if (target.href, false) { 1104 e.preventDefault(); 1105 const container = document.createElement('div'); 1106 container.className = 'subpage'; 1107 const iframe = document.createElement('iframe'); 1108 iframe.src = target.href; 1109 iframe.style = 'width: 100%; height: 100%;'; 1110 container.appendChild(iframe); 1111 document.body.appendChild(container); 1112 } 1113 }, true); 1114 </script>
1114 1115</div></div> 1116 1117 </main> 1118 1119 <footer class="border-top footer text-muted"> 1120 <div class="container-xl"> 1121 <span class="item">© 2026 - Yuuza - <a href="/Home/Privacy">Privacy</a></span> 1122 <span class="item">- <a href="http://beian.miit.gov.cn/" target="_blank">æ¡ICPå¤19010850å·-1</a></span> 1123 <span class="item">- Uptime: 161 days 7 hrs</span> 1124 <span class="item">- Powered by .NET 8</span> 1125 </div> 1126 </footer> 1127 1128</body> 1129</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.