[{"data":1,"prerenderedAt":11701},["ShallowReactive",2],{"post:\u002Fposts\u002F2026\u002Fduolingo":3,"posts:catalog":11438},{"id":4,"title":5,"aiSummary":6,"audio":7,"body":8,"categories":11419,"cover":11421,"description":11422,"extension":11423,"meta":11424,"navigation":6,"path":11425,"pin":11426,"publish":11427,"seo":11428,"series":7,"seriesOrder":7,"stem":11429,"summary":7,"summarySource":11430,"tags":11431,"theme":11434,"update":7,"wip":11435,"wordCount":11436,"__hash__":11437},"posts\u002Fposts\u002F2026\u002Fduolingo.md","今天你 Duolingo 了吗？",true,null,{"type":9,"value":10,"toc":11394},"minimark",[11,16,20,23,26,59,62,72,75,78,83,86,95,98,104,108,111,117,120,126,129,1466,1469,1475,1478,1587,1594,1597,1599,1602,1605,1608,1611,1717,1720,1726,1729,1732,1895,1902,2075,2078,2080,2083,2090,2096,2099,2118,2121,2382,2385,2789,2792,2909,2911,2914,2921,2924,2938,2941,4008,4011,4014,4016,4020,4026,4029,4032,4038,4041,4098,4101,4325,4328,4413,4416,4419,4422,4428,4431,4434,4436,4439,4442,4445,4451,4454,4457,4463,4466,4689,4692,4723,4726,4731,4734,4740,4743,4749,4752,4758,4761,4763,4767,4770,4773,4779,4782,4789,4834,4840,4843,4845,4848,4851,4854,4954,4957,5001,5004,5135,5137,5140,5143,11271,11273,11277,11280,11286,11289,11293,11298,11301,11305,11311,11317,11321,11326,11329,11331,11334,11337,11342,11345,11351,11354,11360,11363,11369,11372,11375,11379,11390],[12,13,15],"h1",{"id":14},"用-cloudflare-workers-做一个-duolingo-用户信息接口","用 Cloudflare Workers 做一个 Duolingo 用户信息接口",[17,18,19],"p",{},"最近想把自己的 Duolingo 连续学习天数放到个人主页上。",[17,21,22],{},"前端直接请求 Duolingo 接口会遇到跨域问题，而且页面每次打开都请求一次 Duolingo 也没有必要。于是决定在 Cloudflare Workers 中包一层接口，负责查询、整理和缓存数据（原接口数据量非常大，不做缓存会导致接口很慢）。",[17,24,25],{},"最终需要实现这些功能：",[27,28,29,38,41,44,47,50,53,56],"ul",{},[30,31,32,33,37],"li",{},"根据环境变量中的 ",[34,35,36],"code",{},"USERNAME"," 查询固定用户",[30,39,40],{},"返回用户昵称、头像、经验和连续学习天数",[30,42,43],{},"支持查询其他用户",[30,45,46],{},"提供更完整的详情接口",[30,48,49],{},"使用 KV 缓存固定用户的数据",[30,51,52],{},"支持定时更新",[30,54,55],{},"支持带鉴权的手动刷新",[30,57,58],{},"处理常见的请求和上游错误",[17,60,61],{},"这里使用的是 Duolingo 自己使用的接口：",[63,64,70],"pre",{"className":65,"code":67,"language":68,"meta":69},[66],"language-text","https:\u002F\u002Fwww.duolingo.com\u002F2017-06-30\u002Fusers\n","text","",[34,71,67],{"__ignoreMap":69},[17,73,74],{},"它并不是一个有稳定版本承诺的公开 SDK，接口杂乱且数据量非常大，因此代码里将不会直接透传所有字段，只挑需要的数据返回。",[76,77],"hr",{},[79,80,82],"h2",{"id":81},"minimal-viable-product","Minimal Viable Product",[17,84,85],{},"第一步只做一件事：",[87,88,89],"blockquote",{},[17,90,91,92,94],{},"读取 Cloudflare Workers 中配置的 ",[34,93,36],{},"，查询对应的 Duolingo 用户并返回基本信息。",[17,96,97],{},"接口暂时只有一个：",[63,99,102],{"className":100,"code":101,"language":68,"meta":69},[66],"GET \u002Fme\n",[34,103,101],{"__ignoreMap":69},[105,106,107],"h3",{"id":107},"配置环境变量",[17,109,110],{},"进入 Cloudflare Worker：",[63,112,115],{"className":113,"code":114,"language":68,"meta":69},[66],"Settings\n→ Variables and Secrets\n→ Add\n",[34,116,114],{"__ignoreMap":69},[17,118,119],{},"添加一个普通变量：",[63,121,124],{"className":122,"code":123,"language":68,"meta":69},[66],"USERNAME=你的 Duolingo 用户名\n",[34,125,123],{"__ignoreMap":69},[105,127,128],{"id":128},"最小可用代码",[63,130,134],{"className":131,"code":132,"language":133,"meta":69,"style":69},"language-js shiki shiki-themes catppuccin-mocha catppuccin-latte","const DUOLINGO_API =\n  'https:\u002F\u002Fwww.duolingo.com\u002F2017-06-30\u002Fusers'\n\nconst corsHeaders = {\n  'Access-Control-Allow-Origin': '*',\n  'Access-Control-Allow-Methods': 'GET, OPTIONS',\n  'Access-Control-Allow-Headers': 'Content-Type',\n}\n\nfunction json(data, status = 200) {\n  return new Response(JSON.stringify(data), {\n    status,\n    headers: {\n      ...corsHeaders,\n      'Content-Type': 'application\u002Fjson; charset=utf-8',\n    },\n  })\n}\n\nasync function fetchUser(username) {\n  const url = new URL(DUOLINGO_API)\n\n  url.searchParams.set('username', username)\n\n  const response = await fetch(url, {\n    headers: {\n      Accept: 'application\u002Fjson',\n    },\n  })\n\n  if (!response.ok) {\n    throw new Error(\n      `Duolingo API returned ${response.status}`,\n    )\n  }\n\n  const data = await response.json()\n\n  const users = Array.isArray(data.users)\n    ? data.users\n    : []\n\n  return users.find(\n    user =>\n      user.username?.toLowerCase() ===\n      username.toLowerCase(),\n  )\n}\n\nexport default {\n  async fetch(request, env) {\n    if (request.method === 'OPTIONS') {\n      return new Response(null, {\n        status: 204,\n        headers: corsHeaders,\n      })\n    }\n\n    if (request.method !== 'GET') {\n      return json(\n        {\n          error: 'method_not_allowed',\n        },\n        405,\n      )\n    }\n\n    const url = new URL(request.url)\n\n    if (url.pathname !== '\u002Fme') {\n      return json(\n        {\n          error: 'not_found',\n        },\n        404,\n      )\n    }\n\n    const username = env.USERNAME?.trim()\n\n    if (!username) {\n      return json(\n        {\n          error: 'missing_username_config',\n        },\n        500,\n      )\n    }\n\n    try {\n      const user = await fetchUser(username)\n\n      if (!user) {\n        return json(\n          {\n            error: 'user_not_found',\n          },\n          404,\n        )\n      }\n\n      return json({\n        id: user.id,\n        username: user.username,\n        name: user.name ?? null,\n        picture: user.picture ?? null,\n        streak: user.streak ?? 0,\n        totalXp: user.totalXp ?? 0,\n      })\n    }\n    catch {\n      return json(\n        {\n          error: 'upstream_error',\n        },\n        502,\n      )\n    }\n  },\n}\n","js",[34,135,136,153,160,166,181,196,209,222,228,233,268,299,307,317,328,341,347,356,361,366,387,406,411,437,442,465,474,487,492,499,504,527,541,565,571,577,582,605,610,636,650,659,664,679,688,710,725,731,736,741,752,774,799,818,831,845,853,859,864,885,894,900,913,919,927,933,938,943,965,970,992,1001,1006,1018,1023,1031,1036,1041,1046,1069,1074,1089,1098,1103,1115,1120,1128,1133,1138,1143,1151,1172,1177,1194,1204,1210,1223,1229,1237,1243,1249,1254,1265,1283,1299,1322,1343,1365,1386,1393,1398,1406,1415,1420,1432,1437,1445,1450,1455,1461],{"__ignoreMap":69},[137,138,141,145,149],"span",{"class":139,"line":140},"line",1,[137,142,144],{"class":143},"sDkzg","const",[137,146,148],{"class":147},"szT_X"," DUOLINGO_API ",[137,150,152],{"class":151},"siJSA","=\n",[137,154,156],{"class":139,"line":155},2,[137,157,159],{"class":158},"ssZzq","  'https:\u002F\u002Fwww.duolingo.com\u002F2017-06-30\u002Fusers'\n",[137,161,163],{"class":139,"line":162},3,[137,164,165],{"emptyLinePlaceholder":6},"\n",[137,167,169,171,174,177],{"class":139,"line":168},4,[137,170,144],{"class":143},[137,172,173],{"class":147}," corsHeaders ",[137,175,176],{"class":151},"=",[137,178,180],{"class":179},"sxk1D"," {\n",[137,182,184,187,190,193],{"class":139,"line":183},5,[137,185,186],{"class":158},"  'Access-Control-Allow-Origin'",[137,188,189],{"class":151},":",[137,191,192],{"class":158}," '*'",[137,194,195],{"class":179},",\n",[137,197,199,202,204,207],{"class":139,"line":198},6,[137,200,201],{"class":158},"  'Access-Control-Allow-Methods'",[137,203,189],{"class":151},[137,205,206],{"class":158}," 'GET, OPTIONS'",[137,208,195],{"class":179},[137,210,212,215,217,220],{"class":139,"line":211},7,[137,213,214],{"class":158},"  'Access-Control-Allow-Headers'",[137,216,189],{"class":151},[137,218,219],{"class":158}," 'Content-Type'",[137,221,195],{"class":179},[137,223,225],{"class":139,"line":224},8,[137,226,227],{"class":179},"}\n",[137,229,231],{"class":139,"line":230},9,[137,232,165],{"emptyLinePlaceholder":6},[137,234,236,239,243,246,250,253,256,259,263,266],{"class":139,"line":235},10,[137,237,238],{"class":143},"function",[137,240,242],{"class":241},"s3Fsb"," json",[137,244,245],{"class":179},"(",[137,247,249],{"class":248},"sYNyg","data",[137,251,252],{"class":179},",",[137,254,255],{"class":248}," status",[137,257,258],{"class":151}," =",[137,260,262],{"class":261},"s_wmW"," 200",[137,264,265],{"class":179},")",[137,267,180],{"class":179},[137,269,271,274,278,281,283,286,289,292,295,297],{"class":139,"line":270},11,[137,272,273],{"class":143},"  return",[137,275,277],{"class":276},"sNeR2"," new",[137,279,280],{"class":241}," Response",[137,282,245],{"class":147},[137,284,285],{"class":261},"JSON",[137,287,288],{"class":151},".",[137,290,291],{"class":241},"stringify",[137,293,294],{"class":147},"(data)",[137,296,252],{"class":179},[137,298,180],{"class":179},[137,300,302,305],{"class":139,"line":301},12,[137,303,304],{"class":147},"    status",[137,306,195],{"class":179},[137,308,310,313,315],{"class":139,"line":309},13,[137,311,312],{"class":147},"    headers",[137,314,189],{"class":151},[137,316,180],{"class":179},[137,318,320,323,326],{"class":139,"line":319},14,[137,321,322],{"class":151},"      ...",[137,324,325],{"class":147},"corsHeaders",[137,327,195],{"class":179},[137,329,331,334,336,339],{"class":139,"line":330},15,[137,332,333],{"class":158},"      'Content-Type'",[137,335,189],{"class":151},[137,337,338],{"class":158}," 'application\u002Fjson; charset=utf-8'",[137,340,195],{"class":179},[137,342,344],{"class":139,"line":343},16,[137,345,346],{"class":179},"    },\n",[137,348,350,353],{"class":139,"line":349},17,[137,351,352],{"class":179},"  }",[137,354,355],{"class":147},")\n",[137,357,359],{"class":139,"line":358},18,[137,360,227],{"class":179},[137,362,364],{"class":139,"line":363},19,[137,365,165],{"emptyLinePlaceholder":6},[137,367,369,372,375,378,380,383,385],{"class":139,"line":368},20,[137,370,371],{"class":143},"async",[137,373,374],{"class":143}," function",[137,376,377],{"class":241}," fetchUser",[137,379,245],{"class":179},[137,381,382],{"class":248},"username",[137,384,265],{"class":179},[137,386,180],{"class":179},[137,388,390,393,396,398,400,403],{"class":139,"line":389},21,[137,391,392],{"class":143},"  const",[137,394,395],{"class":147}," url ",[137,397,176],{"class":151},[137,399,277],{"class":276},[137,401,402],{"class":241}," URL",[137,404,405],{"class":147},"(DUOLINGO_API)\n",[137,407,409],{"class":139,"line":408},22,[137,410,165],{"emptyLinePlaceholder":6},[137,412,414,417,419,422,424,427,429,432,434],{"class":139,"line":413},23,[137,415,416],{"class":147},"  url",[137,418,288],{"class":151},[137,420,421],{"class":147},"searchParams",[137,423,288],{"class":151},[137,425,426],{"class":241},"set",[137,428,245],{"class":147},[137,430,431],{"class":158},"'username'",[137,433,252],{"class":179},[137,435,436],{"class":147}," username)\n",[137,438,440],{"class":139,"line":439},24,[137,441,165],{"emptyLinePlaceholder":6},[137,443,445,447,450,452,455,458,461,463],{"class":139,"line":444},25,[137,446,392],{"class":143},[137,448,449],{"class":147}," response ",[137,451,176],{"class":151},[137,453,454],{"class":143}," await",[137,456,457],{"class":241}," fetch",[137,459,460],{"class":147},"(url",[137,462,252],{"class":179},[137,464,180],{"class":179},[137,466,468,470,472],{"class":139,"line":467},26,[137,469,312],{"class":147},[137,471,189],{"class":151},[137,473,180],{"class":179},[137,475,477,480,482,485],{"class":139,"line":476},27,[137,478,479],{"class":147},"      Accept",[137,481,189],{"class":151},[137,483,484],{"class":158}," 'application\u002Fjson'",[137,486,195],{"class":179},[137,488,490],{"class":139,"line":489},28,[137,491,346],{"class":179},[137,493,495,497],{"class":139,"line":494},29,[137,496,352],{"class":179},[137,498,355],{"class":147},[137,500,502],{"class":139,"line":501},30,[137,503,165],{"emptyLinePlaceholder":6},[137,505,507,510,513,516,519,521,524],{"class":139,"line":506},31,[137,508,509],{"class":143},"  if",[137,511,512],{"class":147}," (",[137,514,515],{"class":151},"!",[137,517,518],{"class":147},"response",[137,520,288],{"class":151},[137,522,523],{"class":147},"ok) ",[137,525,526],{"class":179},"{\n",[137,528,530,533,535,538],{"class":139,"line":529},32,[137,531,532],{"class":143},"    throw",[137,534,277],{"class":276},[137,536,537],{"class":241}," Error",[137,539,540],{"class":147},"(\n",[137,542,544,547,550,552,554,557,560,563],{"class":139,"line":543},33,[137,545,546],{"class":158},"      `Duolingo API returned ",[137,548,549],{"class":179},"${",[137,551,518],{"class":147},[137,553,288],{"class":151},[137,555,556],{"class":147},"status",[137,558,559],{"class":179},"}",[137,561,562],{"class":158},"`",[137,564,195],{"class":179},[137,566,568],{"class":139,"line":567},34,[137,569,570],{"class":147},"    )\n",[137,572,574],{"class":139,"line":573},35,[137,575,576],{"class":179},"  }\n",[137,578,580],{"class":139,"line":579},36,[137,581,165],{"emptyLinePlaceholder":6},[137,583,585,587,590,592,594,597,599,602],{"class":139,"line":584},37,[137,586,392],{"class":143},[137,588,589],{"class":147}," data ",[137,591,176],{"class":151},[137,593,454],{"class":143},[137,595,596],{"class":147}," response",[137,598,288],{"class":151},[137,600,601],{"class":241},"json",[137,603,604],{"class":147},"()\n",[137,606,608],{"class":139,"line":607},38,[137,609,165],{"emptyLinePlaceholder":6},[137,611,613,615,618,620,623,625,628,631,633],{"class":139,"line":612},39,[137,614,392],{"class":143},[137,616,617],{"class":147}," users ",[137,619,176],{"class":151},[137,621,622],{"class":147}," Array",[137,624,288],{"class":151},[137,626,627],{"class":241},"isArray",[137,629,630],{"class":147},"(data",[137,632,288],{"class":151},[137,634,635],{"class":147},"users)\n",[137,637,639,642,645,647],{"class":139,"line":638},40,[137,640,641],{"class":151},"    ?",[137,643,644],{"class":147}," data",[137,646,288],{"class":151},[137,648,649],{"class":147},"users\n",[137,651,653,656],{"class":139,"line":652},41,[137,654,655],{"class":151},"    :",[137,657,658],{"class":147}," []\n",[137,660,662],{"class":139,"line":661},42,[137,663,165],{"emptyLinePlaceholder":6},[137,665,667,669,672,674,677],{"class":139,"line":666},43,[137,668,273],{"class":143},[137,670,671],{"class":147}," users",[137,673,288],{"class":151},[137,675,676],{"class":241},"find",[137,678,540],{"class":147},[137,680,682,685],{"class":139,"line":681},44,[137,683,684],{"class":248},"    user",[137,686,687],{"class":143}," =>\n",[137,689,691,694,696,698,701,704,707],{"class":139,"line":690},45,[137,692,693],{"class":147},"      user",[137,695,288],{"class":151},[137,697,382],{"class":147},[137,699,700],{"class":151},"?.",[137,702,703],{"class":241},"toLowerCase",[137,705,706],{"class":147},"() ",[137,708,709],{"class":151},"===\n",[137,711,713,716,718,720,723],{"class":139,"line":712},46,[137,714,715],{"class":147},"      username",[137,717,288],{"class":151},[137,719,703],{"class":241},[137,721,722],{"class":147},"()",[137,724,195],{"class":179},[137,726,728],{"class":139,"line":727},47,[137,729,730],{"class":147},"  )\n",[137,732,734],{"class":139,"line":733},48,[137,735,227],{"class":179},[137,737,739],{"class":139,"line":738},49,[137,740,165],{"emptyLinePlaceholder":6},[137,742,744,747,750],{"class":139,"line":743},50,[137,745,746],{"class":143},"export",[137,748,749],{"class":143}," default",[137,751,180],{"class":179},[137,753,755,758,760,762,765,767,770,772],{"class":139,"line":754},51,[137,756,757],{"class":143},"  async",[137,759,457],{"class":241},[137,761,245],{"class":179},[137,763,764],{"class":248},"request",[137,766,252],{"class":179},[137,768,769],{"class":248}," env",[137,771,265],{"class":179},[137,773,180],{"class":179},[137,775,777,780,783,785,788,791,794,797],{"class":139,"line":776},52,[137,778,779],{"class":143},"    if",[137,781,782],{"class":147}," (request",[137,784,288],{"class":151},[137,786,787],{"class":147},"method ",[137,789,790],{"class":151},"===",[137,792,793],{"class":158}," 'OPTIONS'",[137,795,796],{"class":147},") ",[137,798,526],{"class":179},[137,800,802,805,807,809,811,814,816],{"class":139,"line":801},53,[137,803,804],{"class":143},"      return",[137,806,277],{"class":276},[137,808,280],{"class":241},[137,810,245],{"class":147},[137,812,813],{"class":143},"null",[137,815,252],{"class":179},[137,817,180],{"class":179},[137,819,821,824,826,829],{"class":139,"line":820},54,[137,822,823],{"class":147},"        status",[137,825,189],{"class":151},[137,827,828],{"class":261}," 204",[137,830,195],{"class":179},[137,832,834,837,839,843],{"class":139,"line":833},55,[137,835,836],{"class":147},"        headers",[137,838,189],{"class":151},[137,840,842],{"class":841},"sAKOx"," corsHeaders",[137,844,195],{"class":179},[137,846,848,851],{"class":139,"line":847},56,[137,849,850],{"class":179},"      }",[137,852,355],{"class":147},[137,854,856],{"class":139,"line":855},57,[137,857,858],{"class":179},"    }\n",[137,860,862],{"class":139,"line":861},58,[137,863,165],{"emptyLinePlaceholder":6},[137,865,867,869,871,873,875,878,881,883],{"class":139,"line":866},59,[137,868,779],{"class":143},[137,870,782],{"class":147},[137,872,288],{"class":151},[137,874,787],{"class":147},[137,876,877],{"class":151},"!==",[137,879,880],{"class":158}," 'GET'",[137,882,796],{"class":147},[137,884,526],{"class":179},[137,886,888,890,892],{"class":139,"line":887},60,[137,889,804],{"class":143},[137,891,242],{"class":241},[137,893,540],{"class":147},[137,895,897],{"class":139,"line":896},61,[137,898,899],{"class":179},"        {\n",[137,901,903,906,908,911],{"class":139,"line":902},62,[137,904,905],{"class":147},"          error",[137,907,189],{"class":151},[137,909,910],{"class":158}," 'method_not_allowed'",[137,912,195],{"class":179},[137,914,916],{"class":139,"line":915},63,[137,917,918],{"class":179},"        },\n",[137,920,922,925],{"class":139,"line":921},64,[137,923,924],{"class":261},"        405",[137,926,195],{"class":179},[137,928,930],{"class":139,"line":929},65,[137,931,932],{"class":147},"      )\n",[137,934,936],{"class":139,"line":935},66,[137,937,858],{"class":179},[137,939,941],{"class":139,"line":940},67,[137,942,165],{"emptyLinePlaceholder":6},[137,944,946,949,951,953,955,957,960,962],{"class":139,"line":945},68,[137,947,948],{"class":143},"    const",[137,950,395],{"class":147},[137,952,176],{"class":151},[137,954,277],{"class":276},[137,956,402],{"class":241},[137,958,959],{"class":147},"(request",[137,961,288],{"class":151},[137,963,964],{"class":147},"url)\n",[137,966,968],{"class":139,"line":967},69,[137,969,165],{"emptyLinePlaceholder":6},[137,971,973,975,978,980,983,985,988,990],{"class":139,"line":972},70,[137,974,779],{"class":143},[137,976,977],{"class":147}," (url",[137,979,288],{"class":151},[137,981,982],{"class":147},"pathname ",[137,984,877],{"class":151},[137,986,987],{"class":158}," '\u002Fme'",[137,989,796],{"class":147},[137,991,526],{"class":179},[137,993,995,997,999],{"class":139,"line":994},71,[137,996,804],{"class":143},[137,998,242],{"class":241},[137,1000,540],{"class":147},[137,1002,1004],{"class":139,"line":1003},72,[137,1005,899],{"class":179},[137,1007,1009,1011,1013,1016],{"class":139,"line":1008},73,[137,1010,905],{"class":147},[137,1012,189],{"class":151},[137,1014,1015],{"class":158}," 'not_found'",[137,1017,195],{"class":179},[137,1019,1021],{"class":139,"line":1020},74,[137,1022,918],{"class":179},[137,1024,1026,1029],{"class":139,"line":1025},75,[137,1027,1028],{"class":261},"        404",[137,1030,195],{"class":179},[137,1032,1034],{"class":139,"line":1033},76,[137,1035,932],{"class":147},[137,1037,1039],{"class":139,"line":1038},77,[137,1040,858],{"class":179},[137,1042,1044],{"class":139,"line":1043},78,[137,1045,165],{"emptyLinePlaceholder":6},[137,1047,1049,1051,1054,1056,1058,1060,1062,1064,1067],{"class":139,"line":1048},79,[137,1050,948],{"class":143},[137,1052,1053],{"class":147}," username ",[137,1055,176],{"class":151},[137,1057,769],{"class":147},[137,1059,288],{"class":151},[137,1061,36],{"class":261},[137,1063,700],{"class":151},[137,1065,1066],{"class":241},"trim",[137,1068,604],{"class":147},[137,1070,1072],{"class":139,"line":1071},80,[137,1073,165],{"emptyLinePlaceholder":6},[137,1075,1077,1079,1081,1083,1085,1087],{"class":139,"line":1076},81,[137,1078,779],{"class":143},[137,1080,512],{"class":147},[137,1082,515],{"class":151},[137,1084,382],{"class":841},[137,1086,796],{"class":147},[137,1088,526],{"class":179},[137,1090,1092,1094,1096],{"class":139,"line":1091},82,[137,1093,804],{"class":143},[137,1095,242],{"class":241},[137,1097,540],{"class":147},[137,1099,1101],{"class":139,"line":1100},83,[137,1102,899],{"class":179},[137,1104,1106,1108,1110,1113],{"class":139,"line":1105},84,[137,1107,905],{"class":147},[137,1109,189],{"class":151},[137,1111,1112],{"class":158}," 'missing_username_config'",[137,1114,195],{"class":179},[137,1116,1118],{"class":139,"line":1117},85,[137,1119,918],{"class":179},[137,1121,1123,1126],{"class":139,"line":1122},86,[137,1124,1125],{"class":261},"        500",[137,1127,195],{"class":179},[137,1129,1131],{"class":139,"line":1130},87,[137,1132,932],{"class":147},[137,1134,1136],{"class":139,"line":1135},88,[137,1137,858],{"class":179},[137,1139,1141],{"class":139,"line":1140},89,[137,1142,165],{"emptyLinePlaceholder":6},[137,1144,1146,1149],{"class":139,"line":1145},90,[137,1147,1148],{"class":143},"    try",[137,1150,180],{"class":179},[137,1152,1154,1157,1160,1162,1164,1166,1168,1170],{"class":139,"line":1153},91,[137,1155,1156],{"class":143},"      const",[137,1158,1159],{"class":147}," user ",[137,1161,176],{"class":151},[137,1163,454],{"class":143},[137,1165,377],{"class":241},[137,1167,245],{"class":147},[137,1169,382],{"class":841},[137,1171,355],{"class":147},[137,1173,1175],{"class":139,"line":1174},92,[137,1176,165],{"emptyLinePlaceholder":6},[137,1178,1180,1183,1185,1187,1190,1192],{"class":139,"line":1179},93,[137,1181,1182],{"class":143},"      if",[137,1184,512],{"class":147},[137,1186,515],{"class":151},[137,1188,1189],{"class":841},"user",[137,1191,796],{"class":147},[137,1193,526],{"class":179},[137,1195,1197,1200,1202],{"class":139,"line":1196},94,[137,1198,1199],{"class":143},"        return",[137,1201,242],{"class":241},[137,1203,540],{"class":147},[137,1205,1207],{"class":139,"line":1206},95,[137,1208,1209],{"class":179},"          {\n",[137,1211,1213,1216,1218,1221],{"class":139,"line":1212},96,[137,1214,1215],{"class":147},"            error",[137,1217,189],{"class":151},[137,1219,1220],{"class":158}," 'user_not_found'",[137,1222,195],{"class":179},[137,1224,1226],{"class":139,"line":1225},97,[137,1227,1228],{"class":179},"          },\n",[137,1230,1232,1235],{"class":139,"line":1231},98,[137,1233,1234],{"class":261},"          404",[137,1236,195],{"class":179},[137,1238,1240],{"class":139,"line":1239},99,[137,1241,1242],{"class":147},"        )\n",[137,1244,1246],{"class":139,"line":1245},100,[137,1247,1248],{"class":179},"      }\n",[137,1250,1252],{"class":139,"line":1251},101,[137,1253,165],{"emptyLinePlaceholder":6},[137,1255,1257,1259,1261,1263],{"class":139,"line":1256},102,[137,1258,804],{"class":143},[137,1260,242],{"class":241},[137,1262,245],{"class":147},[137,1264,526],{"class":179},[137,1266,1268,1271,1273,1276,1278,1281],{"class":139,"line":1267},103,[137,1269,1270],{"class":147},"        id",[137,1272,189],{"class":151},[137,1274,1275],{"class":147}," user",[137,1277,288],{"class":151},[137,1279,1280],{"class":147},"id",[137,1282,195],{"class":179},[137,1284,1286,1289,1291,1293,1295,1297],{"class":139,"line":1285},104,[137,1287,1288],{"class":147},"        username",[137,1290,189],{"class":151},[137,1292,1275],{"class":147},[137,1294,288],{"class":151},[137,1296,382],{"class":147},[137,1298,195],{"class":179},[137,1300,1302,1305,1307,1309,1311,1314,1317,1320],{"class":139,"line":1301},105,[137,1303,1304],{"class":147},"        name",[137,1306,189],{"class":151},[137,1308,1275],{"class":147},[137,1310,288],{"class":151},[137,1312,1313],{"class":147},"name ",[137,1315,1316],{"class":151},"??",[137,1318,1319],{"class":143}," null",[137,1321,195],{"class":179},[137,1323,1325,1328,1330,1332,1334,1337,1339,1341],{"class":139,"line":1324},106,[137,1326,1327],{"class":147},"        picture",[137,1329,189],{"class":151},[137,1331,1275],{"class":147},[137,1333,288],{"class":151},[137,1335,1336],{"class":147},"picture ",[137,1338,1316],{"class":151},[137,1340,1319],{"class":143},[137,1342,195],{"class":179},[137,1344,1346,1349,1351,1353,1355,1358,1360,1363],{"class":139,"line":1345},107,[137,1347,1348],{"class":147},"        streak",[137,1350,189],{"class":151},[137,1352,1275],{"class":147},[137,1354,288],{"class":151},[137,1356,1357],{"class":147},"streak ",[137,1359,1316],{"class":151},[137,1361,1362],{"class":261}," 0",[137,1364,195],{"class":179},[137,1366,1368,1371,1373,1375,1377,1380,1382,1384],{"class":139,"line":1367},108,[137,1369,1370],{"class":147},"        totalXp",[137,1372,189],{"class":151},[137,1374,1275],{"class":147},[137,1376,288],{"class":151},[137,1378,1379],{"class":147},"totalXp ",[137,1381,1316],{"class":151},[137,1383,1362],{"class":261},[137,1385,195],{"class":179},[137,1387,1389,1391],{"class":139,"line":1388},109,[137,1390,850],{"class":179},[137,1392,355],{"class":147},[137,1394,1396],{"class":139,"line":1395},110,[137,1397,858],{"class":179},[137,1399,1401,1404],{"class":139,"line":1400},111,[137,1402,1403],{"class":143},"    catch",[137,1405,180],{"class":179},[137,1407,1409,1411,1413],{"class":139,"line":1408},112,[137,1410,804],{"class":143},[137,1412,242],{"class":241},[137,1414,540],{"class":147},[137,1416,1418],{"class":139,"line":1417},113,[137,1419,899],{"class":179},[137,1421,1423,1425,1427,1430],{"class":139,"line":1422},114,[137,1424,905],{"class":147},[137,1426,189],{"class":151},[137,1428,1429],{"class":158}," 'upstream_error'",[137,1431,195],{"class":179},[137,1433,1435],{"class":139,"line":1434},115,[137,1436,918],{"class":179},[137,1438,1440,1443],{"class":139,"line":1439},116,[137,1441,1442],{"class":261},"        502",[137,1444,195],{"class":179},[137,1446,1448],{"class":139,"line":1447},117,[137,1449,932],{"class":147},[137,1451,1453],{"class":139,"line":1452},118,[137,1454,858],{"class":179},[137,1456,1458],{"class":139,"line":1457},119,[137,1459,1460],{"class":179},"  },\n",[137,1462,1464],{"class":139,"line":1463},120,[137,1465,227],{"class":179},[17,1467,1468],{},"部署后访问：",[63,1470,1473],{"className":1471,"code":1472,"language":68,"meta":69},[66],"https:\u002F\u002F你的-worker地址\u002Fme\n",[34,1474,1472],{"__ignoreMap":69},[17,1476,1477],{},"应该能拿到类似的数据：",[63,1479,1482],{"className":1480,"code":1481,"language":601,"meta":69,"style":69},"language-json shiki shiki-themes catppuccin-mocha catppuccin-latte","{\n  \"id\": 123456,\n  \"username\": \"example\",\n  \"name\": \"Example\",\n  \"picture\": \"\u002F\u002Fsimg-ssl.duolingo.com\u002Favatar\u002Fdefault_2\u002Fmedium\",\n  \"streak\": 120,\n  \"totalXp\": 32640\n}\n",[34,1483,1484,1488,1506,1521,1537,1553,1569,1583],{"__ignoreMap":69},[137,1485,1486],{"class":139,"line":140},[137,1487,526],{"class":179},[137,1489,1490,1493,1496,1499,1501,1504],{"class":139,"line":155},[137,1491,1492],{"class":179},"  \"",[137,1494,1280],{"class":1495},"sZBvu",[137,1497,1498],{"class":179},"\"",[137,1500,189],{"class":179},[137,1502,1503],{"class":261}," 123456",[137,1505,195],{"class":179},[137,1507,1508,1510,1512,1514,1516,1519],{"class":139,"line":162},[137,1509,1492],{"class":179},[137,1511,382],{"class":1495},[137,1513,1498],{"class":179},[137,1515,189],{"class":179},[137,1517,1518],{"class":158}," \"example\"",[137,1520,195],{"class":179},[137,1522,1523,1525,1528,1530,1532,1535],{"class":139,"line":168},[137,1524,1492],{"class":179},[137,1526,1527],{"class":1495},"name",[137,1529,1498],{"class":179},[137,1531,189],{"class":179},[137,1533,1534],{"class":158}," \"Example\"",[137,1536,195],{"class":179},[137,1538,1539,1541,1544,1546,1548,1551],{"class":139,"line":183},[137,1540,1492],{"class":179},[137,1542,1543],{"class":1495},"picture",[137,1545,1498],{"class":179},[137,1547,189],{"class":179},[137,1549,1550],{"class":158}," \"\u002F\u002Fsimg-ssl.duolingo.com\u002Favatar\u002Fdefault_2\u002Fmedium\"",[137,1552,195],{"class":179},[137,1554,1555,1557,1560,1562,1564,1567],{"class":139,"line":198},[137,1556,1492],{"class":179},[137,1558,1559],{"class":1495},"streak",[137,1561,1498],{"class":179},[137,1563,189],{"class":179},[137,1565,1566],{"class":261}," 120",[137,1568,195],{"class":179},[137,1570,1571,1573,1576,1578,1580],{"class":139,"line":211},[137,1572,1492],{"class":179},[137,1574,1575],{"class":1495},"totalXp",[137,1577,1498],{"class":179},[137,1579,189],{"class":179},[137,1581,1582],{"class":261}," 32640\n",[137,1584,1585],{"class":139,"line":224},[137,1586,227],{"class":179},[17,1588,1589,1590,1593],{},"这里没有使用 ",[34,1591,1592],{},"users[0]"," 作为兜底。",[17,1595,1596],{},"Duolingo 的接口可能返回相似用户名。配置的用户不存在时，直接返回找不到，比误返回另一个人的信息更可靠。",[76,1598],{},[79,1600,1601],{"id":1601},"整理返回数据",[17,1603,1604],{},"直接把 Duolingo 的原始用户对象返回给前端并不合适。",[17,1606,1607],{},"原始数据字段很多，结构也可能发生变化。接口应该只返回页面真正需要的内容。",[17,1609,1610],{},"先处理头像地址：",[63,1612,1614],{"className":131,"code":1613,"language":133,"meta":69,"style":69},"function normalizePicture(picture) {\n  if (!picture) {\n    return null\n  }\n\n  if (picture.startsWith('\u002F\u002F')) {\n    return `https:${picture}`\n  }\n\n  return picture\n}\n",[34,1615,1616,1631,1644,1652,1656,1660,1682,1698,1702,1706,1713],{"__ignoreMap":69},[137,1617,1618,1620,1623,1625,1627,1629],{"class":139,"line":140},[137,1619,238],{"class":143},[137,1621,1622],{"class":241}," normalizePicture",[137,1624,245],{"class":179},[137,1626,1543],{"class":248},[137,1628,265],{"class":179},[137,1630,180],{"class":179},[137,1632,1633,1635,1637,1639,1642],{"class":139,"line":155},[137,1634,509],{"class":143},[137,1636,512],{"class":147},[137,1638,515],{"class":151},[137,1640,1641],{"class":147},"picture) ",[137,1643,526],{"class":179},[137,1645,1646,1649],{"class":139,"line":162},[137,1647,1648],{"class":143},"    return",[137,1650,1651],{"class":143}," null\n",[137,1653,1654],{"class":139,"line":168},[137,1655,576],{"class":179},[137,1657,1658],{"class":139,"line":183},[137,1659,165],{"emptyLinePlaceholder":6},[137,1661,1662,1664,1667,1669,1672,1674,1677,1680],{"class":139,"line":198},[137,1663,509],{"class":143},[137,1665,1666],{"class":147}," (picture",[137,1668,288],{"class":151},[137,1670,1671],{"class":241},"startsWith",[137,1673,245],{"class":147},[137,1675,1676],{"class":158},"'\u002F\u002F'",[137,1678,1679],{"class":147},")) ",[137,1681,526],{"class":179},[137,1683,1684,1686,1689,1691,1693,1695],{"class":139,"line":211},[137,1685,1648],{"class":143},[137,1687,1688],{"class":158}," `https:",[137,1690,549],{"class":179},[137,1692,1543],{"class":147},[137,1694,559],{"class":179},[137,1696,1697],{"class":158},"`\n",[137,1699,1700],{"class":139,"line":224},[137,1701,576],{"class":179},[137,1703,1704],{"class":139,"line":230},[137,1705,165],{"emptyLinePlaceholder":6},[137,1707,1708,1710],{"class":139,"line":235},[137,1709,273],{"class":143},[137,1711,1712],{"class":147}," picture\n",[137,1714,1715],{"class":139,"line":270},[137,1716,227],{"class":179},[17,1718,1719],{},"Duolingo 的头像地址有时是这种格式：",[63,1721,1724],{"className":1722,"code":1723,"language":68,"meta":69},[66],"\u002F\u002Fsimg-ssl.duolingo.com\u002F...\n",[34,1725,1723],{"__ignoreMap":69},[17,1727,1728],{},"浏览器可以识别这种协议相对地址，但 API 返回完整的 HTTPS 地址更方便使用。",[17,1730,1731],{},"再整理课程信息：",[63,1733,1735],{"className":131,"code":1734,"language":133,"meta":69,"style":69},"function normalizeCourse(course) {\n  if (!course) {\n    return null\n  }\n\n  return {\n    id: course.id ?? null,\n    title: course.title ?? null,\n    fromLanguage: course.fromLanguage ?? null,\n    learningLanguage: course.learningLanguage ?? null,\n    xp: course.xp ?? 0,\n  }\n}\n",[34,1736,1737,1753,1766,1772,1776,1780,1786,1807,1827,1847,1867,1887,1891],{"__ignoreMap":69},[137,1738,1739,1741,1744,1746,1749,1751],{"class":139,"line":140},[137,1740,238],{"class":143},[137,1742,1743],{"class":241}," normalizeCourse",[137,1745,245],{"class":179},[137,1747,1748],{"class":248},"course",[137,1750,265],{"class":179},[137,1752,180],{"class":179},[137,1754,1755,1757,1759,1761,1764],{"class":139,"line":155},[137,1756,509],{"class":143},[137,1758,512],{"class":147},[137,1760,515],{"class":151},[137,1762,1763],{"class":147},"course) ",[137,1765,526],{"class":179},[137,1767,1768,1770],{"class":139,"line":162},[137,1769,1648],{"class":143},[137,1771,1651],{"class":143},[137,1773,1774],{"class":139,"line":168},[137,1775,576],{"class":179},[137,1777,1778],{"class":139,"line":183},[137,1779,165],{"emptyLinePlaceholder":6},[137,1781,1782,1784],{"class":139,"line":198},[137,1783,273],{"class":143},[137,1785,180],{"class":179},[137,1787,1788,1791,1793,1796,1798,1801,1803,1805],{"class":139,"line":211},[137,1789,1790],{"class":147},"    id",[137,1792,189],{"class":151},[137,1794,1795],{"class":147}," course",[137,1797,288],{"class":151},[137,1799,1800],{"class":147},"id ",[137,1802,1316],{"class":151},[137,1804,1319],{"class":143},[137,1806,195],{"class":179},[137,1808,1809,1812,1814,1816,1818,1821,1823,1825],{"class":139,"line":224},[137,1810,1811],{"class":147},"    title",[137,1813,189],{"class":151},[137,1815,1795],{"class":147},[137,1817,288],{"class":151},[137,1819,1820],{"class":147},"title ",[137,1822,1316],{"class":151},[137,1824,1319],{"class":143},[137,1826,195],{"class":179},[137,1828,1829,1832,1834,1836,1838,1841,1843,1845],{"class":139,"line":230},[137,1830,1831],{"class":147},"    fromLanguage",[137,1833,189],{"class":151},[137,1835,1795],{"class":147},[137,1837,288],{"class":151},[137,1839,1840],{"class":147},"fromLanguage ",[137,1842,1316],{"class":151},[137,1844,1319],{"class":143},[137,1846,195],{"class":179},[137,1848,1849,1852,1854,1856,1858,1861,1863,1865],{"class":139,"line":235},[137,1850,1851],{"class":147},"    learningLanguage",[137,1853,189],{"class":151},[137,1855,1795],{"class":147},[137,1857,288],{"class":151},[137,1859,1860],{"class":147},"learningLanguage ",[137,1862,1316],{"class":151},[137,1864,1319],{"class":143},[137,1866,195],{"class":179},[137,1868,1869,1872,1874,1876,1878,1881,1883,1885],{"class":139,"line":270},[137,1870,1871],{"class":147},"    xp",[137,1873,189],{"class":151},[137,1875,1795],{"class":147},[137,1877,288],{"class":151},[137,1879,1880],{"class":147},"xp ",[137,1882,1316],{"class":151},[137,1884,1362],{"class":261},[137,1886,195],{"class":179},[137,1888,1889],{"class":139,"line":301},[137,1890,576],{"class":179},[137,1892,1893],{"class":139,"line":309},[137,1894,227],{"class":179},[17,1896,1897,1898,1901],{},"当前课程不能只看课程数组的第一项。优先使用 ",[34,1899,1900],{},"currentCourseId","，找不到时再根据正在学习的语言判断：",[63,1903,1905],{"className":131,"code":1904,"language":133,"meta":69,"style":69},"function getCurrentCourse(user) {\n  const courses = Array.isArray(user.courses)\n    ? user.courses\n    : []\n\n  return (\n    courses.find(\n      course =>\n        course.id === user.currentCourseId,\n    ) ??\n    courses.find(\n      course =>\n        course.learningLanguage ===\n        user.learningLanguage,\n    ) ??\n    null\n  )\n}\n",[34,1906,1907,1922,1945,1956,1962,1966,1973,1984,1991,2010,2018,2028,2034,2044,2056,2062,2067,2071],{"__ignoreMap":69},[137,1908,1909,1911,1914,1916,1918,1920],{"class":139,"line":140},[137,1910,238],{"class":143},[137,1912,1913],{"class":241}," getCurrentCourse",[137,1915,245],{"class":179},[137,1917,1189],{"class":248},[137,1919,265],{"class":179},[137,1921,180],{"class":179},[137,1923,1924,1926,1929,1931,1933,1935,1937,1940,1942],{"class":139,"line":155},[137,1925,392],{"class":143},[137,1927,1928],{"class":147}," courses ",[137,1930,176],{"class":151},[137,1932,622],{"class":147},[137,1934,288],{"class":151},[137,1936,627],{"class":241},[137,1938,1939],{"class":147},"(user",[137,1941,288],{"class":151},[137,1943,1944],{"class":147},"courses)\n",[137,1946,1947,1949,1951,1953],{"class":139,"line":162},[137,1948,641],{"class":151},[137,1950,1275],{"class":147},[137,1952,288],{"class":151},[137,1954,1955],{"class":147},"courses\n",[137,1957,1958,1960],{"class":139,"line":168},[137,1959,655],{"class":151},[137,1961,658],{"class":147},[137,1963,1964],{"class":139,"line":183},[137,1965,165],{"emptyLinePlaceholder":6},[137,1967,1968,1970],{"class":139,"line":198},[137,1969,273],{"class":143},[137,1971,1972],{"class":147}," (\n",[137,1974,1975,1978,1980,1982],{"class":139,"line":211},[137,1976,1977],{"class":147},"    courses",[137,1979,288],{"class":151},[137,1981,676],{"class":241},[137,1983,540],{"class":147},[137,1985,1986,1989],{"class":139,"line":224},[137,1987,1988],{"class":248},"      course",[137,1990,687],{"class":143},[137,1992,1993,1996,1998,2000,2002,2004,2006,2008],{"class":139,"line":230},[137,1994,1995],{"class":147},"        course",[137,1997,288],{"class":151},[137,1999,1800],{"class":147},[137,2001,790],{"class":151},[137,2003,1275],{"class":147},[137,2005,288],{"class":151},[137,2007,1900],{"class":147},[137,2009,195],{"class":179},[137,2011,2012,2015],{"class":139,"line":235},[137,2013,2014],{"class":147},"    ) ",[137,2016,2017],{"class":151},"??\n",[137,2019,2020,2022,2024,2026],{"class":139,"line":270},[137,2021,1977],{"class":147},[137,2023,288],{"class":151},[137,2025,676],{"class":241},[137,2027,540],{"class":147},[137,2029,2030,2032],{"class":139,"line":301},[137,2031,1988],{"class":248},[137,2033,687],{"class":143},[137,2035,2036,2038,2040,2042],{"class":139,"line":309},[137,2037,1995],{"class":147},[137,2039,288],{"class":151},[137,2041,1860],{"class":147},[137,2043,709],{"class":151},[137,2045,2046,2049,2051,2054],{"class":139,"line":319},[137,2047,2048],{"class":147},"        user",[137,2050,288],{"class":151},[137,2052,2053],{"class":147},"learningLanguage",[137,2055,195],{"class":179},[137,2057,2058,2060],{"class":139,"line":330},[137,2059,2014],{"class":147},[137,2061,2017],{"class":151},[137,2063,2064],{"class":139,"line":343},[137,2065,2066],{"class":143},"    null\n",[137,2068,2069],{"class":139,"line":349},[137,2070,730],{"class":147},[137,2072,2073],{"class":139,"line":358},[137,2074,227],{"class":179},[17,2076,2077],{},"这样可以把原始数据统一整理成相对稳定的接口格式。",[76,2079],{},[79,2081,2082],{"id":2082},"增加搜索和详情接口",[17,2084,2085,2086,2089],{},"固定用户使用 ",[34,2087,2088],{},"\u002Fme","，另外再增加两个接口：",[63,2091,2094],{"className":2092,"code":2093,"language":68,"meta":69},[66],"GET \u002Fsearch?username=用户名\nGET \u002Fdetail?username=用户名\n",[34,2095,2093],{"__ignoreMap":69},[17,2097,2098],{},"它们的职责不同：",[27,2100,2101,2107,2113],{},[30,2102,2103,2106],{},[34,2104,2105],{},"\u002Fsearch"," 返回搜索结果列表和简略信息",[30,2108,2109,2112],{},[34,2110,2111],{},"\u002Fdetail"," 只返回完全匹配的用户和详细信息",[30,2114,2115,2117],{},[34,2116,2088],{}," 返回环境变量中配置的固定用户",[105,2119,2120],{"id":2120},"简略用户信息",[63,2122,2124],{"className":131,"code":2123,"language":133,"meta":69,"style":69},"function summarizeUser(user) {\n  return {\n    id: user.id ?? null,\n    username: user.username ?? null,\n    name: user.name ?? null,\n    picture: normalizePicture(user.picture),\n\n    streak:\n      user.streakData?.currentStreak?.length ??\n      user.streak ??\n      0,\n\n    longestStreak:\n      user.streakData?.longestStreak?.length ??\n      user.longestStreak ??\n      0,\n\n    totalXp: user.totalXp ?? 0,\n\n    currentCourse: normalizeCourse(\n      getCurrentCourse(user),\n    ),\n  }\n}\n",[34,2125,2126,2141,2147,2165,2185,2204,2222,2226,2234,2255,2265,2272,2276,2283,2302,2313,2319,2323,2342,2346,2357,2367,2374,2378],{"__ignoreMap":69},[137,2127,2128,2130,2133,2135,2137,2139],{"class":139,"line":140},[137,2129,238],{"class":143},[137,2131,2132],{"class":241}," summarizeUser",[137,2134,245],{"class":179},[137,2136,1189],{"class":248},[137,2138,265],{"class":179},[137,2140,180],{"class":179},[137,2142,2143,2145],{"class":139,"line":155},[137,2144,273],{"class":143},[137,2146,180],{"class":179},[137,2148,2149,2151,2153,2155,2157,2159,2161,2163],{"class":139,"line":162},[137,2150,1790],{"class":147},[137,2152,189],{"class":151},[137,2154,1275],{"class":147},[137,2156,288],{"class":151},[137,2158,1800],{"class":147},[137,2160,1316],{"class":151},[137,2162,1319],{"class":143},[137,2164,195],{"class":179},[137,2166,2167,2170,2172,2174,2176,2179,2181,2183],{"class":139,"line":168},[137,2168,2169],{"class":147},"    username",[137,2171,189],{"class":151},[137,2173,1275],{"class":147},[137,2175,288],{"class":151},[137,2177,2178],{"class":147},"username ",[137,2180,1316],{"class":151},[137,2182,1319],{"class":143},[137,2184,195],{"class":179},[137,2186,2187,2190,2192,2194,2196,2198,2200,2202],{"class":139,"line":183},[137,2188,2189],{"class":147},"    name",[137,2191,189],{"class":151},[137,2193,1275],{"class":147},[137,2195,288],{"class":151},[137,2197,1313],{"class":147},[137,2199,1316],{"class":151},[137,2201,1319],{"class":143},[137,2203,195],{"class":179},[137,2205,2206,2209,2211,2213,2215,2217,2220],{"class":139,"line":198},[137,2207,2208],{"class":147},"    picture",[137,2210,189],{"class":151},[137,2212,1622],{"class":241},[137,2214,1939],{"class":147},[137,2216,288],{"class":151},[137,2218,2219],{"class":147},"picture)",[137,2221,195],{"class":179},[137,2223,2224],{"class":139,"line":211},[137,2225,165],{"emptyLinePlaceholder":6},[137,2227,2228,2231],{"class":139,"line":224},[137,2229,2230],{"class":147},"    streak",[137,2232,2233],{"class":151},":\n",[137,2235,2236,2238,2240,2243,2245,2248,2250,2253],{"class":139,"line":230},[137,2237,693],{"class":147},[137,2239,288],{"class":151},[137,2241,2242],{"class":147},"streakData",[137,2244,700],{"class":151},[137,2246,2247],{"class":147},"currentStreak",[137,2249,700],{"class":151},[137,2251,2252],{"class":147},"length ",[137,2254,2017],{"class":151},[137,2256,2257,2259,2261,2263],{"class":139,"line":235},[137,2258,693],{"class":147},[137,2260,288],{"class":151},[137,2262,1357],{"class":147},[137,2264,2017],{"class":151},[137,2266,2267,2270],{"class":139,"line":270},[137,2268,2269],{"class":261},"      0",[137,2271,195],{"class":179},[137,2273,2274],{"class":139,"line":301},[137,2275,165],{"emptyLinePlaceholder":6},[137,2277,2278,2281],{"class":139,"line":309},[137,2279,2280],{"class":147},"    longestStreak",[137,2282,2233],{"class":151},[137,2284,2285,2287,2289,2291,2293,2296,2298,2300],{"class":139,"line":319},[137,2286,693],{"class":147},[137,2288,288],{"class":151},[137,2290,2242],{"class":147},[137,2292,700],{"class":151},[137,2294,2295],{"class":147},"longestStreak",[137,2297,700],{"class":151},[137,2299,2252],{"class":147},[137,2301,2017],{"class":151},[137,2303,2304,2306,2308,2311],{"class":139,"line":330},[137,2305,693],{"class":147},[137,2307,288],{"class":151},[137,2309,2310],{"class":147},"longestStreak ",[137,2312,2017],{"class":151},[137,2314,2315,2317],{"class":139,"line":343},[137,2316,2269],{"class":261},[137,2318,195],{"class":179},[137,2320,2321],{"class":139,"line":349},[137,2322,165],{"emptyLinePlaceholder":6},[137,2324,2325,2328,2330,2332,2334,2336,2338,2340],{"class":139,"line":358},[137,2326,2327],{"class":147},"    totalXp",[137,2329,189],{"class":151},[137,2331,1275],{"class":147},[137,2333,288],{"class":151},[137,2335,1379],{"class":147},[137,2337,1316],{"class":151},[137,2339,1362],{"class":261},[137,2341,195],{"class":179},[137,2343,2344],{"class":139,"line":363},[137,2345,165],{"emptyLinePlaceholder":6},[137,2347,2348,2351,2353,2355],{"class":139,"line":368},[137,2349,2350],{"class":147},"    currentCourse",[137,2352,189],{"class":151},[137,2354,1743],{"class":241},[137,2356,540],{"class":147},[137,2358,2359,2362,2365],{"class":139,"line":389},[137,2360,2361],{"class":241},"      getCurrentCourse",[137,2363,2364],{"class":147},"(user)",[137,2366,195],{"class":179},[137,2368,2369,2372],{"class":139,"line":408},[137,2370,2371],{"class":147},"    )",[137,2373,195],{"class":179},[137,2375,2376],{"class":139,"line":413},[137,2377,576],{"class":179},[137,2379,2380],{"class":139,"line":439},[137,2381,227],{"class":179},[105,2383,2384],{"id":2384},"详细用户信息",[63,2386,2388],{"className":131,"code":2387,"language":133,"meta":69,"style":69},"function detailUser(user) {\n  const courses = Array.isArray(user.courses)\n    ? user.courses\n        .map(normalizeCourse)\n        .filter(Boolean)\n    : []\n\n  return {\n    id: user.id ?? null,\n    username: user.username ?? null,\n    name: user.name ?? null,\n    picture: normalizePicture(user.picture),\n\n    account: {\n      createdAt: Number.isFinite(user.creationDate)\n        ? new Date(\n            user.creationDate * 1000,\n          ).toISOString()\n        : null,\n      hasPlus: Boolean(user.hasPlus),\n    },\n\n    xp: {\n      total: user.totalXp ?? 0,\n      weekly: user.weeklyXp ?? 0,\n      monthly: user.monthlyXp ?? 0,\n    },\n\n    streak: getStreakStatus(user),\n\n    currentCourse: normalizeCourse(\n      getCurrentCourse(user),\n    ),\n\n    courses,\n  }\n}\n",[34,2389,2390,2405,2425,2435,2446,2456,2462,2466,2472,2490,2508,2526,2542,2546,2555,2577,2589,2607,2619,2628,2647,2651,2655,2663,2682,2702,2722,2726,2730,2743,2747,2757,2765,2771,2775,2781,2785],{"__ignoreMap":69},[137,2391,2392,2394,2397,2399,2401,2403],{"class":139,"line":140},[137,2393,238],{"class":143},[137,2395,2396],{"class":241}," detailUser",[137,2398,245],{"class":179},[137,2400,1189],{"class":248},[137,2402,265],{"class":179},[137,2404,180],{"class":179},[137,2406,2407,2409,2411,2413,2415,2417,2419,2421,2423],{"class":139,"line":155},[137,2408,392],{"class":143},[137,2410,1928],{"class":147},[137,2412,176],{"class":151},[137,2414,622],{"class":147},[137,2416,288],{"class":151},[137,2418,627],{"class":241},[137,2420,1939],{"class":147},[137,2422,288],{"class":151},[137,2424,1944],{"class":147},[137,2426,2427,2429,2431,2433],{"class":139,"line":162},[137,2428,641],{"class":151},[137,2430,1275],{"class":147},[137,2432,288],{"class":151},[137,2434,1955],{"class":147},[137,2436,2437,2440,2443],{"class":139,"line":168},[137,2438,2439],{"class":151},"        .",[137,2441,2442],{"class":241},"map",[137,2444,2445],{"class":147},"(normalizeCourse)\n",[137,2447,2448,2450,2453],{"class":139,"line":183},[137,2449,2439],{"class":151},[137,2451,2452],{"class":241},"filter",[137,2454,2455],{"class":147},"(Boolean)\n",[137,2457,2458,2460],{"class":139,"line":198},[137,2459,655],{"class":151},[137,2461,658],{"class":147},[137,2463,2464],{"class":139,"line":211},[137,2465,165],{"emptyLinePlaceholder":6},[137,2467,2468,2470],{"class":139,"line":224},[137,2469,273],{"class":143},[137,2471,180],{"class":179},[137,2473,2474,2476,2478,2480,2482,2484,2486,2488],{"class":139,"line":230},[137,2475,1790],{"class":147},[137,2477,189],{"class":151},[137,2479,1275],{"class":147},[137,2481,288],{"class":151},[137,2483,1800],{"class":147},[137,2485,1316],{"class":151},[137,2487,1319],{"class":143},[137,2489,195],{"class":179},[137,2491,2492,2494,2496,2498,2500,2502,2504,2506],{"class":139,"line":235},[137,2493,2169],{"class":147},[137,2495,189],{"class":151},[137,2497,1275],{"class":147},[137,2499,288],{"class":151},[137,2501,2178],{"class":147},[137,2503,1316],{"class":151},[137,2505,1319],{"class":143},[137,2507,195],{"class":179},[137,2509,2510,2512,2514,2516,2518,2520,2522,2524],{"class":139,"line":270},[137,2511,2189],{"class":147},[137,2513,189],{"class":151},[137,2515,1275],{"class":147},[137,2517,288],{"class":151},[137,2519,1313],{"class":147},[137,2521,1316],{"class":151},[137,2523,1319],{"class":143},[137,2525,195],{"class":179},[137,2527,2528,2530,2532,2534,2536,2538,2540],{"class":139,"line":301},[137,2529,2208],{"class":147},[137,2531,189],{"class":151},[137,2533,1622],{"class":241},[137,2535,1939],{"class":147},[137,2537,288],{"class":151},[137,2539,2219],{"class":147},[137,2541,195],{"class":179},[137,2543,2544],{"class":139,"line":309},[137,2545,165],{"emptyLinePlaceholder":6},[137,2547,2548,2551,2553],{"class":139,"line":319},[137,2549,2550],{"class":147},"    account",[137,2552,189],{"class":151},[137,2554,180],{"class":179},[137,2556,2557,2560,2562,2565,2567,2570,2572,2574],{"class":139,"line":330},[137,2558,2559],{"class":147},"      createdAt",[137,2561,189],{"class":151},[137,2563,2564],{"class":147}," Number",[137,2566,288],{"class":151},[137,2568,2569],{"class":241},"isFinite",[137,2571,1939],{"class":147},[137,2573,288],{"class":151},[137,2575,2576],{"class":147},"creationDate)\n",[137,2578,2579,2582,2584,2587],{"class":139,"line":343},[137,2580,2581],{"class":151},"        ?",[137,2583,277],{"class":276},[137,2585,2586],{"class":241}," Date",[137,2588,540],{"class":147},[137,2590,2591,2594,2596,2599,2602,2605],{"class":139,"line":349},[137,2592,2593],{"class":147},"            user",[137,2595,288],{"class":151},[137,2597,2598],{"class":147},"creationDate ",[137,2600,2601],{"class":151},"*",[137,2603,2604],{"class":261}," 1000",[137,2606,195],{"class":179},[137,2608,2609,2612,2614,2617],{"class":139,"line":358},[137,2610,2611],{"class":147},"          )",[137,2613,288],{"class":151},[137,2615,2616],{"class":241},"toISOString",[137,2618,604],{"class":147},[137,2620,2621,2624,2626],{"class":139,"line":363},[137,2622,2623],{"class":151},"        :",[137,2625,1319],{"class":143},[137,2627,195],{"class":179},[137,2629,2630,2633,2635,2638,2640,2642,2645],{"class":139,"line":368},[137,2631,2632],{"class":147},"      hasPlus",[137,2634,189],{"class":151},[137,2636,2637],{"class":241}," Boolean",[137,2639,1939],{"class":147},[137,2641,288],{"class":151},[137,2643,2644],{"class":147},"hasPlus)",[137,2646,195],{"class":179},[137,2648,2649],{"class":139,"line":389},[137,2650,346],{"class":179},[137,2652,2653],{"class":139,"line":408},[137,2654,165],{"emptyLinePlaceholder":6},[137,2656,2657,2659,2661],{"class":139,"line":413},[137,2658,1871],{"class":147},[137,2660,189],{"class":151},[137,2662,180],{"class":179},[137,2664,2665,2668,2670,2672,2674,2676,2678,2680],{"class":139,"line":439},[137,2666,2667],{"class":147},"      total",[137,2669,189],{"class":151},[137,2671,1275],{"class":147},[137,2673,288],{"class":151},[137,2675,1379],{"class":147},[137,2677,1316],{"class":151},[137,2679,1362],{"class":261},[137,2681,195],{"class":179},[137,2683,2684,2687,2689,2691,2693,2696,2698,2700],{"class":139,"line":444},[137,2685,2686],{"class":147},"      weekly",[137,2688,189],{"class":151},[137,2690,1275],{"class":147},[137,2692,288],{"class":151},[137,2694,2695],{"class":147},"weeklyXp ",[137,2697,1316],{"class":151},[137,2699,1362],{"class":261},[137,2701,195],{"class":179},[137,2703,2704,2707,2709,2711,2713,2716,2718,2720],{"class":139,"line":467},[137,2705,2706],{"class":147},"      monthly",[137,2708,189],{"class":151},[137,2710,1275],{"class":147},[137,2712,288],{"class":151},[137,2714,2715],{"class":147},"monthlyXp ",[137,2717,1316],{"class":151},[137,2719,1362],{"class":261},[137,2721,195],{"class":179},[137,2723,2724],{"class":139,"line":476},[137,2725,346],{"class":179},[137,2727,2728],{"class":139,"line":489},[137,2729,165],{"emptyLinePlaceholder":6},[137,2731,2732,2734,2736,2739,2741],{"class":139,"line":494},[137,2733,2230],{"class":147},[137,2735,189],{"class":151},[137,2737,2738],{"class":241}," getStreakStatus",[137,2740,2364],{"class":147},[137,2742,195],{"class":179},[137,2744,2745],{"class":139,"line":501},[137,2746,165],{"emptyLinePlaceholder":6},[137,2748,2749,2751,2753,2755],{"class":139,"line":506},[137,2750,2350],{"class":147},[137,2752,189],{"class":151},[137,2754,1743],{"class":241},[137,2756,540],{"class":147},[137,2758,2759,2761,2763],{"class":139,"line":529},[137,2760,2361],{"class":241},[137,2762,2364],{"class":147},[137,2764,195],{"class":179},[137,2766,2767,2769],{"class":139,"line":543},[137,2768,2371],{"class":147},[137,2770,195],{"class":179},[137,2772,2773],{"class":139,"line":567},[137,2774,165],{"emptyLinePlaceholder":6},[137,2776,2777,2779],{"class":139,"line":573},[137,2778,1977],{"class":147},[137,2780,195],{"class":179},[137,2782,2783],{"class":139,"line":579},[137,2784,576],{"class":179},[137,2786,2787],{"class":139,"line":584},[137,2788,227],{"class":179},[17,2790,2791],{},"详情接口仍然使用精确用户名匹配：",[63,2793,2795],{"className":131,"code":2794,"language":133,"meta":69,"style":69},"function findExactUser(users, username) {\n  const normalizedUsername =\n    username.toLowerCase()\n\n  return users.find(\n    user =>\n      typeof user.username === 'string' &&\n      user.username.toLowerCase() ===\n        normalizedUsername,\n  )\n}\n",[34,2796,2797,2818,2827,2837,2841,2853,2859,2878,2894,2901,2905],{"__ignoreMap":69},[137,2798,2799,2801,2804,2806,2809,2811,2814,2816],{"class":139,"line":140},[137,2800,238],{"class":143},[137,2802,2803],{"class":241}," findExactUser",[137,2805,245],{"class":179},[137,2807,2808],{"class":248},"users",[137,2810,252],{"class":179},[137,2812,2813],{"class":248}," username",[137,2815,265],{"class":179},[137,2817,180],{"class":179},[137,2819,2820,2822,2825],{"class":139,"line":155},[137,2821,392],{"class":143},[137,2823,2824],{"class":147}," normalizedUsername ",[137,2826,152],{"class":151},[137,2828,2829,2831,2833,2835],{"class":139,"line":162},[137,2830,2169],{"class":147},[137,2832,288],{"class":151},[137,2834,703],{"class":241},[137,2836,604],{"class":147},[137,2838,2839],{"class":139,"line":168},[137,2840,165],{"emptyLinePlaceholder":6},[137,2842,2843,2845,2847,2849,2851],{"class":139,"line":183},[137,2844,273],{"class":143},[137,2846,671],{"class":147},[137,2848,288],{"class":151},[137,2850,676],{"class":241},[137,2852,540],{"class":147},[137,2854,2855,2857],{"class":139,"line":198},[137,2856,684],{"class":248},[137,2858,687],{"class":143},[137,2860,2861,2864,2866,2868,2870,2872,2875],{"class":139,"line":211},[137,2862,2863],{"class":151},"      typeof",[137,2865,1275],{"class":147},[137,2867,288],{"class":151},[137,2869,2178],{"class":147},[137,2871,790],{"class":151},[137,2873,2874],{"class":158}," 'string'",[137,2876,2877],{"class":151}," &&\n",[137,2879,2880,2882,2884,2886,2888,2890,2892],{"class":139,"line":224},[137,2881,693],{"class":147},[137,2883,288],{"class":151},[137,2885,382],{"class":147},[137,2887,288],{"class":151},[137,2889,703],{"class":241},[137,2891,706],{"class":147},[137,2893,709],{"class":151},[137,2895,2896,2899],{"class":139,"line":230},[137,2897,2898],{"class":147},"        normalizedUsername",[137,2900,195],{"class":179},[137,2902,2903],{"class":139,"line":235},[137,2904,730],{"class":147},[137,2906,2907],{"class":139,"line":270},[137,2908,227],{"class":179},[76,2910],{},[79,2912,2913],{"id":2913},"处理连续学习状态",[17,2915,2916,2917,2920],{},"只返回 ",[34,2918,2919],{},"user.streak"," 不一定够用。",[17,2922,2923],{},"页面通常还需要知道：",[27,2925,2926,2929,2932,2935],{},[30,2927,2928],{},"当前连续学习天数",[30,2930,2931],{},"历史最长连续天数",[30,2933,2934],{},"今天是否已经完成学习",[30,2936,2937],{},"当前连续记录的开始和结束日期",[17,2939,2940],{},"Duolingo 返回的数据里可能同时存在旧字段和新字段，因此需要做几层兜底。",[63,2942,2944],{"className":131,"code":2943,"language":133,"meta":69,"style":69},"function getDateInTimezone(timeZone) {\n  try {\n    const parts = new Intl.DateTimeFormat(\n      'en-US',\n      {\n        timeZone,\n        year: 'numeric',\n        month: '2-digit',\n        day: '2-digit',\n      },\n    ).formatToParts(new Date())\n\n    const value = type =>\n      parts.find(\n        part => part.type === type,\n      )?.value ?? ''\n\n    return `${value('year')}-${value('month')}-${value('day')}`\n  }\n  catch {\n    return new Date()\n      .toISOString()\n      .slice(0, 10)\n  }\n}\n\nfunction getStreakStatus(user) {\n  const streakData =\n    user.streakData &&\n    typeof user.streakData === 'object'\n      ? user.streakData\n      : {}\n\n  const current =\n    streakData.currentStreak &&\n    typeof streakData.currentStreak === 'object'\n      ? streakData.currentStreak\n      : {}\n\n  const timezone =\n    user.timezone ??\n    streakData.updatedTimeZone ??\n    'UTC'\n\n  const statusDate =\n    getDateInTimezone(timezone)\n\n  const completedToday =\n    user.streak_today_increase === true ||\n    user.streak_today_increase === 1 ||\n    user.streak_extended_today === true ||\n    current.lastExtendedDate === statusDate ||\n    current.endDate === statusDate\n\n  const previous =\n    streakData.previousStreak &&\n    typeof streakData.previousStreak === 'object'\n      ? streakData.previousStreak\n      : null\n\n  const longest =\n    streakData.longestStreak &&\n    typeof streakData.longestStreak === 'object'\n      ? streakData.longestStreak\n      : null\n\n  return {\n    completedToday,\n    statusDate,\n\n    current: {\n      length:\n        current.length ??\n        streakData.length ??\n        user.streak ??\n        0,\n      startDate: current.startDate ?? null,\n      endDate: current.endDate ?? null,\n    },\n\n    previous: previous\n      ? {\n          length: previous.length ?? 0,\n          startDate:\n            previous.startDate ?? null,\n          endDate:\n            previous.endDate ?? null,\n        }\n      : null,\n\n    longest: {\n      length:\n        longest?.length ??\n        user.longestStreak ??\n        0,\n      startDate:\n        longest?.startDate ?? null,\n      endDate:\n        longest?.endDate ?? null,\n      achievedDate:\n        longest?.achieveDate ?? null,\n    },\n\n    xpGoal: streakData.xpGoal ?? null,\n  }\n}\n",[34,2945,2946,2962,2969,2990,2997,3002,3009,3021,3033,3044,3049,3068,3072,3086,3097,3119,3134,3138,3192,3196,3203,3213,3222,3241,3245,3249,3253,3267,3276,3288,3304,3316,3324,3328,3337,3349,3364,3375,3381,3385,3394,3405,3416,3421,3425,3434,3442,3446,3455,3472,3487,3502,3519,3533,3537,3546,3557,3571,3582,3588,3592,3601,3611,3625,3636,3642,3646,3652,3659,3666,3670,3678,3685,3696,3707,3717,3724,3745,3764,3768,3772,3782,3788,3808,3815,3830,3837,3851,3856,3864,3868,3877,3883,3894,3904,3910,3916,3930,3936,3950,3957,3972,3976,3980,4000,4004],{"__ignoreMap":69},[137,2947,2948,2950,2953,2955,2958,2960],{"class":139,"line":140},[137,2949,238],{"class":143},[137,2951,2952],{"class":241}," getDateInTimezone",[137,2954,245],{"class":179},[137,2956,2957],{"class":248},"timeZone",[137,2959,265],{"class":179},[137,2961,180],{"class":179},[137,2963,2964,2967],{"class":139,"line":155},[137,2965,2966],{"class":143},"  try",[137,2968,180],{"class":179},[137,2970,2971,2973,2976,2978,2980,2983,2985,2988],{"class":139,"line":162},[137,2972,948],{"class":143},[137,2974,2975],{"class":147}," parts ",[137,2977,176],{"class":151},[137,2979,277],{"class":276},[137,2981,2982],{"class":147}," Intl",[137,2984,288],{"class":151},[137,2986,2987],{"class":241},"DateTimeFormat",[137,2989,540],{"class":147},[137,2991,2992,2995],{"class":139,"line":168},[137,2993,2994],{"class":158},"      'en-US'",[137,2996,195],{"class":179},[137,2998,2999],{"class":139,"line":183},[137,3000,3001],{"class":179},"      {\n",[137,3003,3004,3007],{"class":139,"line":198},[137,3005,3006],{"class":147},"        timeZone",[137,3008,195],{"class":179},[137,3010,3011,3014,3016,3019],{"class":139,"line":211},[137,3012,3013],{"class":147},"        year",[137,3015,189],{"class":151},[137,3017,3018],{"class":158}," 'numeric'",[137,3020,195],{"class":179},[137,3022,3023,3026,3028,3031],{"class":139,"line":224},[137,3024,3025],{"class":147},"        month",[137,3027,189],{"class":151},[137,3029,3030],{"class":158}," '2-digit'",[137,3032,195],{"class":179},[137,3034,3035,3038,3040,3042],{"class":139,"line":230},[137,3036,3037],{"class":147},"        day",[137,3039,189],{"class":151},[137,3041,3030],{"class":158},[137,3043,195],{"class":179},[137,3045,3046],{"class":139,"line":235},[137,3047,3048],{"class":179},"      },\n",[137,3050,3051,3053,3055,3058,3060,3063,3065],{"class":139,"line":270},[137,3052,2371],{"class":147},[137,3054,288],{"class":151},[137,3056,3057],{"class":241},"formatToParts",[137,3059,245],{"class":147},[137,3061,3062],{"class":276},"new",[137,3064,2586],{"class":241},[137,3066,3067],{"class":147},"())\n",[137,3069,3070],{"class":139,"line":301},[137,3071,165],{"emptyLinePlaceholder":6},[137,3073,3074,3076,3079,3081,3084],{"class":139,"line":309},[137,3075,948],{"class":143},[137,3077,3078],{"class":241}," value",[137,3080,258],{"class":151},[137,3082,3083],{"class":248}," type",[137,3085,687],{"class":143},[137,3087,3088,3091,3093,3095],{"class":139,"line":319},[137,3089,3090],{"class":147},"      parts",[137,3092,288],{"class":151},[137,3094,676],{"class":241},[137,3096,540],{"class":147},[137,3098,3099,3102,3105,3108,3110,3113,3115,3117],{"class":139,"line":330},[137,3100,3101],{"class":248},"        part",[137,3103,3104],{"class":143}," =>",[137,3106,3107],{"class":147}," part",[137,3109,288],{"class":151},[137,3111,3112],{"class":147},"type ",[137,3114,790],{"class":151},[137,3116,3083],{"class":147},[137,3118,195],{"class":179},[137,3120,3121,3124,3126,3129,3131],{"class":139,"line":343},[137,3122,3123],{"class":147},"      )",[137,3125,700],{"class":151},[137,3127,3128],{"class":147},"value ",[137,3130,1316],{"class":151},[137,3132,3133],{"class":158}," ''\n",[137,3135,3136],{"class":139,"line":349},[137,3137,165],{"emptyLinePlaceholder":6},[137,3139,3140,3142,3145,3147,3150,3152,3155,3157,3159,3162,3164,3166,3168,3171,3173,3175,3177,3179,3181,3183,3186,3188,3190],{"class":139,"line":358},[137,3141,1648],{"class":143},[137,3143,3144],{"class":158}," `",[137,3146,549],{"class":179},[137,3148,3149],{"class":241},"value",[137,3151,245],{"class":158},[137,3153,3154],{"class":158},"'year'",[137,3156,265],{"class":158},[137,3158,559],{"class":179},[137,3160,3161],{"class":158},"-",[137,3163,549],{"class":179},[137,3165,3149],{"class":241},[137,3167,245],{"class":158},[137,3169,3170],{"class":158},"'month'",[137,3172,265],{"class":158},[137,3174,559],{"class":179},[137,3176,3161],{"class":158},[137,3178,549],{"class":179},[137,3180,3149],{"class":241},[137,3182,245],{"class":158},[137,3184,3185],{"class":158},"'day'",[137,3187,265],{"class":158},[137,3189,559],{"class":179},[137,3191,1697],{"class":158},[137,3193,3194],{"class":139,"line":363},[137,3195,576],{"class":179},[137,3197,3198,3201],{"class":139,"line":368},[137,3199,3200],{"class":143},"  catch",[137,3202,180],{"class":179},[137,3204,3205,3207,3209,3211],{"class":139,"line":389},[137,3206,1648],{"class":143},[137,3208,277],{"class":276},[137,3210,2586],{"class":241},[137,3212,604],{"class":147},[137,3214,3215,3218,3220],{"class":139,"line":408},[137,3216,3217],{"class":151},"      .",[137,3219,2616],{"class":241},[137,3221,604],{"class":147},[137,3223,3224,3226,3229,3231,3234,3236,3239],{"class":139,"line":413},[137,3225,3217],{"class":151},[137,3227,3228],{"class":241},"slice",[137,3230,245],{"class":147},[137,3232,3233],{"class":261},"0",[137,3235,252],{"class":179},[137,3237,3238],{"class":261}," 10",[137,3240,355],{"class":147},[137,3242,3243],{"class":139,"line":439},[137,3244,576],{"class":179},[137,3246,3247],{"class":139,"line":444},[137,3248,227],{"class":179},[137,3250,3251],{"class":139,"line":467},[137,3252,165],{"emptyLinePlaceholder":6},[137,3254,3255,3257,3259,3261,3263,3265],{"class":139,"line":476},[137,3256,238],{"class":143},[137,3258,2738],{"class":241},[137,3260,245],{"class":179},[137,3262,1189],{"class":248},[137,3264,265],{"class":179},[137,3266,180],{"class":179},[137,3268,3269,3271,3274],{"class":139,"line":489},[137,3270,392],{"class":143},[137,3272,3273],{"class":147}," streakData ",[137,3275,152],{"class":151},[137,3277,3278,3280,3282,3285],{"class":139,"line":494},[137,3279,684],{"class":147},[137,3281,288],{"class":151},[137,3283,3284],{"class":147},"streakData ",[137,3286,3287],{"class":151},"&&\n",[137,3289,3290,3293,3295,3297,3299,3301],{"class":139,"line":501},[137,3291,3292],{"class":151},"    typeof",[137,3294,1275],{"class":147},[137,3296,288],{"class":151},[137,3298,3284],{"class":147},[137,3300,790],{"class":151},[137,3302,3303],{"class":158}," 'object'\n",[137,3305,3306,3309,3311,3313],{"class":139,"line":506},[137,3307,3308],{"class":151},"      ?",[137,3310,1275],{"class":147},[137,3312,288],{"class":151},[137,3314,3315],{"class":147},"streakData\n",[137,3317,3318,3321],{"class":139,"line":529},[137,3319,3320],{"class":151},"      :",[137,3322,3323],{"class":179}," {}\n",[137,3325,3326],{"class":139,"line":543},[137,3327,165],{"emptyLinePlaceholder":6},[137,3329,3330,3332,3335],{"class":139,"line":567},[137,3331,392],{"class":143},[137,3333,3334],{"class":147}," current ",[137,3336,152],{"class":151},[137,3338,3339,3342,3344,3347],{"class":139,"line":573},[137,3340,3341],{"class":147},"    streakData",[137,3343,288],{"class":151},[137,3345,3346],{"class":147},"currentStreak ",[137,3348,3287],{"class":151},[137,3350,3351,3353,3356,3358,3360,3362],{"class":139,"line":579},[137,3352,3292],{"class":151},[137,3354,3355],{"class":147}," streakData",[137,3357,288],{"class":151},[137,3359,3346],{"class":147},[137,3361,790],{"class":151},[137,3363,3303],{"class":158},[137,3365,3366,3368,3370,3372],{"class":139,"line":584},[137,3367,3308],{"class":151},[137,3369,3355],{"class":147},[137,3371,288],{"class":151},[137,3373,3374],{"class":147},"currentStreak\n",[137,3376,3377,3379],{"class":139,"line":607},[137,3378,3320],{"class":151},[137,3380,3323],{"class":179},[137,3382,3383],{"class":139,"line":612},[137,3384,165],{"emptyLinePlaceholder":6},[137,3386,3387,3389,3392],{"class":139,"line":638},[137,3388,392],{"class":143},[137,3390,3391],{"class":147}," timezone ",[137,3393,152],{"class":151},[137,3395,3396,3398,3400,3403],{"class":139,"line":652},[137,3397,684],{"class":147},[137,3399,288],{"class":151},[137,3401,3402],{"class":147},"timezone ",[137,3404,2017],{"class":151},[137,3406,3407,3409,3411,3414],{"class":139,"line":661},[137,3408,3341],{"class":147},[137,3410,288],{"class":151},[137,3412,3413],{"class":147},"updatedTimeZone ",[137,3415,2017],{"class":151},[137,3417,3418],{"class":139,"line":666},[137,3419,3420],{"class":158},"    'UTC'\n",[137,3422,3423],{"class":139,"line":681},[137,3424,165],{"emptyLinePlaceholder":6},[137,3426,3427,3429,3432],{"class":139,"line":690},[137,3428,392],{"class":143},[137,3430,3431],{"class":147}," statusDate ",[137,3433,152],{"class":151},[137,3435,3436,3439],{"class":139,"line":712},[137,3437,3438],{"class":241},"    getDateInTimezone",[137,3440,3441],{"class":147},"(timezone)\n",[137,3443,3444],{"class":139,"line":727},[137,3445,165],{"emptyLinePlaceholder":6},[137,3447,3448,3450,3453],{"class":139,"line":733},[137,3449,392],{"class":143},[137,3451,3452],{"class":147}," completedToday ",[137,3454,152],{"class":151},[137,3456,3457,3459,3461,3464,3466,3469],{"class":139,"line":738},[137,3458,684],{"class":147},[137,3460,288],{"class":151},[137,3462,3463],{"class":147},"streak_today_increase ",[137,3465,790],{"class":151},[137,3467,3468],{"class":261}," true",[137,3470,3471],{"class":151}," ||\n",[137,3473,3474,3476,3478,3480,3482,3485],{"class":139,"line":743},[137,3475,684],{"class":147},[137,3477,288],{"class":151},[137,3479,3463],{"class":147},[137,3481,790],{"class":151},[137,3483,3484],{"class":261}," 1",[137,3486,3471],{"class":151},[137,3488,3489,3491,3493,3496,3498,3500],{"class":139,"line":754},[137,3490,684],{"class":147},[137,3492,288],{"class":151},[137,3494,3495],{"class":147},"streak_extended_today ",[137,3497,790],{"class":151},[137,3499,3468],{"class":261},[137,3501,3471],{"class":151},[137,3503,3504,3507,3509,3512,3514,3516],{"class":139,"line":776},[137,3505,3506],{"class":147},"    current",[137,3508,288],{"class":151},[137,3510,3511],{"class":147},"lastExtendedDate ",[137,3513,790],{"class":151},[137,3515,3431],{"class":147},[137,3517,3518],{"class":151},"||\n",[137,3520,3521,3523,3525,3528,3530],{"class":139,"line":801},[137,3522,3506],{"class":147},[137,3524,288],{"class":151},[137,3526,3527],{"class":147},"endDate ",[137,3529,790],{"class":151},[137,3531,3532],{"class":147}," statusDate\n",[137,3534,3535],{"class":139,"line":820},[137,3536,165],{"emptyLinePlaceholder":6},[137,3538,3539,3541,3544],{"class":139,"line":833},[137,3540,392],{"class":143},[137,3542,3543],{"class":147}," previous ",[137,3545,152],{"class":151},[137,3547,3548,3550,3552,3555],{"class":139,"line":847},[137,3549,3341],{"class":147},[137,3551,288],{"class":151},[137,3553,3554],{"class":147},"previousStreak ",[137,3556,3287],{"class":151},[137,3558,3559,3561,3563,3565,3567,3569],{"class":139,"line":855},[137,3560,3292],{"class":151},[137,3562,3355],{"class":147},[137,3564,288],{"class":151},[137,3566,3554],{"class":147},[137,3568,790],{"class":151},[137,3570,3303],{"class":158},[137,3572,3573,3575,3577,3579],{"class":139,"line":861},[137,3574,3308],{"class":151},[137,3576,3355],{"class":147},[137,3578,288],{"class":151},[137,3580,3581],{"class":147},"previousStreak\n",[137,3583,3584,3586],{"class":139,"line":866},[137,3585,3320],{"class":151},[137,3587,1651],{"class":143},[137,3589,3590],{"class":139,"line":887},[137,3591,165],{"emptyLinePlaceholder":6},[137,3593,3594,3596,3599],{"class":139,"line":896},[137,3595,392],{"class":143},[137,3597,3598],{"class":147}," longest ",[137,3600,152],{"class":151},[137,3602,3603,3605,3607,3609],{"class":139,"line":902},[137,3604,3341],{"class":147},[137,3606,288],{"class":151},[137,3608,2310],{"class":147},[137,3610,3287],{"class":151},[137,3612,3613,3615,3617,3619,3621,3623],{"class":139,"line":915},[137,3614,3292],{"class":151},[137,3616,3355],{"class":147},[137,3618,288],{"class":151},[137,3620,2310],{"class":147},[137,3622,790],{"class":151},[137,3624,3303],{"class":158},[137,3626,3627,3629,3631,3633],{"class":139,"line":921},[137,3628,3308],{"class":151},[137,3630,3355],{"class":147},[137,3632,288],{"class":151},[137,3634,3635],{"class":147},"longestStreak\n",[137,3637,3638,3640],{"class":139,"line":929},[137,3639,3320],{"class":151},[137,3641,1651],{"class":143},[137,3643,3644],{"class":139,"line":935},[137,3645,165],{"emptyLinePlaceholder":6},[137,3647,3648,3650],{"class":139,"line":940},[137,3649,273],{"class":143},[137,3651,180],{"class":179},[137,3653,3654,3657],{"class":139,"line":945},[137,3655,3656],{"class":147},"    completedToday",[137,3658,195],{"class":179},[137,3660,3661,3664],{"class":139,"line":967},[137,3662,3663],{"class":147},"    statusDate",[137,3665,195],{"class":179},[137,3667,3668],{"class":139,"line":972},[137,3669,165],{"emptyLinePlaceholder":6},[137,3671,3672,3674,3676],{"class":139,"line":994},[137,3673,3506],{"class":147},[137,3675,189],{"class":151},[137,3677,180],{"class":179},[137,3679,3680,3683],{"class":139,"line":1003},[137,3681,3682],{"class":147},"      length",[137,3684,2233],{"class":151},[137,3686,3687,3690,3692,3694],{"class":139,"line":1008},[137,3688,3689],{"class":147},"        current",[137,3691,288],{"class":151},[137,3693,2252],{"class":147},[137,3695,2017],{"class":151},[137,3697,3698,3701,3703,3705],{"class":139,"line":1020},[137,3699,3700],{"class":147},"        streakData",[137,3702,288],{"class":151},[137,3704,2252],{"class":147},[137,3706,2017],{"class":151},[137,3708,3709,3711,3713,3715],{"class":139,"line":1025},[137,3710,2048],{"class":147},[137,3712,288],{"class":151},[137,3714,1357],{"class":147},[137,3716,2017],{"class":151},[137,3718,3719,3722],{"class":139,"line":1033},[137,3720,3721],{"class":261},"        0",[137,3723,195],{"class":179},[137,3725,3726,3729,3731,3734,3736,3739,3741,3743],{"class":139,"line":1038},[137,3727,3728],{"class":147},"      startDate",[137,3730,189],{"class":151},[137,3732,3733],{"class":147}," current",[137,3735,288],{"class":151},[137,3737,3738],{"class":147},"startDate ",[137,3740,1316],{"class":151},[137,3742,1319],{"class":143},[137,3744,195],{"class":179},[137,3746,3747,3750,3752,3754,3756,3758,3760,3762],{"class":139,"line":1043},[137,3748,3749],{"class":147},"      endDate",[137,3751,189],{"class":151},[137,3753,3733],{"class":147},[137,3755,288],{"class":151},[137,3757,3527],{"class":147},[137,3759,1316],{"class":151},[137,3761,1319],{"class":143},[137,3763,195],{"class":179},[137,3765,3766],{"class":139,"line":1048},[137,3767,346],{"class":179},[137,3769,3770],{"class":139,"line":1071},[137,3771,165],{"emptyLinePlaceholder":6},[137,3773,3774,3777,3779],{"class":139,"line":1076},[137,3775,3776],{"class":147},"    previous",[137,3778,189],{"class":151},[137,3780,3781],{"class":147}," previous\n",[137,3783,3784,3786],{"class":139,"line":1091},[137,3785,3308],{"class":151},[137,3787,180],{"class":179},[137,3789,3790,3793,3795,3798,3800,3802,3804,3806],{"class":139,"line":1100},[137,3791,3792],{"class":147},"          length",[137,3794,189],{"class":151},[137,3796,3797],{"class":147}," previous",[137,3799,288],{"class":151},[137,3801,2252],{"class":147},[137,3803,1316],{"class":151},[137,3805,1362],{"class":261},[137,3807,195],{"class":179},[137,3809,3810,3813],{"class":139,"line":1105},[137,3811,3812],{"class":147},"          startDate",[137,3814,2233],{"class":151},[137,3816,3817,3820,3822,3824,3826,3828],{"class":139,"line":1117},[137,3818,3819],{"class":147},"            previous",[137,3821,288],{"class":151},[137,3823,3738],{"class":147},[137,3825,1316],{"class":151},[137,3827,1319],{"class":143},[137,3829,195],{"class":179},[137,3831,3832,3835],{"class":139,"line":1122},[137,3833,3834],{"class":147},"          endDate",[137,3836,2233],{"class":151},[137,3838,3839,3841,3843,3845,3847,3849],{"class":139,"line":1130},[137,3840,3819],{"class":147},[137,3842,288],{"class":151},[137,3844,3527],{"class":147},[137,3846,1316],{"class":151},[137,3848,1319],{"class":143},[137,3850,195],{"class":179},[137,3852,3853],{"class":139,"line":1135},[137,3854,3855],{"class":179},"        }\n",[137,3857,3858,3860,3862],{"class":139,"line":1140},[137,3859,3320],{"class":151},[137,3861,1319],{"class":143},[137,3863,195],{"class":179},[137,3865,3866],{"class":139,"line":1145},[137,3867,165],{"emptyLinePlaceholder":6},[137,3869,3870,3873,3875],{"class":139,"line":1153},[137,3871,3872],{"class":147},"    longest",[137,3874,189],{"class":151},[137,3876,180],{"class":179},[137,3878,3879,3881],{"class":139,"line":1174},[137,3880,3682],{"class":147},[137,3882,2233],{"class":151},[137,3884,3885,3888,3890,3892],{"class":139,"line":1179},[137,3886,3887],{"class":147},"        longest",[137,3889,700],{"class":151},[137,3891,2252],{"class":147},[137,3893,2017],{"class":151},[137,3895,3896,3898,3900,3902],{"class":139,"line":1196},[137,3897,2048],{"class":147},[137,3899,288],{"class":151},[137,3901,2310],{"class":147},[137,3903,2017],{"class":151},[137,3905,3906,3908],{"class":139,"line":1206},[137,3907,3721],{"class":261},[137,3909,195],{"class":179},[137,3911,3912,3914],{"class":139,"line":1212},[137,3913,3728],{"class":147},[137,3915,2233],{"class":151},[137,3917,3918,3920,3922,3924,3926,3928],{"class":139,"line":1225},[137,3919,3887],{"class":147},[137,3921,700],{"class":151},[137,3923,3738],{"class":147},[137,3925,1316],{"class":151},[137,3927,1319],{"class":143},[137,3929,195],{"class":179},[137,3931,3932,3934],{"class":139,"line":1231},[137,3933,3749],{"class":147},[137,3935,2233],{"class":151},[137,3937,3938,3940,3942,3944,3946,3948],{"class":139,"line":1239},[137,3939,3887],{"class":147},[137,3941,700],{"class":151},[137,3943,3527],{"class":147},[137,3945,1316],{"class":151},[137,3947,1319],{"class":143},[137,3949,195],{"class":179},[137,3951,3952,3955],{"class":139,"line":1245},[137,3953,3954],{"class":147},"      achievedDate",[137,3956,2233],{"class":151},[137,3958,3959,3961,3963,3966,3968,3970],{"class":139,"line":1251},[137,3960,3887],{"class":147},[137,3962,700],{"class":151},[137,3964,3965],{"class":147},"achieveDate ",[137,3967,1316],{"class":151},[137,3969,1319],{"class":143},[137,3971,195],{"class":179},[137,3973,3974],{"class":139,"line":1256},[137,3975,346],{"class":179},[137,3977,3978],{"class":139,"line":1267},[137,3979,165],{"emptyLinePlaceholder":6},[137,3981,3982,3985,3987,3989,3991,3994,3996,3998],{"class":139,"line":1285},[137,3983,3984],{"class":147},"    xpGoal",[137,3986,189],{"class":151},[137,3988,3355],{"class":147},[137,3990,288],{"class":151},[137,3992,3993],{"class":147},"xpGoal ",[137,3995,1316],{"class":151},[137,3997,1319],{"class":143},[137,3999,195],{"class":179},[137,4001,4002],{"class":139,"line":1301},[137,4003,576],{"class":179},[137,4005,4006],{"class":139,"line":1324},[137,4007,227],{"class":179},[17,4009,4010],{},"判断“今天是否完成”时需要使用用户所在时区。",[17,4012,4013],{},"如果直接使用服务器当前日期，亚洲用户在 UTC 日期切换前后可能会得到错误结果。",[76,4015],{},[79,4017,4019],{"id":4018},"给固定用户增加-kv-缓存","给固定用户增加 KV 缓存",[17,4021,4022,4023,4025],{},"个人主页可能每次打开都会请求 ",[34,4024,2088],{},"。",[17,4027,4028],{},"用户数据不需要每次都从 Duolingo 获取，因此可以使用 Cloudflare KV 保存查询结果。",[17,4030,4031],{},"先创建一个 KV Namespace，然后绑定到 Worker：",[63,4033,4036],{"className":4034,"code":4035,"language":68,"meta":69},[66],"Variable name: DUO_CACHE\n",[34,4037,4035],{"__ignoreMap":69},[17,4039,4040],{},"缓存键包含用户名：",[63,4042,4044],{"className":131,"code":4043,"language":133,"meta":69,"style":69},"function getMeCacheKey(env) {\n  return `me:${env.USERNAME.trim().toLowerCase()}:profile`\n}\n",[34,4045,4046,4062,4094],{"__ignoreMap":69},[137,4047,4048,4050,4053,4055,4058,4060],{"class":139,"line":140},[137,4049,238],{"class":143},[137,4051,4052],{"class":241}," getMeCacheKey",[137,4054,245],{"class":179},[137,4056,4057],{"class":248},"env",[137,4059,265],{"class":179},[137,4061,180],{"class":179},[137,4063,4064,4066,4069,4071,4073,4075,4077,4079,4081,4083,4085,4087,4089,4091],{"class":139,"line":155},[137,4065,273],{"class":143},[137,4067,4068],{"class":158}," `me:",[137,4070,549],{"class":179},[137,4072,4057],{"class":147},[137,4074,288],{"class":151},[137,4076,36],{"class":261},[137,4078,288],{"class":151},[137,4080,1066],{"class":241},[137,4082,722],{"class":158},[137,4084,288],{"class":151},[137,4086,703],{"class":241},[137,4088,722],{"class":158},[137,4090,559],{"class":179},[137,4092,4093],{"class":158},":profile`\n",[137,4095,4096],{"class":139,"line":162},[137,4097,227],{"class":179},[17,4099,4100],{},"更新缓存：",[63,4102,4104],{"className":131,"code":4103,"language":133,"meta":69,"style":69},"const CACHE_TTL = 2 * 60 * 60\n\nasync function updateMe(env) {\n  const username = env.USERNAME.trim()\n  const user = await fetchExactUser(username)\n\n  const result = {\n    ...detailUser(user),\n    updatedAt: new Date().toISOString(),\n  }\n\n  await env.DUO_CACHE.put(\n    getMeCacheKey(env),\n    JSON.stringify(result),\n    {\n      expirationTtl: CACHE_TTL,\n    },\n  )\n\n  return result\n}\n",[34,4105,4106,4129,4133,4150,4170,4186,4190,4201,4213,4234,4238,4242,4261,4271,4285,4290,4302,4306,4310,4314,4321],{"__ignoreMap":69},[137,4107,4108,4110,4113,4115,4118,4121,4124,4126],{"class":139,"line":140},[137,4109,144],{"class":143},[137,4111,4112],{"class":147}," CACHE_TTL ",[137,4114,176],{"class":151},[137,4116,4117],{"class":261}," 2",[137,4119,4120],{"class":151}," *",[137,4122,4123],{"class":261}," 60",[137,4125,4120],{"class":151},[137,4127,4128],{"class":261}," 60\n",[137,4130,4131],{"class":139,"line":155},[137,4132,165],{"emptyLinePlaceholder":6},[137,4134,4135,4137,4139,4142,4144,4146,4148],{"class":139,"line":162},[137,4136,371],{"class":143},[137,4138,374],{"class":143},[137,4140,4141],{"class":241}," updateMe",[137,4143,245],{"class":179},[137,4145,4057],{"class":248},[137,4147,265],{"class":179},[137,4149,180],{"class":179},[137,4151,4152,4154,4156,4158,4160,4162,4164,4166,4168],{"class":139,"line":168},[137,4153,392],{"class":143},[137,4155,1053],{"class":147},[137,4157,176],{"class":151},[137,4159,769],{"class":147},[137,4161,288],{"class":151},[137,4163,36],{"class":261},[137,4165,288],{"class":151},[137,4167,1066],{"class":241},[137,4169,604],{"class":147},[137,4171,4172,4174,4176,4178,4180,4183],{"class":139,"line":183},[137,4173,392],{"class":143},[137,4175,1159],{"class":147},[137,4177,176],{"class":151},[137,4179,454],{"class":143},[137,4181,4182],{"class":241}," fetchExactUser",[137,4184,4185],{"class":147},"(username)\n",[137,4187,4188],{"class":139,"line":198},[137,4189,165],{"emptyLinePlaceholder":6},[137,4191,4192,4194,4197,4199],{"class":139,"line":211},[137,4193,392],{"class":143},[137,4195,4196],{"class":147}," result ",[137,4198,176],{"class":151},[137,4200,180],{"class":179},[137,4202,4203,4206,4209,4211],{"class":139,"line":224},[137,4204,4205],{"class":151},"    ...",[137,4207,4208],{"class":241},"detailUser",[137,4210,2364],{"class":147},[137,4212,195],{"class":179},[137,4214,4215,4218,4220,4222,4224,4226,4228,4230,4232],{"class":139,"line":230},[137,4216,4217],{"class":147},"    updatedAt",[137,4219,189],{"class":151},[137,4221,277],{"class":276},[137,4223,2586],{"class":241},[137,4225,722],{"class":147},[137,4227,288],{"class":151},[137,4229,2616],{"class":241},[137,4231,722],{"class":147},[137,4233,195],{"class":179},[137,4235,4236],{"class":139,"line":235},[137,4237,576],{"class":179},[137,4239,4240],{"class":139,"line":270},[137,4241,165],{"emptyLinePlaceholder":6},[137,4243,4244,4247,4249,4251,4254,4256,4259],{"class":139,"line":301},[137,4245,4246],{"class":143},"  await",[137,4248,769],{"class":147},[137,4250,288],{"class":151},[137,4252,4253],{"class":261},"DUO_CACHE",[137,4255,288],{"class":151},[137,4257,4258],{"class":241},"put",[137,4260,540],{"class":147},[137,4262,4263,4266,4269],{"class":139,"line":309},[137,4264,4265],{"class":241},"    getMeCacheKey",[137,4267,4268],{"class":147},"(env)",[137,4270,195],{"class":179},[137,4272,4273,4276,4278,4280,4283],{"class":139,"line":319},[137,4274,4275],{"class":261},"    JSON",[137,4277,288],{"class":151},[137,4279,291],{"class":241},[137,4281,4282],{"class":147},"(result)",[137,4284,195],{"class":179},[137,4286,4287],{"class":139,"line":330},[137,4288,4289],{"class":179},"    {\n",[137,4291,4292,4295,4297,4300],{"class":139,"line":343},[137,4293,4294],{"class":147},"      expirationTtl",[137,4296,189],{"class":151},[137,4298,4299],{"class":147}," CACHE_TTL",[137,4301,195],{"class":179},[137,4303,4304],{"class":139,"line":349},[137,4305,346],{"class":179},[137,4307,4308],{"class":139,"line":358},[137,4309,730],{"class":147},[137,4311,4312],{"class":139,"line":363},[137,4313,165],{"emptyLinePlaceholder":6},[137,4315,4316,4318],{"class":139,"line":368},[137,4317,273],{"class":143},[137,4319,4320],{"class":147}," result\n",[137,4322,4323],{"class":139,"line":389},[137,4324,227],{"class":179},[17,4326,4327],{},"读取缓存：",[63,4329,4331],{"className":131,"code":4330,"language":133,"meta":69,"style":69},"let data = await env.DUO_CACHE.get(\n  getMeCacheKey(env),\n  'json',\n)\n\nif (!data) {\n  data = await updateMe(env)\n}\n",[34,4332,4333,4357,4366,4373,4377,4381,4395,4409],{"__ignoreMap":69},[137,4334,4335,4338,4340,4342,4344,4346,4348,4350,4352,4355],{"class":139,"line":140},[137,4336,4337],{"class":143},"let",[137,4339,589],{"class":147},[137,4341,176],{"class":151},[137,4343,454],{"class":143},[137,4345,769],{"class":147},[137,4347,288],{"class":151},[137,4349,4253],{"class":261},[137,4351,288],{"class":151},[137,4353,4354],{"class":241},"get",[137,4356,540],{"class":147},[137,4358,4359,4362,4364],{"class":139,"line":155},[137,4360,4361],{"class":241},"  getMeCacheKey",[137,4363,4268],{"class":147},[137,4365,195],{"class":179},[137,4367,4368,4371],{"class":139,"line":162},[137,4369,4370],{"class":158},"  'json'",[137,4372,195],{"class":179},[137,4374,4375],{"class":139,"line":168},[137,4376,355],{"class":147},[137,4378,4379],{"class":139,"line":183},[137,4380,165],{"emptyLinePlaceholder":6},[137,4382,4383,4386,4388,4390,4393],{"class":139,"line":198},[137,4384,4385],{"class":143},"if",[137,4387,512],{"class":147},[137,4389,515],{"class":151},[137,4391,4392],{"class":147},"data) ",[137,4394,526],{"class":179},[137,4396,4397,4400,4402,4404,4406],{"class":139,"line":211},[137,4398,4399],{"class":147},"  data ",[137,4401,176],{"class":151},[137,4403,454],{"class":143},[137,4405,4141],{"class":241},[137,4407,4408],{"class":147},"(env)\n",[137,4410,4411],{"class":139,"line":224},[137,4412,227],{"class":179},[17,4414,4415],{},"这里有两种缓存：",[17,4417,4418],{},"第一种是 KV 缓存，减少 Worker 请求 Duolingo 的次数。",[17,4420,4421],{},"第二种是响应头中的浏览器缓存：",[63,4423,4426],{"className":4424,"code":4425,"language":68,"meta":69},[66],"Cache-Control: public, max-age=300\n",[34,4427,4425],{"__ignoreMap":69},[17,4429,4430],{},"它允许浏览器在五分钟内直接使用本地响应。",[17,4432,4433],{},"KV 缓存和浏览器缓存解决的是不同问题，不能互相替代。",[76,4435],{},[79,4437,4438],{"id":4438},"增加手动刷新",[17,4440,4441],{},"有时刚完成当天学习，希望页面马上更新，而不是等待缓存过期。",[17,4443,4444],{},"可以提供：",[63,4446,4449],{"className":4447,"code":4448,"language":68,"meta":69},[66],"GET \u002Fme?refresh=1\n",[34,4450,4448],{"__ignoreMap":69},[17,4452,4453],{},"不过刷新接口会直接请求 Duolingo 并写入 KV，不能完全公开。",[17,4455,4456],{},"在 Cloudflare 中添加一个 Secret：",[63,4458,4461],{"className":4459,"code":4460,"language":68,"meta":69},[66],"REFRESH_TOKEN=一段足够长的随机字符串\n",[34,4462,4460],{"__ignoreMap":69},[17,4464,4465],{},"检查请求头：",[63,4467,4469],{"className":131,"code":4468,"language":133,"meta":69,"style":69},"function assertRefreshAuthorized(request, env) {\n  const token = env.REFRESH_TOKEN\n\n  if (!token) {\n    throw new HttpError(\n      500,\n      'server_misconfigured',\n      'Missing REFRESH_TOKEN secret',\n    )\n  }\n\n  const authorization =\n    request.headers.get('Authorization')\n\n  if (authorization !== `Bearer ${token}`) {\n    throw new HttpError(\n      401,\n      'unauthorized',\n      '刷新操作需要 Bearer Token',\n      {\n        'WWW-Authenticate': 'Bearer',\n      },\n    )\n  }\n}\n",[34,4470,4471,4490,4506,4510,4523,4534,4541,4548,4555,4559,4563,4567,4576,4597,4601,4626,4636,4643,4650,4657,4661,4673,4677,4681,4685],{"__ignoreMap":69},[137,4472,4473,4475,4478,4480,4482,4484,4486,4488],{"class":139,"line":140},[137,4474,238],{"class":143},[137,4476,4477],{"class":241}," assertRefreshAuthorized",[137,4479,245],{"class":179},[137,4481,764],{"class":248},[137,4483,252],{"class":179},[137,4485,769],{"class":248},[137,4487,265],{"class":179},[137,4489,180],{"class":179},[137,4491,4492,4494,4497,4499,4501,4503],{"class":139,"line":155},[137,4493,392],{"class":143},[137,4495,4496],{"class":147}," token ",[137,4498,176],{"class":151},[137,4500,769],{"class":147},[137,4502,288],{"class":151},[137,4504,4505],{"class":261},"REFRESH_TOKEN\n",[137,4507,4508],{"class":139,"line":162},[137,4509,165],{"emptyLinePlaceholder":6},[137,4511,4512,4514,4516,4518,4521],{"class":139,"line":168},[137,4513,509],{"class":143},[137,4515,512],{"class":147},[137,4517,515],{"class":151},[137,4519,4520],{"class":147},"token) ",[137,4522,526],{"class":179},[137,4524,4525,4527,4529,4532],{"class":139,"line":183},[137,4526,532],{"class":143},[137,4528,277],{"class":276},[137,4530,4531],{"class":241}," HttpError",[137,4533,540],{"class":147},[137,4535,4536,4539],{"class":139,"line":198},[137,4537,4538],{"class":261},"      500",[137,4540,195],{"class":179},[137,4542,4543,4546],{"class":139,"line":211},[137,4544,4545],{"class":158},"      'server_misconfigured'",[137,4547,195],{"class":179},[137,4549,4550,4553],{"class":139,"line":224},[137,4551,4552],{"class":158},"      'Missing REFRESH_TOKEN secret'",[137,4554,195],{"class":179},[137,4556,4557],{"class":139,"line":230},[137,4558,570],{"class":147},[137,4560,4561],{"class":139,"line":235},[137,4562,576],{"class":179},[137,4564,4565],{"class":139,"line":270},[137,4566,165],{"emptyLinePlaceholder":6},[137,4568,4569,4571,4574],{"class":139,"line":301},[137,4570,392],{"class":143},[137,4572,4573],{"class":147}," authorization ",[137,4575,152],{"class":151},[137,4577,4578,4581,4583,4586,4588,4590,4592,4595],{"class":139,"line":309},[137,4579,4580],{"class":147},"    request",[137,4582,288],{"class":151},[137,4584,4585],{"class":147},"headers",[137,4587,288],{"class":151},[137,4589,4354],{"class":241},[137,4591,245],{"class":147},[137,4593,4594],{"class":158},"'Authorization'",[137,4596,355],{"class":147},[137,4598,4599],{"class":139,"line":319},[137,4600,165],{"emptyLinePlaceholder":6},[137,4602,4603,4605,4608,4610,4613,4615,4618,4620,4622,4624],{"class":139,"line":330},[137,4604,509],{"class":143},[137,4606,4607],{"class":147}," (authorization ",[137,4609,877],{"class":151},[137,4611,4612],{"class":158}," `Bearer ",[137,4614,549],{"class":179},[137,4616,4617],{"class":147},"token",[137,4619,559],{"class":179},[137,4621,562],{"class":158},[137,4623,796],{"class":147},[137,4625,526],{"class":179},[137,4627,4628,4630,4632,4634],{"class":139,"line":343},[137,4629,532],{"class":143},[137,4631,277],{"class":276},[137,4633,4531],{"class":241},[137,4635,540],{"class":147},[137,4637,4638,4641],{"class":139,"line":349},[137,4639,4640],{"class":261},"      401",[137,4642,195],{"class":179},[137,4644,4645,4648],{"class":139,"line":358},[137,4646,4647],{"class":158},"      'unauthorized'",[137,4649,195],{"class":179},[137,4651,4652,4655],{"class":139,"line":363},[137,4653,4654],{"class":158},"      '刷新操作需要 Bearer Token'",[137,4656,195],{"class":179},[137,4658,4659],{"class":139,"line":368},[137,4660,3001],{"class":179},[137,4662,4663,4666,4668,4671],{"class":139,"line":389},[137,4664,4665],{"class":158},"        'WWW-Authenticate'",[137,4667,189],{"class":151},[137,4669,4670],{"class":158}," 'Bearer'",[137,4672,195],{"class":179},[137,4674,4675],{"class":139,"line":408},[137,4676,3048],{"class":179},[137,4678,4679],{"class":139,"line":413},[137,4680,570],{"class":147},[137,4682,4683],{"class":139,"line":439},[137,4684,576],{"class":179},[137,4686,4687],{"class":139,"line":444},[137,4688,227],{"class":179},[17,4690,4691],{},"调用方式：",[63,4693,4697],{"className":4694,"code":4695,"language":4696,"meta":69,"style":69},"language-bash shiki shiki-themes catppuccin-mocha catppuccin-latte","curl \\\n  -H \"Authorization: Bearer 你的刷新密钥\" \\\n  \"https:\u002F\u002F你的-worker地址\u002Fme?refresh=1\"\n","bash",[34,4698,4699,4708,4718],{"__ignoreMap":69},[137,4700,4701,4704],{"class":139,"line":140},[137,4702,4703],{"class":241},"curl",[137,4705,4707],{"class":4706},"s9Cko"," \\\n",[137,4709,4710,4713,4716],{"class":139,"line":155},[137,4711,4712],{"class":158},"  -H",[137,4714,4715],{"class":158}," \"Authorization: Bearer 你的刷新密钥\"",[137,4717,4707],{"class":4706},[137,4719,4720],{"class":139,"line":162},[137,4721,4722],{"class":158},"  \"https:\u002F\u002F你的-worker地址\u002Fme?refresh=1\"\n",[17,4724,4725],{},"普通请求仍然不需要鉴权：",[63,4727,4729],{"className":4728,"code":101,"language":68,"meta":69},[66],[34,4730,101],{"__ignoreMap":69},[17,4732,4733],{},"代码中只接受：",[63,4735,4738],{"className":4736,"code":4737,"language":68,"meta":69},[66],"refresh=1\n",[34,4739,4737],{"__ignoreMap":69},[17,4741,4742],{},"下面这些参数不会触发刷新：",[63,4744,4747],{"className":4745,"code":4746,"language":68,"meta":69},[66],"refresh=false\nrefresh=yes\nrefresh=123\n",[34,4748,4746],{"__ignoreMap":69},[17,4750,4751],{},"强制刷新响应使用：",[63,4753,4756],{"className":4754,"code":4755,"language":68,"meta":69},[66],"Cache-Control: no-store\n",[34,4757,4755],{"__ignoreMap":69},[17,4759,4760],{},"否则浏览器可能直接使用之前缓存的刷新响应，请求根本到不了 Worker。",[76,4762],{},[79,4764,4766],{"id":4765},"使用-cron-定时更新","使用 Cron 定时更新",[17,4768,4769],{},"手动刷新只是补充，正常情况下应该由定时任务更新缓存。",[17,4771,4772],{},"在 Worker 中添加 Cron Trigger：",[63,4774,4777],{"className":4775,"code":4776,"language":68,"meta":69},[66],"0 * * * *\n",[34,4778,4776],{"__ignoreMap":69},[17,4780,4781],{},"表示每小时执行一次。",[17,4783,4784,4785,4788],{},"Worker 中增加 ",[34,4786,4787],{},"scheduled"," 方法：",[63,4790,4792],{"className":131,"code":4791,"language":133,"meta":69,"style":69},"scheduled(_event, env, ctx) {\n  ctx.waitUntil(updateMe(env))\n}\n",[34,4793,4794,4812,4830],{"__ignoreMap":69},[137,4795,4796,4798,4801,4803,4805,4807,4810],{"class":139,"line":140},[137,4797,4787],{"class":241},[137,4799,4800],{"class":147},"(_event",[137,4802,252],{"class":179},[137,4804,769],{"class":147},[137,4806,252],{"class":179},[137,4808,4809],{"class":147}," ctx) ",[137,4811,526],{"class":179},[137,4813,4814,4817,4819,4822,4824,4827],{"class":139,"line":155},[137,4815,4816],{"class":147},"  ctx",[137,4818,288],{"class":151},[137,4820,4821],{"class":241},"waitUntil",[137,4823,245],{"class":147},[137,4825,4826],{"class":241},"updateMe",[137,4828,4829],{"class":147},"(env))\n",[137,4831,4832],{"class":139,"line":162},[137,4833,227],{"class":179},[17,4835,4836,4837,4839],{},"这样即使长时间没有人访问 ",[34,4838,2088],{},"，KV 中的数据也会保持更新。",[17,4841,4842],{},"第一次访问时如果 KV 还是空的，接口会立即请求 Duolingo 初始化，不需要等待下一次 Cron。",[76,4844],{},[79,4846,4847],{"id":4847},"增加超时和简单错误处理",[17,4849,4850],{},"上游请求不能无限等待。",[17,4852,4853],{},"这里给 Duolingo 请求设置八秒超时：",[63,4855,4857],{"className":131,"code":4856,"language":133,"meta":69,"style":69},"const UPSTREAM_TIMEOUT = 8_000\n\nconst response = await fetch(url, {\n  headers: {\n    Accept: 'application\u002Fjson',\n  },\n  signal: AbortSignal.timeout(\n    UPSTREAM_TIMEOUT,\n  ),\n})\n",[34,4858,4859,4871,4875,4893,4902,4913,4917,4934,4941,4948],{"__ignoreMap":69},[137,4860,4861,4863,4866,4868],{"class":139,"line":140},[137,4862,144],{"class":143},[137,4864,4865],{"class":147}," UPSTREAM_TIMEOUT ",[137,4867,176],{"class":151},[137,4869,4870],{"class":261}," 8_000\n",[137,4872,4873],{"class":139,"line":155},[137,4874,165],{"emptyLinePlaceholder":6},[137,4876,4877,4879,4881,4883,4885,4887,4889,4891],{"class":139,"line":162},[137,4878,144],{"class":143},[137,4880,449],{"class":147},[137,4882,176],{"class":151},[137,4884,454],{"class":143},[137,4886,457],{"class":241},[137,4888,460],{"class":147},[137,4890,252],{"class":179},[137,4892,180],{"class":179},[137,4894,4895,4898,4900],{"class":139,"line":168},[137,4896,4897],{"class":147},"  headers",[137,4899,189],{"class":151},[137,4901,180],{"class":179},[137,4903,4904,4907,4909,4911],{"class":139,"line":183},[137,4905,4906],{"class":147},"    Accept",[137,4908,189],{"class":151},[137,4910,484],{"class":158},[137,4912,195],{"class":179},[137,4914,4915],{"class":139,"line":198},[137,4916,1460],{"class":179},[137,4918,4919,4922,4924,4927,4929,4932],{"class":139,"line":211},[137,4920,4921],{"class":147},"  signal",[137,4923,189],{"class":151},[137,4925,4926],{"class":147}," AbortSignal",[137,4928,288],{"class":151},[137,4930,4931],{"class":241},"timeout",[137,4933,540],{"class":147},[137,4935,4936,4939],{"class":139,"line":224},[137,4937,4938],{"class":147},"    UPSTREAM_TIMEOUT",[137,4940,195],{"class":179},[137,4942,4943,4946],{"class":139,"line":230},[137,4944,4945],{"class":147},"  )",[137,4947,195],{"class":179},[137,4949,4950,4952],{"class":139,"line":235},[137,4951,559],{"class":179},[137,4953,355],{"class":147},[17,4955,4956],{},"错误处理不需要做得很重，但至少应该区分：",[27,4958,4959,4965,4971,4977,4983,4989,4995],{},[30,4960,4961,4962],{},"参数错误：",[34,4963,4964],{},"400",[30,4966,4967,4968],{},"未授权刷新：",[34,4969,4970],{},"401",[30,4972,4973,4974],{},"用户不存在：",[34,4975,4976],{},"404",[30,4978,4979,4980],{},"请求过于频繁：",[34,4981,4982],{},"429",[30,4984,4985,4986],{},"Worker 配置错误：",[34,4987,4988],{},"500",[30,4990,4991,4992],{},"Duolingo 请求失败：",[34,4993,4994],{},"502",[30,4996,4997,4998],{},"Duolingo 请求超时：",[34,4999,5000],{},"504",[17,5002,5003],{},"使用一个简单的错误类即可：",[63,5005,5007],{"className":131,"code":5006,"language":133,"meta":69,"style":69},"class HttpError extends Error {\n  constructor(\n    status,\n    code,\n    message = code,\n    headers = {},\n  ) {\n    super(message)\n\n    this.status = status\n    this.code = code\n    this.headers = headers\n  }\n}\n",[34,5008,5009,5024,5031,5037,5044,5056,5065,5071,5079,5083,5099,5113,5127,5131],{"__ignoreMap":69},[137,5010,5011,5014,5017,5020,5022],{"class":139,"line":140},[137,5012,5013],{"class":143},"class",[137,5015,4531],{"class":5016},"szFfR",[137,5018,5019],{"class":143}," extends",[137,5021,537],{"class":5016},[137,5023,180],{"class":179},[137,5025,5026,5029],{"class":139,"line":155},[137,5027,5028],{"class":143},"  constructor",[137,5030,540],{"class":179},[137,5032,5033,5035],{"class":139,"line":162},[137,5034,304],{"class":248},[137,5036,195],{"class":179},[137,5038,5039,5042],{"class":139,"line":168},[137,5040,5041],{"class":248},"    code",[137,5043,195],{"class":179},[137,5045,5046,5049,5051,5054],{"class":139,"line":183},[137,5047,5048],{"class":248},"    message",[137,5050,258],{"class":151},[137,5052,5053],{"class":147}," code",[137,5055,195],{"class":179},[137,5057,5058,5060,5062],{"class":139,"line":198},[137,5059,312],{"class":248},[137,5061,258],{"class":151},[137,5063,5064],{"class":179}," {},\n",[137,5066,5067,5069],{"class":139,"line":211},[137,5068,4945],{"class":179},[137,5070,180],{"class":179},[137,5072,5073,5076],{"class":139,"line":224},[137,5074,5075],{"class":143},"    super",[137,5077,5078],{"class":147},"(message)\n",[137,5080,5081],{"class":139,"line":230},[137,5082,165],{"emptyLinePlaceholder":6},[137,5084,5085,5089,5091,5094,5096],{"class":139,"line":235},[137,5086,5088],{"class":5087},"s3vbe","    this",[137,5090,288],{"class":151},[137,5092,5093],{"class":147},"status ",[137,5095,176],{"class":151},[137,5097,5098],{"class":147}," status\n",[137,5100,5101,5103,5105,5108,5110],{"class":139,"line":270},[137,5102,5088],{"class":5087},[137,5104,288],{"class":151},[137,5106,5107],{"class":147},"code ",[137,5109,176],{"class":151},[137,5111,5112],{"class":147}," code\n",[137,5114,5115,5117,5119,5122,5124],{"class":139,"line":301},[137,5116,5088],{"class":5087},[137,5118,288],{"class":151},[137,5120,5121],{"class":147},"headers ",[137,5123,176],{"class":151},[137,5125,5126],{"class":147}," headers\n",[137,5128,5129],{"class":139,"line":309},[137,5130,576],{"class":179},[137,5132,5133],{"class":139,"line":319},[137,5134,227],{"class":179},[76,5136],{},[79,5138,5139],{"id":5139},"完整代码",[17,5141,5142],{},"下面是整理后的完整版本，可以直接粘贴到 Cloudflare Workers。",[63,5144,5146],{"className":131,"code":5145,"language":133,"meta":69,"style":69},"const DUOLINGO_API =\n  'https:\u002F\u002Fwww.duolingo.com\u002F2017-06-30\u002Fusers'\n\nconst CACHE_TTL = 2 * 60 * 60\nconst UPSTREAM_TIMEOUT = 8_000\nconst USERNAME_MAX_LENGTH = 64\n\nconst corsHeaders = {\n  'Access-Control-Allow-Origin': '*',\n  'Access-Control-Allow-Methods':\n    'GET, OPTIONS',\n  'Access-Control-Allow-Headers':\n    'Content-Type, Authorization',\n  'Access-Control-Max-Age': '86400',\n}\n\nclass HttpError extends Error {\n  constructor(\n    status,\n    code,\n    message = code,\n    headers = {},\n  ) {\n    super(message)\n\n    this.name = 'HttpError'\n    this.status = status\n    this.code = code\n    this.headers = headers\n  }\n}\n\nfunction json(\n  data,\n  status = 200,\n  cacheControl = 'no-store',\n  headers = {},\n) {\n  return new Response(\n    JSON.stringify(data),\n    {\n      status,\n      headers: {\n        ...corsHeaders,\n        ...headers,\n        'Content-Type':\n          'application\u002Fjson; charset=utf-8',\n        'Cache-Control': cacheControl,\n      },\n    },\n  )\n}\n\nfunction isRecord(value) {\n  return Boolean(\n    value &&\n    typeof value === 'object' &&\n    !Array.isArray(value),\n  )\n}\n\nfunction getMeUsername(env) {\n  const username = env.USERNAME?.trim()\n\n  if (!username) {\n    throw new HttpError(\n      500,\n      'server_misconfigured',\n      'Missing USERNAME environment variable',\n    )\n  }\n\n  return username\n}\n\nfunction getMeCacheKey(env) {\n  return `me:${getMeUsername(env).toLowerCase()}:profile`\n}\n\nfunction getRequestUsername(url) {\n  const username =\n    url.searchParams\n      .get('username')\n      ?.trim()\n\n  if (!username) {\n    throw new HttpError(\n      400,\n      'missing_username',\n      '请提供 ?username=用户名',\n    )\n  }\n\n  if (\n    username.length >\n    USERNAME_MAX_LENGTH\n  ) {\n    throw new HttpError(\n      400,\n      'invalid_username',\n      `用户名长度不能超过 ${USERNAME_MAX_LENGTH} 个字符`,\n    )\n  }\n\n  return username\n}\n\nfunction assertRefreshAuthorized(\n  request,\n  env,\n) {\n  const token = env.REFRESH_TOKEN\n\n  if (!token) {\n    throw new HttpError(\n      500,\n      'server_misconfigured',\n      'Missing REFRESH_TOKEN secret',\n    )\n  }\n\n  const authorization =\n    request.headers.get(\n      'Authorization',\n    )\n\n  if (\n    authorization !==\n    `Bearer ${token}`\n  ) {\n    throw new HttpError(\n      401,\n      'unauthorized',\n      '刷新操作需要 Bearer Token',\n      {\n        'WWW-Authenticate': 'Bearer',\n      },\n    )\n  }\n}\n\nfunction normalizePicture(picture) {\n  if (!picture) {\n    return null\n  }\n\n  if (picture.startsWith('\u002F\u002F')) {\n    return `https:${picture}`\n  }\n\n  return picture\n}\n\nfunction normalizeCourse(course) {\n  if (!isRecord(course)) {\n    return null\n  }\n\n  return {\n    id: course.id ?? null,\n    title: course.title ?? null,\n    fromLanguage:\n      course.fromLanguage ?? null,\n    learningLanguage:\n      course.learningLanguage ?? null,\n    xp: course.xp ?? 0,\n  }\n}\n\nfunction getCurrentCourse(user) {\n  const courses = Array.isArray(\n    user.courses,\n  )\n    ? user.courses.filter(isRecord)\n    : []\n\n  return (\n    courses.find(\n      course =>\n        course.id ===\n        user.currentCourseId,\n    ) ??\n    courses.find(\n      course =>\n        course.learningLanguage ===\n        user.learningLanguage,\n    ) ??\n    null\n  )\n}\n\nfunction getDateInTimezone(timeZone) {\n  try {\n    const parts =\n      new Intl.DateTimeFormat(\n        'en-US',\n        {\n          timeZone,\n          year: 'numeric',\n          month: '2-digit',\n          day: '2-digit',\n        },\n      ).formatToParts(new Date())\n\n    const value = type =>\n      parts.find(\n        part => part.type === type,\n      )?.value ?? ''\n\n    return `${value('year')}-${value('month')}-${value('day')}`\n  }\n  catch {\n    return new Date()\n      .toISOString()\n      .slice(0, 10)\n  }\n}\n\nfunction getStreakStatus(user) {\n  const streakData = isRecord(\n    user.streakData,\n  )\n    ? user.streakData\n    : {}\n\n  const current = isRecord(\n    streakData.currentStreak,\n  )\n    ? streakData.currentStreak\n    : {}\n\n  const previous = isRecord(\n    streakData.previousStreak,\n  )\n    ? streakData.previousStreak\n    : null\n\n  const longest = isRecord(\n    streakData.longestStreak,\n  )\n    ? streakData.longestStreak\n    : null\n\n  const timezone =\n    user.timezone ??\n    streakData.updatedTimeZone ??\n    'UTC'\n\n  const statusDate =\n    getDateInTimezone(timezone)\n\n  const completedToday =\n    user.streak_today_increase === true ||\n    user.streak_today_increase === 1 ||\n    user.streak_extended_today === true ||\n    current.lastExtendedDate ===\n      statusDate ||\n    current.endDate === statusDate\n\n  return {\n    completedToday,\n    statusDate,\n\n    current: {\n      length:\n        current.length ??\n        streakData.length ??\n        user.streak ??\n        0,\n      startDate:\n        current.startDate ?? null,\n      endDate:\n        current.endDate ?? null,\n    },\n\n    previous: previous\n      ? {\n          length:\n            previous.length ?? 0,\n          startDate:\n            previous.startDate ?? null,\n          endDate:\n            previous.endDate ?? null,\n        }\n      : null,\n\n    longest: {\n      length:\n        longest?.length ??\n        user.longestStreak ??\n        0,\n      startDate:\n        longest?.startDate ?? null,\n      endDate:\n        longest?.endDate ?? null,\n      achievedDate:\n        longest?.achieveDate ??\n        null,\n    },\n\n    xpGoal:\n      streakData.xpGoal ?? null,\n  }\n}\n\n\u002F\u002F \u002Fsearch 使用的简略信息\nfunction summarizeUser(user) {\n  return {\n    id: user.id ?? null,\n    username:\n      user.username ?? null,\n    name: user.name ?? null,\n    picture:\n      normalizePicture(user.picture),\n\n    streak:\n      user.streakData?.currentStreak\n        ?.length ??\n      user.streak ??\n      0,\n\n    longestStreak:\n      user.streakData?.longestStreak\n        ?.length ??\n      user.longestStreak ??\n      0,\n\n    totalXp: user.totalXp ?? 0,\n\n    currentCourse: normalizeCourse(\n      getCurrentCourse(user),\n    ),\n  }\n}\n\n\u002F\u002F \u002Fdetail 和 \u002Fme 使用的详细信息\nfunction detailUser(user) {\n  const courses = Array.isArray(\n    user.courses,\n  )\n    ? user.courses\n        .map(normalizeCourse)\n        .filter(Boolean)\n    : []\n\n  return {\n    id: user.id ?? null,\n    username:\n      user.username ?? null,\n    name: user.name ?? null,\n    picture:\n      normalizePicture(user.picture),\n\n    account: {\n      createdAt: Number.isFinite(\n        user.creationDate,\n      )\n        ? new Date(\n            user.creationDate * 1000,\n          ).toISOString()\n        : null,\n      hasPlus:\n        Boolean(user.hasPlus),\n    },\n\n    xp: {\n      total:\n        user.totalXp ?? 0,\n      weekly:\n        user.weeklyXp ?? 0,\n      monthly:\n        user.monthlyXp ?? 0,\n    },\n\n    streak:\n      getStreakStatus(user),\n\n    currentCourse:\n      normalizeCourse(\n        getCurrentCourse(user),\n      ),\n\n    courses,\n  }\n}\n\nasync function fetchUsers(username) {\n  const url =\n    new URL(DUOLINGO_API)\n\n  url.searchParams.set(\n    'username',\n    username,\n  )\n\n  let response\n\n  try {\n    response = await fetch(url, {\n      headers: {\n        Accept: 'application\u002Fjson',\n      },\n      signal: AbortSignal.timeout(\n        UPSTREAM_TIMEOUT,\n      ),\n    })\n  }\n  catch (error) {\n    if (\n      error?.name ===\n        'AbortError' ||\n      error?.name ===\n        'TimeoutError'\n    ) {\n      throw new HttpError(\n        504,\n        'upstream_timeout',\n        'Duolingo 请求超时',\n      )\n    }\n\n    throw new HttpError(\n      502,\n      'upstream_error',\n      '请求 Duolingo 失败',\n    )\n  }\n\n  if (!response.ok) {\n    throw new HttpError(\n      502,\n      'upstream_error',\n      `Duolingo API returned ${response.status}`,\n    )\n  }\n\n  let data\n\n  try {\n    data = await response.json()\n  }\n  catch {\n    throw new HttpError(\n      502,\n      'invalid_upstream_response',\n      'Duolingo 返回了无效 JSON',\n    )\n  }\n\n  if (\n    !isRecord(data) ||\n    !Array.isArray(data.users)\n  ) {\n    throw new HttpError(\n      502,\n      'invalid_upstream_response',\n      'Duolingo 返回结构异常',\n    )\n  }\n\n  return data.users.filter(isRecord)\n}\n\nfunction findExactUser(\n  users,\n  username,\n) {\n  const normalizedUsername =\n    username.toLowerCase()\n\n  return users.find(\n    user =>\n      typeof user.username ===\n        'string' &&\n      user.username.toLowerCase() ===\n        normalizedUsername,\n  )\n}\n\nasync function fetchExactUser(\n  username,\n) {\n  const users =\n    await fetchUsers(username)\n\n  const user =\n    findExactUser(\n      users,\n      username,\n    )\n\n  if (!user) {\n    throw new HttpError(\n      404,\n      'user_not_found',\n      `User \"${username}\" not found`,\n    )\n  }\n\n  return user\n}\n\nasync function updateMe(env) {\n  const username =\n    getMeUsername(env)\n\n  const user =\n    await fetchExactUser(username)\n\n  const result = {\n    ...detailUser(user),\n    updatedAt:\n      new Date().toISOString(),\n  }\n\n  await env.DUO_CACHE.put(\n    getMeCacheKey(env),\n    JSON.stringify(result),\n    {\n      expirationTtl:\n        CACHE_TTL,\n    },\n  )\n\n  return result\n}\n\nexport default {\n  async fetch(request, env) {\n    if (\n      request.method ===\n      'OPTIONS'\n    ) {\n      return new Response(null, {\n        status: 204,\n        headers: corsHeaders,\n      })\n    }\n\n    if (\n      request.method !== 'GET'\n    ) {\n      return json(\n        {\n          error:\n            'method_not_allowed',\n        },\n        405,\n        'no-store',\n        {\n          Allow: 'GET, OPTIONS',\n        },\n      )\n    }\n\n    const url =\n      new URL(request.url)\n\n    try {\n      \u002F\u002F 固定用户，每小时更新\n      if (\n        url.pathname === '\u002Fme'\n      ) {\n        \u002F\u002F 是否强制刷新\n        const refresh =\n          url.searchParams.get(\n            'refresh',\n          )\n\n        if (\n          refresh !== null &&\n          refresh !== '1'\n        ) {\n          throw new HttpError(\n            400,\n            'invalid_refresh',\n            'refresh 参数仅支持 1',\n          )\n        }\n\n        const shouldRefresh =\n          refresh === '1'\n\n        if (shouldRefresh) {\n          assertRefreshAuthorized(\n            request,\n            env,\n          )\n        }\n\n        let data = null\n\n        if (!shouldRefresh) {\n          data =\n            await env.DUO_CACHE.get(\n              getMeCacheKey(env),\n              'json',\n            )\n        }\n\n        \u002F\u002F 第一次访问时立即初始化，不用等待 Cron\n        if (!data) {\n          data =\n            await updateMe(env)\n        }\n\n        return json(\n          data,\n          200,\n          shouldRefresh\n            ? 'no-store'\n            : 'public, max-age=300',\n        )\n      }\n\n      \u002F\u002F 简略搜索\n      if (\n        url.pathname ===\n        '\u002Fsearch'\n      ) {\n        const username =\n          getRequestUsername(url)\n\n        const users =\n          await fetchUsers(username)\n\n        return json(\n          {\n            query: username,\n            count:\n              users.length,\n            users:\n              users.map(\n                summarizeUser,\n              ),\n            updatedAt:\n              new Date()\n                .toISOString(),\n          },\n          200,\n          'public, max-age=300',\n        )\n      }\n\n      \u002F\u002F 详细搜索\n      if (\n        url.pathname ===\n        '\u002Fdetail'\n      ) {\n        const username =\n          getRequestUsername(url)\n\n        const user =\n          await fetchExactUser(\n            username,\n          )\n\n        return json(\n          {\n            query: username,\n            user:\n              detailUser(user),\n            updatedAt:\n              new Date()\n                .toISOString(),\n          },\n          200,\n          'public, max-age=300',\n        )\n      }\n\n      return json(\n        {\n          error: 'not_found',\n        },\n        404,\n      )\n    }\n    catch (error) {\n      console.error(error)\n\n      if (\n        error instanceof\n        HttpError\n      ) {\n        return json(\n          {\n            error: error.code,\n            message:\n              error.message,\n          },\n          error.status,\n          'no-store',\n          error.headers,\n        )\n      }\n\n      return json(\n        {\n          error:\n            'internal_error',\n          message:\n            '服务暂时不可用',\n        },\n        500,\n      )\n    }\n  },\n\n  \u002F\u002F cron 定时方法\n  scheduled(_event, env, ctx) {\n    ctx.waitUntil(\n      updateMe(env),\n    )\n  },\n}\n",[34,5147,5148,5156,5160,5164,5182,5192,5204,5208,5218,5228,5234,5241,5247,5254,5266,5270,5274,5286,5292,5298,5304,5314,5322,5328,5334,5338,5351,5363,5375,5387,5391,5395,5399,5407,5414,5425,5437,5445,5451,5461,5473,5477,5484,5493,5502,5510,5517,5524,5536,5540,5544,5548,5552,5556,5571,5579,5586,5600,5617,5621,5625,5629,5644,5664,5668,5681,5691,5697,5703,5710,5714,5718,5722,5729,5733,5737,5751,5778,5782,5786,5802,5810,5820,5832,5841,5845,5857,5867,5874,5881,5888,5892,5896,5900,5906,5917,5922,5929,5939,5945,5952,5969,5973,5977,5981,5987,5991,5995,6003,6010,6017,6023,6037,6041,6053,6063,6069,6075,6081,6085,6089,6094,6103,6118,6126,6131,6136,6143,6152,6166,6173,6184,6191,6198,6205,6210,6221,6226,6231,6236,6241,6246,6261,6274,6281,6286,6291,6310,6325,6330,6335,6342,6347,6352,6367,6384,6391,6396,6401,6408,6427,6446,6453,6468,6475,6490,6509,6514,6519,6524,6539,6556,6568,6573,6591,6598,6603,6610,6621,6628,6639,6650,6657,6668,6675,6686,6697,6704,6709,6714,6719,6724,6739,6746,6755,6769,6777,6782,6790,6802,6814,6826,6831,6848,6853,6866,6877,6896,6909,6914,6963,6968,6975,6986,6995,7012,7017,7022,7027,7042,7055,7066,7071,7082,7089,7094,7107,7118,7123,7134,7141,7146,7159,7171,7176,7187,7194,7199,7212,7223,7228,7239,7246,7251,7260,7271,7282,7287,7292,7301,7308,7313,7322,7337,7352,7367,7378,7386,7399,7404,7411,7418,7425,7430,7439,7446,7457,7468,7479,7486,7493,7508,7515,7530,7535,7540,7549,7556,7563,7578,7585,7600,7607,7622,7627,7636,7641,7650,7657,7668,7679,7686,7693,7708,7715,7730,7737,7748,7756,7761,7766,7773,7789,7794,7799,7804,7811,7826,7833,7852,7859,7874,7893,7900,7914,7919,7926,7939,7949,7960,7967,7972,7979,7992,8001,8012,8019,8024,8043,8048,8059,8068,8075,8080,8085,8090,8096,8111,8128,8139,8144,8155,8164,8173,8180,8185,8192,8211,8218,8233,8252,8259,8272,8277,8286,8301,8313,8318,8329,8344,8355,8364,8371,8385,8390,8395,8404,8411,8426,8433,8448,8455,8470,8475,8480,8487,8497,8502,8509,8517,8527,8534,8539,8546,8551,8556,8561,8579,8588,8598,8603,8618,8626,8633,8638,8643,8652,8657,8664,8682,8691,8703,8708,8724,8732,8739,8747,8752,8762,8769,8781,8789,8800,8806,8813,8825,8833,8841,8849,8854,8859,8864,8875,8883,8891,8899,8904,8909,8914,8931,8942,8949,8956,8975,8980,8985,8990,8998,9003,9010,9028,9033,9040,9051,9058,9066,9074,9079,9084,9089,9096,9108,9125,9132,9143,9150,9157,9165,9170,9175,9180,9197,9202,9207,9216,9224,9232,9239,9248,9259,9264,9277,9284,9297,9305,9322,9329,9334,9339,9344,9355,9362,9369,9378,9388,9393,9402,9410,9418,9425,9430,9435,9449,9460,9468,9476,9493,9498,9503,9508,9516,9521,9526,9543,9552,9560,9565,9574,9583,9588,9599,9610,9617,9634,9639,9644,9661,9670,9683,9688,9695,9703,9708,9713,9718,9725,9730,9735,9744,9763,9770,9782,9788,9795,9812,9823,9834,9841,9846,9851,9858,9872,9879,9888,9893,9900,9908,9913,9920,9928,9933,9945,9950,9955,9960,9965,9974,9987,9992,9999,10005,10012,10027,10035,10041,10052,10068,10076,10082,10087,10095,10108,10118,10126,10138,10146,10154,10162,10167,10172,10177,10187,10197,10202,10216,10224,10232,10240,10245,10250,10255,10267,10272,10287,10296,10314,10328,10336,10342,10347,10352,10358,10373,10380,10393,10398,10403,10412,10419,10427,10433,10442,10453,10458,10463,10468,10474,10481,10492,10498,10505,10514,10526,10531,10540,10554,10559,10568,10573,10585,10593,10606,10614,10625,10633,10641,10649,10659,10671,10676,10683,10691,10696,10701,10706,10712,10719,10730,10736,10743,10752,10763,10768,10777,10786,10794,10799,10804,10813,10818,10829,10836,10850,10857,10866,10877,10882,10889,10896,10901,10906,10911,10920,10925,10936,10941,10948,10953,10958,10972,10988,10993,11000,11009,11015,11022,11031,11036,11052,11060,11073,11078,11089,11097,11108,11113,11118,11123,11132,11137,11144,11152,11160,11168,11173,11180,11185,11190,11195,11200,11206,11230,11242,11256,11261,11266],{"__ignoreMap":69},[137,5149,5150,5152,5154],{"class":139,"line":140},[137,5151,144],{"class":143},[137,5153,148],{"class":147},[137,5155,152],{"class":151},[137,5157,5158],{"class":139,"line":155},[137,5159,159],{"class":158},[137,5161,5162],{"class":139,"line":162},[137,5163,165],{"emptyLinePlaceholder":6},[137,5165,5166,5168,5170,5172,5174,5176,5178,5180],{"class":139,"line":168},[137,5167,144],{"class":143},[137,5169,4112],{"class":147},[137,5171,176],{"class":151},[137,5173,4117],{"class":261},[137,5175,4120],{"class":151},[137,5177,4123],{"class":261},[137,5179,4120],{"class":151},[137,5181,4128],{"class":261},[137,5183,5184,5186,5188,5190],{"class":139,"line":183},[137,5185,144],{"class":143},[137,5187,4865],{"class":147},[137,5189,176],{"class":151},[137,5191,4870],{"class":261},[137,5193,5194,5196,5199,5201],{"class":139,"line":198},[137,5195,144],{"class":143},[137,5197,5198],{"class":147}," USERNAME_MAX_LENGTH ",[137,5200,176],{"class":151},[137,5202,5203],{"class":261}," 64\n",[137,5205,5206],{"class":139,"line":211},[137,5207,165],{"emptyLinePlaceholder":6},[137,5209,5210,5212,5214,5216],{"class":139,"line":224},[137,5211,144],{"class":143},[137,5213,173],{"class":147},[137,5215,176],{"class":151},[137,5217,180],{"class":179},[137,5219,5220,5222,5224,5226],{"class":139,"line":230},[137,5221,186],{"class":158},[137,5223,189],{"class":151},[137,5225,192],{"class":158},[137,5227,195],{"class":179},[137,5229,5230,5232],{"class":139,"line":235},[137,5231,201],{"class":158},[137,5233,2233],{"class":151},[137,5235,5236,5239],{"class":139,"line":270},[137,5237,5238],{"class":158},"    'GET, OPTIONS'",[137,5240,195],{"class":179},[137,5242,5243,5245],{"class":139,"line":301},[137,5244,214],{"class":158},[137,5246,2233],{"class":151},[137,5248,5249,5252],{"class":139,"line":309},[137,5250,5251],{"class":158},"    'Content-Type, Authorization'",[137,5253,195],{"class":179},[137,5255,5256,5259,5261,5264],{"class":139,"line":319},[137,5257,5258],{"class":158},"  'Access-Control-Max-Age'",[137,5260,189],{"class":151},[137,5262,5263],{"class":158}," '86400'",[137,5265,195],{"class":179},[137,5267,5268],{"class":139,"line":330},[137,5269,227],{"class":179},[137,5271,5272],{"class":139,"line":343},[137,5273,165],{"emptyLinePlaceholder":6},[137,5275,5276,5278,5280,5282,5284],{"class":139,"line":349},[137,5277,5013],{"class":143},[137,5279,4531],{"class":5016},[137,5281,5019],{"class":143},[137,5283,537],{"class":5016},[137,5285,180],{"class":179},[137,5287,5288,5290],{"class":139,"line":358},[137,5289,5028],{"class":143},[137,5291,540],{"class":179},[137,5293,5294,5296],{"class":139,"line":363},[137,5295,304],{"class":248},[137,5297,195],{"class":179},[137,5299,5300,5302],{"class":139,"line":368},[137,5301,5041],{"class":248},[137,5303,195],{"class":179},[137,5305,5306,5308,5310,5312],{"class":139,"line":389},[137,5307,5048],{"class":248},[137,5309,258],{"class":151},[137,5311,5053],{"class":147},[137,5313,195],{"class":179},[137,5315,5316,5318,5320],{"class":139,"line":408},[137,5317,312],{"class":248},[137,5319,258],{"class":151},[137,5321,5064],{"class":179},[137,5323,5324,5326],{"class":139,"line":413},[137,5325,4945],{"class":179},[137,5327,180],{"class":179},[137,5329,5330,5332],{"class":139,"line":439},[137,5331,5075],{"class":143},[137,5333,5078],{"class":147},[137,5335,5336],{"class":139,"line":444},[137,5337,165],{"emptyLinePlaceholder":6},[137,5339,5340,5342,5344,5346,5348],{"class":139,"line":467},[137,5341,5088],{"class":5087},[137,5343,288],{"class":151},[137,5345,1313],{"class":147},[137,5347,176],{"class":151},[137,5349,5350],{"class":158}," 'HttpError'\n",[137,5352,5353,5355,5357,5359,5361],{"class":139,"line":476},[137,5354,5088],{"class":5087},[137,5356,288],{"class":151},[137,5358,5093],{"class":147},[137,5360,176],{"class":151},[137,5362,5098],{"class":147},[137,5364,5365,5367,5369,5371,5373],{"class":139,"line":489},[137,5366,5088],{"class":5087},[137,5368,288],{"class":151},[137,5370,5107],{"class":147},[137,5372,176],{"class":151},[137,5374,5112],{"class":147},[137,5376,5377,5379,5381,5383,5385],{"class":139,"line":494},[137,5378,5088],{"class":5087},[137,5380,288],{"class":151},[137,5382,5121],{"class":147},[137,5384,176],{"class":151},[137,5386,5126],{"class":147},[137,5388,5389],{"class":139,"line":501},[137,5390,576],{"class":179},[137,5392,5393],{"class":139,"line":506},[137,5394,227],{"class":179},[137,5396,5397],{"class":139,"line":529},[137,5398,165],{"emptyLinePlaceholder":6},[137,5400,5401,5403,5405],{"class":139,"line":543},[137,5402,238],{"class":143},[137,5404,242],{"class":241},[137,5406,540],{"class":179},[137,5408,5409,5412],{"class":139,"line":567},[137,5410,5411],{"class":248},"  data",[137,5413,195],{"class":179},[137,5415,5416,5419,5421,5423],{"class":139,"line":573},[137,5417,5418],{"class":248},"  status",[137,5420,258],{"class":151},[137,5422,262],{"class":261},[137,5424,195],{"class":179},[137,5426,5427,5430,5432,5435],{"class":139,"line":579},[137,5428,5429],{"class":248},"  cacheControl",[137,5431,258],{"class":151},[137,5433,5434],{"class":158}," 'no-store'",[137,5436,195],{"class":179},[137,5438,5439,5441,5443],{"class":139,"line":584},[137,5440,4897],{"class":248},[137,5442,258],{"class":151},[137,5444,5064],{"class":179},[137,5446,5447,5449],{"class":139,"line":607},[137,5448,265],{"class":179},[137,5450,180],{"class":179},[137,5452,5453,5455,5457,5459],{"class":139,"line":612},[137,5454,273],{"class":143},[137,5456,277],{"class":276},[137,5458,280],{"class":241},[137,5460,540],{"class":147},[137,5462,5463,5465,5467,5469,5471],{"class":139,"line":638},[137,5464,4275],{"class":261},[137,5466,288],{"class":151},[137,5468,291],{"class":241},[137,5470,294],{"class":147},[137,5472,195],{"class":179},[137,5474,5475],{"class":139,"line":652},[137,5476,4289],{"class":179},[137,5478,5479,5482],{"class":139,"line":661},[137,5480,5481],{"class":147},"      status",[137,5483,195],{"class":179},[137,5485,5486,5489,5491],{"class":139,"line":666},[137,5487,5488],{"class":147},"      headers",[137,5490,189],{"class":151},[137,5492,180],{"class":179},[137,5494,5495,5498,5500],{"class":139,"line":681},[137,5496,5497],{"class":151},"        ...",[137,5499,325],{"class":147},[137,5501,195],{"class":179},[137,5503,5504,5506,5508],{"class":139,"line":690},[137,5505,5497],{"class":151},[137,5507,4585],{"class":147},[137,5509,195],{"class":179},[137,5511,5512,5515],{"class":139,"line":712},[137,5513,5514],{"class":158},"        'Content-Type'",[137,5516,2233],{"class":151},[137,5518,5519,5522],{"class":139,"line":727},[137,5520,5521],{"class":158},"          'application\u002Fjson; charset=utf-8'",[137,5523,195],{"class":179},[137,5525,5526,5529,5531,5534],{"class":139,"line":733},[137,5527,5528],{"class":158},"        'Cache-Control'",[137,5530,189],{"class":151},[137,5532,5533],{"class":147}," cacheControl",[137,5535,195],{"class":179},[137,5537,5538],{"class":139,"line":738},[137,5539,3048],{"class":179},[137,5541,5542],{"class":139,"line":743},[137,5543,346],{"class":179},[137,5545,5546],{"class":139,"line":754},[137,5547,730],{"class":147},[137,5549,5550],{"class":139,"line":776},[137,5551,227],{"class":179},[137,5553,5554],{"class":139,"line":801},[137,5555,165],{"emptyLinePlaceholder":6},[137,5557,5558,5560,5563,5565,5567,5569],{"class":139,"line":820},[137,5559,238],{"class":143},[137,5561,5562],{"class":241}," isRecord",[137,5564,245],{"class":179},[137,5566,3149],{"class":248},[137,5568,265],{"class":179},[137,5570,180],{"class":179},[137,5572,5573,5575,5577],{"class":139,"line":833},[137,5574,273],{"class":143},[137,5576,2637],{"class":241},[137,5578,540],{"class":147},[137,5580,5581,5584],{"class":139,"line":847},[137,5582,5583],{"class":147},"    value ",[137,5585,3287],{"class":151},[137,5587,5588,5590,5593,5595,5598],{"class":139,"line":855},[137,5589,3292],{"class":151},[137,5591,5592],{"class":147}," value ",[137,5594,790],{"class":151},[137,5596,5597],{"class":158}," 'object'",[137,5599,2877],{"class":151},[137,5601,5602,5605,5608,5610,5612,5615],{"class":139,"line":861},[137,5603,5604],{"class":151},"    !",[137,5606,5607],{"class":147},"Array",[137,5609,288],{"class":151},[137,5611,627],{"class":241},[137,5613,5614],{"class":147},"(value)",[137,5616,195],{"class":179},[137,5618,5619],{"class":139,"line":866},[137,5620,730],{"class":147},[137,5622,5623],{"class":139,"line":887},[137,5624,227],{"class":179},[137,5626,5627],{"class":139,"line":896},[137,5628,165],{"emptyLinePlaceholder":6},[137,5630,5631,5633,5636,5638,5640,5642],{"class":139,"line":902},[137,5632,238],{"class":143},[137,5634,5635],{"class":241}," getMeUsername",[137,5637,245],{"class":179},[137,5639,4057],{"class":248},[137,5641,265],{"class":179},[137,5643,180],{"class":179},[137,5645,5646,5648,5650,5652,5654,5656,5658,5660,5662],{"class":139,"line":915},[137,5647,392],{"class":143},[137,5649,1053],{"class":147},[137,5651,176],{"class":151},[137,5653,769],{"class":147},[137,5655,288],{"class":151},[137,5657,36],{"class":261},[137,5659,700],{"class":151},[137,5661,1066],{"class":241},[137,5663,604],{"class":147},[137,5665,5666],{"class":139,"line":921},[137,5667,165],{"emptyLinePlaceholder":6},[137,5669,5670,5672,5674,5676,5679],{"class":139,"line":929},[137,5671,509],{"class":143},[137,5673,512],{"class":147},[137,5675,515],{"class":151},[137,5677,5678],{"class":147},"username) ",[137,5680,526],{"class":179},[137,5682,5683,5685,5687,5689],{"class":139,"line":935},[137,5684,532],{"class":143},[137,5686,277],{"class":276},[137,5688,4531],{"class":241},[137,5690,540],{"class":147},[137,5692,5693,5695],{"class":139,"line":940},[137,5694,4538],{"class":261},[137,5696,195],{"class":179},[137,5698,5699,5701],{"class":139,"line":945},[137,5700,4545],{"class":158},[137,5702,195],{"class":179},[137,5704,5705,5708],{"class":139,"line":967},[137,5706,5707],{"class":158},"      'Missing USERNAME environment variable'",[137,5709,195],{"class":179},[137,5711,5712],{"class":139,"line":972},[137,5713,570],{"class":147},[137,5715,5716],{"class":139,"line":994},[137,5717,576],{"class":179},[137,5719,5720],{"class":139,"line":1003},[137,5721,165],{"emptyLinePlaceholder":6},[137,5723,5724,5726],{"class":139,"line":1008},[137,5725,273],{"class":143},[137,5727,5728],{"class":147}," username\n",[137,5730,5731],{"class":139,"line":1020},[137,5732,227],{"class":179},[137,5734,5735],{"class":139,"line":1025},[137,5736,165],{"emptyLinePlaceholder":6},[137,5738,5739,5741,5743,5745,5747,5749],{"class":139,"line":1033},[137,5740,238],{"class":143},[137,5742,4052],{"class":241},[137,5744,245],{"class":179},[137,5746,4057],{"class":248},[137,5748,265],{"class":179},[137,5750,180],{"class":179},[137,5752,5753,5755,5757,5759,5762,5764,5766,5768,5770,5772,5774,5776],{"class":139,"line":1038},[137,5754,273],{"class":143},[137,5756,4068],{"class":158},[137,5758,549],{"class":179},[137,5760,5761],{"class":241},"getMeUsername",[137,5763,245],{"class":158},[137,5765,4057],{"class":147},[137,5767,265],{"class":158},[137,5769,288],{"class":151},[137,5771,703],{"class":241},[137,5773,722],{"class":158},[137,5775,559],{"class":179},[137,5777,4093],{"class":158},[137,5779,5780],{"class":139,"line":1043},[137,5781,227],{"class":179},[137,5783,5784],{"class":139,"line":1048},[137,5785,165],{"emptyLinePlaceholder":6},[137,5787,5788,5790,5793,5795,5798,5800],{"class":139,"line":1071},[137,5789,238],{"class":143},[137,5791,5792],{"class":241}," getRequestUsername",[137,5794,245],{"class":179},[137,5796,5797],{"class":248},"url",[137,5799,265],{"class":179},[137,5801,180],{"class":179},[137,5803,5804,5806,5808],{"class":139,"line":1076},[137,5805,392],{"class":143},[137,5807,1053],{"class":147},[137,5809,152],{"class":151},[137,5811,5812,5815,5817],{"class":139,"line":1091},[137,5813,5814],{"class":147},"    url",[137,5816,288],{"class":151},[137,5818,5819],{"class":147},"searchParams\n",[137,5821,5822,5824,5826,5828,5830],{"class":139,"line":1100},[137,5823,3217],{"class":151},[137,5825,4354],{"class":241},[137,5827,245],{"class":147},[137,5829,431],{"class":158},[137,5831,355],{"class":147},[137,5833,5834,5837,5839],{"class":139,"line":1105},[137,5835,5836],{"class":151},"      ?.",[137,5838,1066],{"class":241},[137,5840,604],{"class":147},[137,5842,5843],{"class":139,"line":1117},[137,5844,165],{"emptyLinePlaceholder":6},[137,5846,5847,5849,5851,5853,5855],{"class":139,"line":1122},[137,5848,509],{"class":143},[137,5850,512],{"class":147},[137,5852,515],{"class":151},[137,5854,5678],{"class":147},[137,5856,526],{"class":179},[137,5858,5859,5861,5863,5865],{"class":139,"line":1130},[137,5860,532],{"class":143},[137,5862,277],{"class":276},[137,5864,4531],{"class":241},[137,5866,540],{"class":147},[137,5868,5869,5872],{"class":139,"line":1135},[137,5870,5871],{"class":261},"      400",[137,5873,195],{"class":179},[137,5875,5876,5879],{"class":139,"line":1140},[137,5877,5878],{"class":158},"      'missing_username'",[137,5880,195],{"class":179},[137,5882,5883,5886],{"class":139,"line":1145},[137,5884,5885],{"class":158},"      '请提供 ?username=用户名'",[137,5887,195],{"class":179},[137,5889,5890],{"class":139,"line":1153},[137,5891,570],{"class":147},[137,5893,5894],{"class":139,"line":1174},[137,5895,576],{"class":179},[137,5897,5898],{"class":139,"line":1179},[137,5899,165],{"emptyLinePlaceholder":6},[137,5901,5902,5904],{"class":139,"line":1196},[137,5903,509],{"class":143},[137,5905,1972],{"class":147},[137,5907,5908,5910,5912,5914],{"class":139,"line":1206},[137,5909,2169],{"class":147},[137,5911,288],{"class":151},[137,5913,2252],{"class":147},[137,5915,5916],{"class":151},">\n",[137,5918,5919],{"class":139,"line":1212},[137,5920,5921],{"class":147},"    USERNAME_MAX_LENGTH\n",[137,5923,5924,5927],{"class":139,"line":1225},[137,5925,5926],{"class":147},"  ) ",[137,5928,526],{"class":179},[137,5930,5931,5933,5935,5937],{"class":139,"line":1231},[137,5932,532],{"class":143},[137,5934,277],{"class":276},[137,5936,4531],{"class":241},[137,5938,540],{"class":147},[137,5940,5941,5943],{"class":139,"line":1239},[137,5942,5871],{"class":261},[137,5944,195],{"class":179},[137,5946,5947,5950],{"class":139,"line":1245},[137,5948,5949],{"class":158},"      'invalid_username'",[137,5951,195],{"class":179},[137,5953,5954,5957,5959,5962,5964,5967],{"class":139,"line":1251},[137,5955,5956],{"class":158},"      `用户名长度不能超过 ",[137,5958,549],{"class":179},[137,5960,5961],{"class":147},"USERNAME_MAX_LENGTH",[137,5963,559],{"class":179},[137,5965,5966],{"class":158}," 个字符`",[137,5968,195],{"class":179},[137,5970,5971],{"class":139,"line":1256},[137,5972,570],{"class":147},[137,5974,5975],{"class":139,"line":1267},[137,5976,576],{"class":179},[137,5978,5979],{"class":139,"line":1285},[137,5980,165],{"emptyLinePlaceholder":6},[137,5982,5983,5985],{"class":139,"line":1301},[137,5984,273],{"class":143},[137,5986,5728],{"class":147},[137,5988,5989],{"class":139,"line":1324},[137,5990,227],{"class":179},[137,5992,5993],{"class":139,"line":1345},[137,5994,165],{"emptyLinePlaceholder":6},[137,5996,5997,5999,6001],{"class":139,"line":1367},[137,5998,238],{"class":143},[137,6000,4477],{"class":241},[137,6002,540],{"class":179},[137,6004,6005,6008],{"class":139,"line":1388},[137,6006,6007],{"class":248},"  request",[137,6009,195],{"class":179},[137,6011,6012,6015],{"class":139,"line":1395},[137,6013,6014],{"class":248},"  env",[137,6016,195],{"class":179},[137,6018,6019,6021],{"class":139,"line":1400},[137,6020,265],{"class":179},[137,6022,180],{"class":179},[137,6024,6025,6027,6029,6031,6033,6035],{"class":139,"line":1408},[137,6026,392],{"class":143},[137,6028,4496],{"class":147},[137,6030,176],{"class":151},[137,6032,769],{"class":147},[137,6034,288],{"class":151},[137,6036,4505],{"class":261},[137,6038,6039],{"class":139,"line":1417},[137,6040,165],{"emptyLinePlaceholder":6},[137,6042,6043,6045,6047,6049,6051],{"class":139,"line":1422},[137,6044,509],{"class":143},[137,6046,512],{"class":147},[137,6048,515],{"class":151},[137,6050,4520],{"class":147},[137,6052,526],{"class":179},[137,6054,6055,6057,6059,6061],{"class":139,"line":1434},[137,6056,532],{"class":143},[137,6058,277],{"class":276},[137,6060,4531],{"class":241},[137,6062,540],{"class":147},[137,6064,6065,6067],{"class":139,"line":1439},[137,6066,4538],{"class":261},[137,6068,195],{"class":179},[137,6070,6071,6073],{"class":139,"line":1447},[137,6072,4545],{"class":158},[137,6074,195],{"class":179},[137,6076,6077,6079],{"class":139,"line":1452},[137,6078,4552],{"class":158},[137,6080,195],{"class":179},[137,6082,6083],{"class":139,"line":1457},[137,6084,570],{"class":147},[137,6086,6087],{"class":139,"line":1463},[137,6088,576],{"class":179},[137,6090,6092],{"class":139,"line":6091},121,[137,6093,165],{"emptyLinePlaceholder":6},[137,6095,6097,6099,6101],{"class":139,"line":6096},122,[137,6098,392],{"class":143},[137,6100,4573],{"class":147},[137,6102,152],{"class":151},[137,6104,6106,6108,6110,6112,6114,6116],{"class":139,"line":6105},123,[137,6107,4580],{"class":147},[137,6109,288],{"class":151},[137,6111,4585],{"class":147},[137,6113,288],{"class":151},[137,6115,4354],{"class":241},[137,6117,540],{"class":147},[137,6119,6121,6124],{"class":139,"line":6120},124,[137,6122,6123],{"class":158},"      'Authorization'",[137,6125,195],{"class":179},[137,6127,6129],{"class":139,"line":6128},125,[137,6130,570],{"class":147},[137,6132,6134],{"class":139,"line":6133},126,[137,6135,165],{"emptyLinePlaceholder":6},[137,6137,6139,6141],{"class":139,"line":6138},127,[137,6140,509],{"class":143},[137,6142,1972],{"class":147},[137,6144,6146,6149],{"class":139,"line":6145},128,[137,6147,6148],{"class":147},"    authorization ",[137,6150,6151],{"class":151},"!==\n",[137,6153,6155,6158,6160,6162,6164],{"class":139,"line":6154},129,[137,6156,6157],{"class":158},"    `Bearer ",[137,6159,549],{"class":179},[137,6161,4617],{"class":147},[137,6163,559],{"class":179},[137,6165,1697],{"class":158},[137,6167,6169,6171],{"class":139,"line":6168},130,[137,6170,5926],{"class":147},[137,6172,526],{"class":179},[137,6174,6176,6178,6180,6182],{"class":139,"line":6175},131,[137,6177,532],{"class":143},[137,6179,277],{"class":276},[137,6181,4531],{"class":241},[137,6183,540],{"class":147},[137,6185,6187,6189],{"class":139,"line":6186},132,[137,6188,4640],{"class":261},[137,6190,195],{"class":179},[137,6192,6194,6196],{"class":139,"line":6193},133,[137,6195,4647],{"class":158},[137,6197,195],{"class":179},[137,6199,6201,6203],{"class":139,"line":6200},134,[137,6202,4654],{"class":158},[137,6204,195],{"class":179},[137,6206,6208],{"class":139,"line":6207},135,[137,6209,3001],{"class":179},[137,6211,6213,6215,6217,6219],{"class":139,"line":6212},136,[137,6214,4665],{"class":158},[137,6216,189],{"class":151},[137,6218,4670],{"class":158},[137,6220,195],{"class":179},[137,6222,6224],{"class":139,"line":6223},137,[137,6225,3048],{"class":179},[137,6227,6229],{"class":139,"line":6228},138,[137,6230,570],{"class":147},[137,6232,6234],{"class":139,"line":6233},139,[137,6235,576],{"class":179},[137,6237,6239],{"class":139,"line":6238},140,[137,6240,227],{"class":179},[137,6242,6244],{"class":139,"line":6243},141,[137,6245,165],{"emptyLinePlaceholder":6},[137,6247,6249,6251,6253,6255,6257,6259],{"class":139,"line":6248},142,[137,6250,238],{"class":143},[137,6252,1622],{"class":241},[137,6254,245],{"class":179},[137,6256,1543],{"class":248},[137,6258,265],{"class":179},[137,6260,180],{"class":179},[137,6262,6264,6266,6268,6270,6272],{"class":139,"line":6263},143,[137,6265,509],{"class":143},[137,6267,512],{"class":147},[137,6269,515],{"class":151},[137,6271,1641],{"class":147},[137,6273,526],{"class":179},[137,6275,6277,6279],{"class":139,"line":6276},144,[137,6278,1648],{"class":143},[137,6280,1651],{"class":143},[137,6282,6284],{"class":139,"line":6283},145,[137,6285,576],{"class":179},[137,6287,6289],{"class":139,"line":6288},146,[137,6290,165],{"emptyLinePlaceholder":6},[137,6292,6294,6296,6298,6300,6302,6304,6306,6308],{"class":139,"line":6293},147,[137,6295,509],{"class":143},[137,6297,1666],{"class":147},[137,6299,288],{"class":151},[137,6301,1671],{"class":241},[137,6303,245],{"class":147},[137,6305,1676],{"class":158},[137,6307,1679],{"class":147},[137,6309,526],{"class":179},[137,6311,6313,6315,6317,6319,6321,6323],{"class":139,"line":6312},148,[137,6314,1648],{"class":143},[137,6316,1688],{"class":158},[137,6318,549],{"class":179},[137,6320,1543],{"class":147},[137,6322,559],{"class":179},[137,6324,1697],{"class":158},[137,6326,6328],{"class":139,"line":6327},149,[137,6329,576],{"class":179},[137,6331,6333],{"class":139,"line":6332},150,[137,6334,165],{"emptyLinePlaceholder":6},[137,6336,6338,6340],{"class":139,"line":6337},151,[137,6339,273],{"class":143},[137,6341,1712],{"class":147},[137,6343,6345],{"class":139,"line":6344},152,[137,6346,227],{"class":179},[137,6348,6350],{"class":139,"line":6349},153,[137,6351,165],{"emptyLinePlaceholder":6},[137,6353,6355,6357,6359,6361,6363,6365],{"class":139,"line":6354},154,[137,6356,238],{"class":143},[137,6358,1743],{"class":241},[137,6360,245],{"class":179},[137,6362,1748],{"class":248},[137,6364,265],{"class":179},[137,6366,180],{"class":179},[137,6368,6370,6372,6374,6376,6379,6382],{"class":139,"line":6369},155,[137,6371,509],{"class":143},[137,6373,512],{"class":147},[137,6375,515],{"class":151},[137,6377,6378],{"class":241},"isRecord",[137,6380,6381],{"class":147},"(course)) ",[137,6383,526],{"class":179},[137,6385,6387,6389],{"class":139,"line":6386},156,[137,6388,1648],{"class":143},[137,6390,1651],{"class":143},[137,6392,6394],{"class":139,"line":6393},157,[137,6395,576],{"class":179},[137,6397,6399],{"class":139,"line":6398},158,[137,6400,165],{"emptyLinePlaceholder":6},[137,6402,6404,6406],{"class":139,"line":6403},159,[137,6405,273],{"class":143},[137,6407,180],{"class":179},[137,6409,6411,6413,6415,6417,6419,6421,6423,6425],{"class":139,"line":6410},160,[137,6412,1790],{"class":147},[137,6414,189],{"class":151},[137,6416,1795],{"class":147},[137,6418,288],{"class":151},[137,6420,1800],{"class":147},[137,6422,1316],{"class":151},[137,6424,1319],{"class":143},[137,6426,195],{"class":179},[137,6428,6430,6432,6434,6436,6438,6440,6442,6444],{"class":139,"line":6429},161,[137,6431,1811],{"class":147},[137,6433,189],{"class":151},[137,6435,1795],{"class":147},[137,6437,288],{"class":151},[137,6439,1820],{"class":147},[137,6441,1316],{"class":151},[137,6443,1319],{"class":143},[137,6445,195],{"class":179},[137,6447,6449,6451],{"class":139,"line":6448},162,[137,6450,1831],{"class":147},[137,6452,2233],{"class":151},[137,6454,6456,6458,6460,6462,6464,6466],{"class":139,"line":6455},163,[137,6457,1988],{"class":147},[137,6459,288],{"class":151},[137,6461,1840],{"class":147},[137,6463,1316],{"class":151},[137,6465,1319],{"class":143},[137,6467,195],{"class":179},[137,6469,6471,6473],{"class":139,"line":6470},164,[137,6472,1851],{"class":147},[137,6474,2233],{"class":151},[137,6476,6478,6480,6482,6484,6486,6488],{"class":139,"line":6477},165,[137,6479,1988],{"class":147},[137,6481,288],{"class":151},[137,6483,1860],{"class":147},[137,6485,1316],{"class":151},[137,6487,1319],{"class":143},[137,6489,195],{"class":179},[137,6491,6493,6495,6497,6499,6501,6503,6505,6507],{"class":139,"line":6492},166,[137,6494,1871],{"class":147},[137,6496,189],{"class":151},[137,6498,1795],{"class":147},[137,6500,288],{"class":151},[137,6502,1880],{"class":147},[137,6504,1316],{"class":151},[137,6506,1362],{"class":261},[137,6508,195],{"class":179},[137,6510,6512],{"class":139,"line":6511},167,[137,6513,576],{"class":179},[137,6515,6517],{"class":139,"line":6516},168,[137,6518,227],{"class":179},[137,6520,6522],{"class":139,"line":6521},169,[137,6523,165],{"emptyLinePlaceholder":6},[137,6525,6527,6529,6531,6533,6535,6537],{"class":139,"line":6526},170,[137,6528,238],{"class":143},[137,6530,1913],{"class":241},[137,6532,245],{"class":179},[137,6534,1189],{"class":248},[137,6536,265],{"class":179},[137,6538,180],{"class":179},[137,6540,6542,6544,6546,6548,6550,6552,6554],{"class":139,"line":6541},171,[137,6543,392],{"class":143},[137,6545,1928],{"class":147},[137,6547,176],{"class":151},[137,6549,622],{"class":147},[137,6551,288],{"class":151},[137,6553,627],{"class":241},[137,6555,540],{"class":147},[137,6557,6559,6561,6563,6566],{"class":139,"line":6558},172,[137,6560,684],{"class":147},[137,6562,288],{"class":151},[137,6564,6565],{"class":147},"courses",[137,6567,195],{"class":179},[137,6569,6571],{"class":139,"line":6570},173,[137,6572,730],{"class":147},[137,6574,6576,6578,6580,6582,6584,6586,6588],{"class":139,"line":6575},174,[137,6577,641],{"class":151},[137,6579,1275],{"class":147},[137,6581,288],{"class":151},[137,6583,6565],{"class":147},[137,6585,288],{"class":151},[137,6587,2452],{"class":241},[137,6589,6590],{"class":147},"(isRecord)\n",[137,6592,6594,6596],{"class":139,"line":6593},175,[137,6595,655],{"class":151},[137,6597,658],{"class":147},[137,6599,6601],{"class":139,"line":6600},176,[137,6602,165],{"emptyLinePlaceholder":6},[137,6604,6606,6608],{"class":139,"line":6605},177,[137,6607,273],{"class":143},[137,6609,1972],{"class":147},[137,6611,6613,6615,6617,6619],{"class":139,"line":6612},178,[137,6614,1977],{"class":147},[137,6616,288],{"class":151},[137,6618,676],{"class":241},[137,6620,540],{"class":147},[137,6622,6624,6626],{"class":139,"line":6623},179,[137,6625,1988],{"class":248},[137,6627,687],{"class":143},[137,6629,6631,6633,6635,6637],{"class":139,"line":6630},180,[137,6632,1995],{"class":147},[137,6634,288],{"class":151},[137,6636,1800],{"class":147},[137,6638,709],{"class":151},[137,6640,6642,6644,6646,6648],{"class":139,"line":6641},181,[137,6643,2048],{"class":147},[137,6645,288],{"class":151},[137,6647,1900],{"class":147},[137,6649,195],{"class":179},[137,6651,6653,6655],{"class":139,"line":6652},182,[137,6654,2014],{"class":147},[137,6656,2017],{"class":151},[137,6658,6660,6662,6664,6666],{"class":139,"line":6659},183,[137,6661,1977],{"class":147},[137,6663,288],{"class":151},[137,6665,676],{"class":241},[137,6667,540],{"class":147},[137,6669,6671,6673],{"class":139,"line":6670},184,[137,6672,1988],{"class":248},[137,6674,687],{"class":143},[137,6676,6678,6680,6682,6684],{"class":139,"line":6677},185,[137,6679,1995],{"class":147},[137,6681,288],{"class":151},[137,6683,1860],{"class":147},[137,6685,709],{"class":151},[137,6687,6689,6691,6693,6695],{"class":139,"line":6688},186,[137,6690,2048],{"class":147},[137,6692,288],{"class":151},[137,6694,2053],{"class":147},[137,6696,195],{"class":179},[137,6698,6700,6702],{"class":139,"line":6699},187,[137,6701,2014],{"class":147},[137,6703,2017],{"class":151},[137,6705,6707],{"class":139,"line":6706},188,[137,6708,2066],{"class":143},[137,6710,6712],{"class":139,"line":6711},189,[137,6713,730],{"class":147},[137,6715,6717],{"class":139,"line":6716},190,[137,6718,227],{"class":179},[137,6720,6722],{"class":139,"line":6721},191,[137,6723,165],{"emptyLinePlaceholder":6},[137,6725,6727,6729,6731,6733,6735,6737],{"class":139,"line":6726},192,[137,6728,238],{"class":143},[137,6730,2952],{"class":241},[137,6732,245],{"class":179},[137,6734,2957],{"class":248},[137,6736,265],{"class":179},[137,6738,180],{"class":179},[137,6740,6742,6744],{"class":139,"line":6741},193,[137,6743,2966],{"class":143},[137,6745,180],{"class":179},[137,6747,6749,6751,6753],{"class":139,"line":6748},194,[137,6750,948],{"class":143},[137,6752,2975],{"class":147},[137,6754,152],{"class":151},[137,6756,6758,6761,6763,6765,6767],{"class":139,"line":6757},195,[137,6759,6760],{"class":276},"      new",[137,6762,2982],{"class":147},[137,6764,288],{"class":151},[137,6766,2987],{"class":241},[137,6768,540],{"class":147},[137,6770,6772,6775],{"class":139,"line":6771},196,[137,6773,6774],{"class":158},"        'en-US'",[137,6776,195],{"class":179},[137,6778,6780],{"class":139,"line":6779},197,[137,6781,899],{"class":179},[137,6783,6785,6788],{"class":139,"line":6784},198,[137,6786,6787],{"class":147},"          timeZone",[137,6789,195],{"class":179},[137,6791,6793,6796,6798,6800],{"class":139,"line":6792},199,[137,6794,6795],{"class":147},"          year",[137,6797,189],{"class":151},[137,6799,3018],{"class":158},[137,6801,195],{"class":179},[137,6803,6805,6808,6810,6812],{"class":139,"line":6804},200,[137,6806,6807],{"class":147},"          month",[137,6809,189],{"class":151},[137,6811,3030],{"class":158},[137,6813,195],{"class":179},[137,6815,6817,6820,6822,6824],{"class":139,"line":6816},201,[137,6818,6819],{"class":147},"          day",[137,6821,189],{"class":151},[137,6823,3030],{"class":158},[137,6825,195],{"class":179},[137,6827,6829],{"class":139,"line":6828},202,[137,6830,918],{"class":179},[137,6832,6834,6836,6838,6840,6842,6844,6846],{"class":139,"line":6833},203,[137,6835,3123],{"class":147},[137,6837,288],{"class":151},[137,6839,3057],{"class":241},[137,6841,245],{"class":147},[137,6843,3062],{"class":276},[137,6845,2586],{"class":241},[137,6847,3067],{"class":147},[137,6849,6851],{"class":139,"line":6850},204,[137,6852,165],{"emptyLinePlaceholder":6},[137,6854,6856,6858,6860,6862,6864],{"class":139,"line":6855},205,[137,6857,948],{"class":143},[137,6859,3078],{"class":241},[137,6861,258],{"class":151},[137,6863,3083],{"class":248},[137,6865,687],{"class":143},[137,6867,6869,6871,6873,6875],{"class":139,"line":6868},206,[137,6870,3090],{"class":147},[137,6872,288],{"class":151},[137,6874,676],{"class":241},[137,6876,540],{"class":147},[137,6878,6880,6882,6884,6886,6888,6890,6892,6894],{"class":139,"line":6879},207,[137,6881,3101],{"class":248},[137,6883,3104],{"class":143},[137,6885,3107],{"class":147},[137,6887,288],{"class":151},[137,6889,3112],{"class":147},[137,6891,790],{"class":151},[137,6893,3083],{"class":147},[137,6895,195],{"class":179},[137,6897,6899,6901,6903,6905,6907],{"class":139,"line":6898},208,[137,6900,3123],{"class":147},[137,6902,700],{"class":151},[137,6904,3128],{"class":147},[137,6906,1316],{"class":151},[137,6908,3133],{"class":158},[137,6910,6912],{"class":139,"line":6911},209,[137,6913,165],{"emptyLinePlaceholder":6},[137,6915,6917,6919,6921,6923,6925,6927,6929,6931,6933,6935,6937,6939,6941,6943,6945,6947,6949,6951,6953,6955,6957,6959,6961],{"class":139,"line":6916},210,[137,6918,1648],{"class":143},[137,6920,3144],{"class":158},[137,6922,549],{"class":179},[137,6924,3149],{"class":241},[137,6926,245],{"class":158},[137,6928,3154],{"class":158},[137,6930,265],{"class":158},[137,6932,559],{"class":179},[137,6934,3161],{"class":158},[137,6936,549],{"class":179},[137,6938,3149],{"class":241},[137,6940,245],{"class":158},[137,6942,3170],{"class":158},[137,6944,265],{"class":158},[137,6946,559],{"class":179},[137,6948,3161],{"class":158},[137,6950,549],{"class":179},[137,6952,3149],{"class":241},[137,6954,245],{"class":158},[137,6956,3185],{"class":158},[137,6958,265],{"class":158},[137,6960,559],{"class":179},[137,6962,1697],{"class":158},[137,6964,6966],{"class":139,"line":6965},211,[137,6967,576],{"class":179},[137,6969,6971,6973],{"class":139,"line":6970},212,[137,6972,3200],{"class":143},[137,6974,180],{"class":179},[137,6976,6978,6980,6982,6984],{"class":139,"line":6977},213,[137,6979,1648],{"class":143},[137,6981,277],{"class":276},[137,6983,2586],{"class":241},[137,6985,604],{"class":147},[137,6987,6989,6991,6993],{"class":139,"line":6988},214,[137,6990,3217],{"class":151},[137,6992,2616],{"class":241},[137,6994,604],{"class":147},[137,6996,6998,7000,7002,7004,7006,7008,7010],{"class":139,"line":6997},215,[137,6999,3217],{"class":151},[137,7001,3228],{"class":241},[137,7003,245],{"class":147},[137,7005,3233],{"class":261},[137,7007,252],{"class":179},[137,7009,3238],{"class":261},[137,7011,355],{"class":147},[137,7013,7015],{"class":139,"line":7014},216,[137,7016,576],{"class":179},[137,7018,7020],{"class":139,"line":7019},217,[137,7021,227],{"class":179},[137,7023,7025],{"class":139,"line":7024},218,[137,7026,165],{"emptyLinePlaceholder":6},[137,7028,7030,7032,7034,7036,7038,7040],{"class":139,"line":7029},219,[137,7031,238],{"class":143},[137,7033,2738],{"class":241},[137,7035,245],{"class":179},[137,7037,1189],{"class":248},[137,7039,265],{"class":179},[137,7041,180],{"class":179},[137,7043,7045,7047,7049,7051,7053],{"class":139,"line":7044},220,[137,7046,392],{"class":143},[137,7048,3273],{"class":147},[137,7050,176],{"class":151},[137,7052,5562],{"class":241},[137,7054,540],{"class":147},[137,7056,7058,7060,7062,7064],{"class":139,"line":7057},221,[137,7059,684],{"class":147},[137,7061,288],{"class":151},[137,7063,2242],{"class":147},[137,7065,195],{"class":179},[137,7067,7069],{"class":139,"line":7068},222,[137,7070,730],{"class":147},[137,7072,7074,7076,7078,7080],{"class":139,"line":7073},223,[137,7075,641],{"class":151},[137,7077,1275],{"class":147},[137,7079,288],{"class":151},[137,7081,3315],{"class":147},[137,7083,7085,7087],{"class":139,"line":7084},224,[137,7086,655],{"class":151},[137,7088,3323],{"class":179},[137,7090,7092],{"class":139,"line":7091},225,[137,7093,165],{"emptyLinePlaceholder":6},[137,7095,7097,7099,7101,7103,7105],{"class":139,"line":7096},226,[137,7098,392],{"class":143},[137,7100,3334],{"class":147},[137,7102,176],{"class":151},[137,7104,5562],{"class":241},[137,7106,540],{"class":147},[137,7108,7110,7112,7114,7116],{"class":139,"line":7109},227,[137,7111,3341],{"class":147},[137,7113,288],{"class":151},[137,7115,2247],{"class":147},[137,7117,195],{"class":179},[137,7119,7121],{"class":139,"line":7120},228,[137,7122,730],{"class":147},[137,7124,7126,7128,7130,7132],{"class":139,"line":7125},229,[137,7127,641],{"class":151},[137,7129,3355],{"class":147},[137,7131,288],{"class":151},[137,7133,3374],{"class":147},[137,7135,7137,7139],{"class":139,"line":7136},230,[137,7138,655],{"class":151},[137,7140,3323],{"class":179},[137,7142,7144],{"class":139,"line":7143},231,[137,7145,165],{"emptyLinePlaceholder":6},[137,7147,7149,7151,7153,7155,7157],{"class":139,"line":7148},232,[137,7150,392],{"class":143},[137,7152,3543],{"class":147},[137,7154,176],{"class":151},[137,7156,5562],{"class":241},[137,7158,540],{"class":147},[137,7160,7162,7164,7166,7169],{"class":139,"line":7161},233,[137,7163,3341],{"class":147},[137,7165,288],{"class":151},[137,7167,7168],{"class":147},"previousStreak",[137,7170,195],{"class":179},[137,7172,7174],{"class":139,"line":7173},234,[137,7175,730],{"class":147},[137,7177,7179,7181,7183,7185],{"class":139,"line":7178},235,[137,7180,641],{"class":151},[137,7182,3355],{"class":147},[137,7184,288],{"class":151},[137,7186,3581],{"class":147},[137,7188,7190,7192],{"class":139,"line":7189},236,[137,7191,655],{"class":151},[137,7193,1651],{"class":143},[137,7195,7197],{"class":139,"line":7196},237,[137,7198,165],{"emptyLinePlaceholder":6},[137,7200,7202,7204,7206,7208,7210],{"class":139,"line":7201},238,[137,7203,392],{"class":143},[137,7205,3598],{"class":147},[137,7207,176],{"class":151},[137,7209,5562],{"class":241},[137,7211,540],{"class":147},[137,7213,7215,7217,7219,7221],{"class":139,"line":7214},239,[137,7216,3341],{"class":147},[137,7218,288],{"class":151},[137,7220,2295],{"class":147},[137,7222,195],{"class":179},[137,7224,7226],{"class":139,"line":7225},240,[137,7227,730],{"class":147},[137,7229,7231,7233,7235,7237],{"class":139,"line":7230},241,[137,7232,641],{"class":151},[137,7234,3355],{"class":147},[137,7236,288],{"class":151},[137,7238,3635],{"class":147},[137,7240,7242,7244],{"class":139,"line":7241},242,[137,7243,655],{"class":151},[137,7245,1651],{"class":143},[137,7247,7249],{"class":139,"line":7248},243,[137,7250,165],{"emptyLinePlaceholder":6},[137,7252,7254,7256,7258],{"class":139,"line":7253},244,[137,7255,392],{"class":143},[137,7257,3391],{"class":147},[137,7259,152],{"class":151},[137,7261,7263,7265,7267,7269],{"class":139,"line":7262},245,[137,7264,684],{"class":147},[137,7266,288],{"class":151},[137,7268,3402],{"class":147},[137,7270,2017],{"class":151},[137,7272,7274,7276,7278,7280],{"class":139,"line":7273},246,[137,7275,3341],{"class":147},[137,7277,288],{"class":151},[137,7279,3413],{"class":147},[137,7281,2017],{"class":151},[137,7283,7285],{"class":139,"line":7284},247,[137,7286,3420],{"class":158},[137,7288,7290],{"class":139,"line":7289},248,[137,7291,165],{"emptyLinePlaceholder":6},[137,7293,7295,7297,7299],{"class":139,"line":7294},249,[137,7296,392],{"class":143},[137,7298,3431],{"class":147},[137,7300,152],{"class":151},[137,7302,7304,7306],{"class":139,"line":7303},250,[137,7305,3438],{"class":241},[137,7307,3441],{"class":147},[137,7309,7311],{"class":139,"line":7310},251,[137,7312,165],{"emptyLinePlaceholder":6},[137,7314,7316,7318,7320],{"class":139,"line":7315},252,[137,7317,392],{"class":143},[137,7319,3452],{"class":147},[137,7321,152],{"class":151},[137,7323,7325,7327,7329,7331,7333,7335],{"class":139,"line":7324},253,[137,7326,684],{"class":147},[137,7328,288],{"class":151},[137,7330,3463],{"class":147},[137,7332,790],{"class":151},[137,7334,3468],{"class":261},[137,7336,3471],{"class":151},[137,7338,7340,7342,7344,7346,7348,7350],{"class":139,"line":7339},254,[137,7341,684],{"class":147},[137,7343,288],{"class":151},[137,7345,3463],{"class":147},[137,7347,790],{"class":151},[137,7349,3484],{"class":261},[137,7351,3471],{"class":151},[137,7353,7355,7357,7359,7361,7363,7365],{"class":139,"line":7354},255,[137,7356,684],{"class":147},[137,7358,288],{"class":151},[137,7360,3495],{"class":147},[137,7362,790],{"class":151},[137,7364,3468],{"class":261},[137,7366,3471],{"class":151},[137,7368,7370,7372,7374,7376],{"class":139,"line":7369},256,[137,7371,3506],{"class":147},[137,7373,288],{"class":151},[137,7375,3511],{"class":147},[137,7377,709],{"class":151},[137,7379,7381,7384],{"class":139,"line":7380},257,[137,7382,7383],{"class":147},"      statusDate ",[137,7385,3518],{"class":151},[137,7387,7389,7391,7393,7395,7397],{"class":139,"line":7388},258,[137,7390,3506],{"class":147},[137,7392,288],{"class":151},[137,7394,3527],{"class":147},[137,7396,790],{"class":151},[137,7398,3532],{"class":147},[137,7400,7402],{"class":139,"line":7401},259,[137,7403,165],{"emptyLinePlaceholder":6},[137,7405,7407,7409],{"class":139,"line":7406},260,[137,7408,273],{"class":143},[137,7410,180],{"class":179},[137,7412,7414,7416],{"class":139,"line":7413},261,[137,7415,3656],{"class":147},[137,7417,195],{"class":179},[137,7419,7421,7423],{"class":139,"line":7420},262,[137,7422,3663],{"class":147},[137,7424,195],{"class":179},[137,7426,7428],{"class":139,"line":7427},263,[137,7429,165],{"emptyLinePlaceholder":6},[137,7431,7433,7435,7437],{"class":139,"line":7432},264,[137,7434,3506],{"class":147},[137,7436,189],{"class":151},[137,7438,180],{"class":179},[137,7440,7442,7444],{"class":139,"line":7441},265,[137,7443,3682],{"class":147},[137,7445,2233],{"class":151},[137,7447,7449,7451,7453,7455],{"class":139,"line":7448},266,[137,7450,3689],{"class":147},[137,7452,288],{"class":151},[137,7454,2252],{"class":147},[137,7456,2017],{"class":151},[137,7458,7460,7462,7464,7466],{"class":139,"line":7459},267,[137,7461,3700],{"class":147},[137,7463,288],{"class":151},[137,7465,2252],{"class":147},[137,7467,2017],{"class":151},[137,7469,7471,7473,7475,7477],{"class":139,"line":7470},268,[137,7472,2048],{"class":147},[137,7474,288],{"class":151},[137,7476,1357],{"class":147},[137,7478,2017],{"class":151},[137,7480,7482,7484],{"class":139,"line":7481},269,[137,7483,3721],{"class":261},[137,7485,195],{"class":179},[137,7487,7489,7491],{"class":139,"line":7488},270,[137,7490,3728],{"class":147},[137,7492,2233],{"class":151},[137,7494,7496,7498,7500,7502,7504,7506],{"class":139,"line":7495},271,[137,7497,3689],{"class":147},[137,7499,288],{"class":151},[137,7501,3738],{"class":147},[137,7503,1316],{"class":151},[137,7505,1319],{"class":143},[137,7507,195],{"class":179},[137,7509,7511,7513],{"class":139,"line":7510},272,[137,7512,3749],{"class":147},[137,7514,2233],{"class":151},[137,7516,7518,7520,7522,7524,7526,7528],{"class":139,"line":7517},273,[137,7519,3689],{"class":147},[137,7521,288],{"class":151},[137,7523,3527],{"class":147},[137,7525,1316],{"class":151},[137,7527,1319],{"class":143},[137,7529,195],{"class":179},[137,7531,7533],{"class":139,"line":7532},274,[137,7534,346],{"class":179},[137,7536,7538],{"class":139,"line":7537},275,[137,7539,165],{"emptyLinePlaceholder":6},[137,7541,7543,7545,7547],{"class":139,"line":7542},276,[137,7544,3776],{"class":147},[137,7546,189],{"class":151},[137,7548,3781],{"class":147},[137,7550,7552,7554],{"class":139,"line":7551},277,[137,7553,3308],{"class":151},[137,7555,180],{"class":179},[137,7557,7559,7561],{"class":139,"line":7558},278,[137,7560,3792],{"class":147},[137,7562,2233],{"class":151},[137,7564,7566,7568,7570,7572,7574,7576],{"class":139,"line":7565},279,[137,7567,3819],{"class":147},[137,7569,288],{"class":151},[137,7571,2252],{"class":147},[137,7573,1316],{"class":151},[137,7575,1362],{"class":261},[137,7577,195],{"class":179},[137,7579,7581,7583],{"class":139,"line":7580},280,[137,7582,3812],{"class":147},[137,7584,2233],{"class":151},[137,7586,7588,7590,7592,7594,7596,7598],{"class":139,"line":7587},281,[137,7589,3819],{"class":147},[137,7591,288],{"class":151},[137,7593,3738],{"class":147},[137,7595,1316],{"class":151},[137,7597,1319],{"class":143},[137,7599,195],{"class":179},[137,7601,7603,7605],{"class":139,"line":7602},282,[137,7604,3834],{"class":147},[137,7606,2233],{"class":151},[137,7608,7610,7612,7614,7616,7618,7620],{"class":139,"line":7609},283,[137,7611,3819],{"class":147},[137,7613,288],{"class":151},[137,7615,3527],{"class":147},[137,7617,1316],{"class":151},[137,7619,1319],{"class":143},[137,7621,195],{"class":179},[137,7623,7625],{"class":139,"line":7624},284,[137,7626,3855],{"class":179},[137,7628,7630,7632,7634],{"class":139,"line":7629},285,[137,7631,3320],{"class":151},[137,7633,1319],{"class":143},[137,7635,195],{"class":179},[137,7637,7639],{"class":139,"line":7638},286,[137,7640,165],{"emptyLinePlaceholder":6},[137,7642,7644,7646,7648],{"class":139,"line":7643},287,[137,7645,3872],{"class":147},[137,7647,189],{"class":151},[137,7649,180],{"class":179},[137,7651,7653,7655],{"class":139,"line":7652},288,[137,7654,3682],{"class":147},[137,7656,2233],{"class":151},[137,7658,7660,7662,7664,7666],{"class":139,"line":7659},289,[137,7661,3887],{"class":147},[137,7663,700],{"class":151},[137,7665,2252],{"class":147},[137,7667,2017],{"class":151},[137,7669,7671,7673,7675,7677],{"class":139,"line":7670},290,[137,7672,2048],{"class":147},[137,7674,288],{"class":151},[137,7676,2310],{"class":147},[137,7678,2017],{"class":151},[137,7680,7682,7684],{"class":139,"line":7681},291,[137,7683,3721],{"class":261},[137,7685,195],{"class":179},[137,7687,7689,7691],{"class":139,"line":7688},292,[137,7690,3728],{"class":147},[137,7692,2233],{"class":151},[137,7694,7696,7698,7700,7702,7704,7706],{"class":139,"line":7695},293,[137,7697,3887],{"class":147},[137,7699,700],{"class":151},[137,7701,3738],{"class":147},[137,7703,1316],{"class":151},[137,7705,1319],{"class":143},[137,7707,195],{"class":179},[137,7709,7711,7713],{"class":139,"line":7710},294,[137,7712,3749],{"class":147},[137,7714,2233],{"class":151},[137,7716,7718,7720,7722,7724,7726,7728],{"class":139,"line":7717},295,[137,7719,3887],{"class":147},[137,7721,700],{"class":151},[137,7723,3527],{"class":147},[137,7725,1316],{"class":151},[137,7727,1319],{"class":143},[137,7729,195],{"class":179},[137,7731,7733,7735],{"class":139,"line":7732},296,[137,7734,3954],{"class":147},[137,7736,2233],{"class":151},[137,7738,7740,7742,7744,7746],{"class":139,"line":7739},297,[137,7741,3887],{"class":147},[137,7743,700],{"class":151},[137,7745,3965],{"class":147},[137,7747,2017],{"class":151},[137,7749,7751,7754],{"class":139,"line":7750},298,[137,7752,7753],{"class":143},"        null",[137,7755,195],{"class":179},[137,7757,7759],{"class":139,"line":7758},299,[137,7760,346],{"class":179},[137,7762,7764],{"class":139,"line":7763},300,[137,7765,165],{"emptyLinePlaceholder":6},[137,7767,7769,7771],{"class":139,"line":7768},301,[137,7770,3984],{"class":147},[137,7772,2233],{"class":151},[137,7774,7776,7779,7781,7783,7785,7787],{"class":139,"line":7775},302,[137,7777,7778],{"class":147},"      streakData",[137,7780,288],{"class":151},[137,7782,3993],{"class":147},[137,7784,1316],{"class":151},[137,7786,1319],{"class":143},[137,7788,195],{"class":179},[137,7790,7792],{"class":139,"line":7791},303,[137,7793,576],{"class":179},[137,7795,7797],{"class":139,"line":7796},304,[137,7798,227],{"class":179},[137,7800,7802],{"class":139,"line":7801},305,[137,7803,165],{"emptyLinePlaceholder":6},[137,7805,7807],{"class":139,"line":7806},306,[137,7808,7810],{"class":7809},"s0D_2","\u002F\u002F \u002Fsearch 使用的简略信息\n",[137,7812,7814,7816,7818,7820,7822,7824],{"class":139,"line":7813},307,[137,7815,238],{"class":143},[137,7817,2132],{"class":241},[137,7819,245],{"class":179},[137,7821,1189],{"class":248},[137,7823,265],{"class":179},[137,7825,180],{"class":179},[137,7827,7829,7831],{"class":139,"line":7828},308,[137,7830,273],{"class":143},[137,7832,180],{"class":179},[137,7834,7836,7838,7840,7842,7844,7846,7848,7850],{"class":139,"line":7835},309,[137,7837,1790],{"class":147},[137,7839,189],{"class":151},[137,7841,1275],{"class":147},[137,7843,288],{"class":151},[137,7845,1800],{"class":147},[137,7847,1316],{"class":151},[137,7849,1319],{"class":143},[137,7851,195],{"class":179},[137,7853,7855,7857],{"class":139,"line":7854},310,[137,7856,2169],{"class":147},[137,7858,2233],{"class":151},[137,7860,7862,7864,7866,7868,7870,7872],{"class":139,"line":7861},311,[137,7863,693],{"class":147},[137,7865,288],{"class":151},[137,7867,2178],{"class":147},[137,7869,1316],{"class":151},[137,7871,1319],{"class":143},[137,7873,195],{"class":179},[137,7875,7877,7879,7881,7883,7885,7887,7889,7891],{"class":139,"line":7876},312,[137,7878,2189],{"class":147},[137,7880,189],{"class":151},[137,7882,1275],{"class":147},[137,7884,288],{"class":151},[137,7886,1313],{"class":147},[137,7888,1316],{"class":151},[137,7890,1319],{"class":143},[137,7892,195],{"class":179},[137,7894,7896,7898],{"class":139,"line":7895},313,[137,7897,2208],{"class":147},[137,7899,2233],{"class":151},[137,7901,7903,7906,7908,7910,7912],{"class":139,"line":7902},314,[137,7904,7905],{"class":241},"      normalizePicture",[137,7907,1939],{"class":147},[137,7909,288],{"class":151},[137,7911,2219],{"class":147},[137,7913,195],{"class":179},[137,7915,7917],{"class":139,"line":7916},315,[137,7918,165],{"emptyLinePlaceholder":6},[137,7920,7922,7924],{"class":139,"line":7921},316,[137,7923,2230],{"class":147},[137,7925,2233],{"class":151},[137,7927,7929,7931,7933,7935,7937],{"class":139,"line":7928},317,[137,7930,693],{"class":147},[137,7932,288],{"class":151},[137,7934,2242],{"class":147},[137,7936,700],{"class":151},[137,7938,3374],{"class":147},[137,7940,7942,7945,7947],{"class":139,"line":7941},318,[137,7943,7944],{"class":151},"        ?.",[137,7946,2252],{"class":147},[137,7948,2017],{"class":151},[137,7950,7952,7954,7956,7958],{"class":139,"line":7951},319,[137,7953,693],{"class":147},[137,7955,288],{"class":151},[137,7957,1357],{"class":147},[137,7959,2017],{"class":151},[137,7961,7963,7965],{"class":139,"line":7962},320,[137,7964,2269],{"class":261},[137,7966,195],{"class":179},[137,7968,7970],{"class":139,"line":7969},321,[137,7971,165],{"emptyLinePlaceholder":6},[137,7973,7975,7977],{"class":139,"line":7974},322,[137,7976,2280],{"class":147},[137,7978,2233],{"class":151},[137,7980,7982,7984,7986,7988,7990],{"class":139,"line":7981},323,[137,7983,693],{"class":147},[137,7985,288],{"class":151},[137,7987,2242],{"class":147},[137,7989,700],{"class":151},[137,7991,3635],{"class":147},[137,7993,7995,7997,7999],{"class":139,"line":7994},324,[137,7996,7944],{"class":151},[137,7998,2252],{"class":147},[137,8000,2017],{"class":151},[137,8002,8004,8006,8008,8010],{"class":139,"line":8003},325,[137,8005,693],{"class":147},[137,8007,288],{"class":151},[137,8009,2310],{"class":147},[137,8011,2017],{"class":151},[137,8013,8015,8017],{"class":139,"line":8014},326,[137,8016,2269],{"class":261},[137,8018,195],{"class":179},[137,8020,8022],{"class":139,"line":8021},327,[137,8023,165],{"emptyLinePlaceholder":6},[137,8025,8027,8029,8031,8033,8035,8037,8039,8041],{"class":139,"line":8026},328,[137,8028,2327],{"class":147},[137,8030,189],{"class":151},[137,8032,1275],{"class":147},[137,8034,288],{"class":151},[137,8036,1379],{"class":147},[137,8038,1316],{"class":151},[137,8040,1362],{"class":261},[137,8042,195],{"class":179},[137,8044,8046],{"class":139,"line":8045},329,[137,8047,165],{"emptyLinePlaceholder":6},[137,8049,8051,8053,8055,8057],{"class":139,"line":8050},330,[137,8052,2350],{"class":147},[137,8054,189],{"class":151},[137,8056,1743],{"class":241},[137,8058,540],{"class":147},[137,8060,8062,8064,8066],{"class":139,"line":8061},331,[137,8063,2361],{"class":241},[137,8065,2364],{"class":147},[137,8067,195],{"class":179},[137,8069,8071,8073],{"class":139,"line":8070},332,[137,8072,2371],{"class":147},[137,8074,195],{"class":179},[137,8076,8078],{"class":139,"line":8077},333,[137,8079,576],{"class":179},[137,8081,8083],{"class":139,"line":8082},334,[137,8084,227],{"class":179},[137,8086,8088],{"class":139,"line":8087},335,[137,8089,165],{"emptyLinePlaceholder":6},[137,8091,8093],{"class":139,"line":8092},336,[137,8094,8095],{"class":7809},"\u002F\u002F \u002Fdetail 和 \u002Fme 使用的详细信息\n",[137,8097,8099,8101,8103,8105,8107,8109],{"class":139,"line":8098},337,[137,8100,238],{"class":143},[137,8102,2396],{"class":241},[137,8104,245],{"class":179},[137,8106,1189],{"class":248},[137,8108,265],{"class":179},[137,8110,180],{"class":179},[137,8112,8114,8116,8118,8120,8122,8124,8126],{"class":139,"line":8113},338,[137,8115,392],{"class":143},[137,8117,1928],{"class":147},[137,8119,176],{"class":151},[137,8121,622],{"class":147},[137,8123,288],{"class":151},[137,8125,627],{"class":241},[137,8127,540],{"class":147},[137,8129,8131,8133,8135,8137],{"class":139,"line":8130},339,[137,8132,684],{"class":147},[137,8134,288],{"class":151},[137,8136,6565],{"class":147},[137,8138,195],{"class":179},[137,8140,8142],{"class":139,"line":8141},340,[137,8143,730],{"class":147},[137,8145,8147,8149,8151,8153],{"class":139,"line":8146},341,[137,8148,641],{"class":151},[137,8150,1275],{"class":147},[137,8152,288],{"class":151},[137,8154,1955],{"class":147},[137,8156,8158,8160,8162],{"class":139,"line":8157},342,[137,8159,2439],{"class":151},[137,8161,2442],{"class":241},[137,8163,2445],{"class":147},[137,8165,8167,8169,8171],{"class":139,"line":8166},343,[137,8168,2439],{"class":151},[137,8170,2452],{"class":241},[137,8172,2455],{"class":147},[137,8174,8176,8178],{"class":139,"line":8175},344,[137,8177,655],{"class":151},[137,8179,658],{"class":147},[137,8181,8183],{"class":139,"line":8182},345,[137,8184,165],{"emptyLinePlaceholder":6},[137,8186,8188,8190],{"class":139,"line":8187},346,[137,8189,273],{"class":143},[137,8191,180],{"class":179},[137,8193,8195,8197,8199,8201,8203,8205,8207,8209],{"class":139,"line":8194},347,[137,8196,1790],{"class":147},[137,8198,189],{"class":151},[137,8200,1275],{"class":147},[137,8202,288],{"class":151},[137,8204,1800],{"class":147},[137,8206,1316],{"class":151},[137,8208,1319],{"class":143},[137,8210,195],{"class":179},[137,8212,8214,8216],{"class":139,"line":8213},348,[137,8215,2169],{"class":147},[137,8217,2233],{"class":151},[137,8219,8221,8223,8225,8227,8229,8231],{"class":139,"line":8220},349,[137,8222,693],{"class":147},[137,8224,288],{"class":151},[137,8226,2178],{"class":147},[137,8228,1316],{"class":151},[137,8230,1319],{"class":143},[137,8232,195],{"class":179},[137,8234,8236,8238,8240,8242,8244,8246,8248,8250],{"class":139,"line":8235},350,[137,8237,2189],{"class":147},[137,8239,189],{"class":151},[137,8241,1275],{"class":147},[137,8243,288],{"class":151},[137,8245,1313],{"class":147},[137,8247,1316],{"class":151},[137,8249,1319],{"class":143},[137,8251,195],{"class":179},[137,8253,8255,8257],{"class":139,"line":8254},351,[137,8256,2208],{"class":147},[137,8258,2233],{"class":151},[137,8260,8262,8264,8266,8268,8270],{"class":139,"line":8261},352,[137,8263,7905],{"class":241},[137,8265,1939],{"class":147},[137,8267,288],{"class":151},[137,8269,2219],{"class":147},[137,8271,195],{"class":179},[137,8273,8275],{"class":139,"line":8274},353,[137,8276,165],{"emptyLinePlaceholder":6},[137,8278,8280,8282,8284],{"class":139,"line":8279},354,[137,8281,2550],{"class":147},[137,8283,189],{"class":151},[137,8285,180],{"class":179},[137,8287,8289,8291,8293,8295,8297,8299],{"class":139,"line":8288},355,[137,8290,2559],{"class":147},[137,8292,189],{"class":151},[137,8294,2564],{"class":147},[137,8296,288],{"class":151},[137,8298,2569],{"class":241},[137,8300,540],{"class":147},[137,8302,8304,8306,8308,8311],{"class":139,"line":8303},356,[137,8305,2048],{"class":147},[137,8307,288],{"class":151},[137,8309,8310],{"class":147},"creationDate",[137,8312,195],{"class":179},[137,8314,8316],{"class":139,"line":8315},357,[137,8317,932],{"class":147},[137,8319,8321,8323,8325,8327],{"class":139,"line":8320},358,[137,8322,2581],{"class":151},[137,8324,277],{"class":276},[137,8326,2586],{"class":241},[137,8328,540],{"class":147},[137,8330,8332,8334,8336,8338,8340,8342],{"class":139,"line":8331},359,[137,8333,2593],{"class":147},[137,8335,288],{"class":151},[137,8337,2598],{"class":147},[137,8339,2601],{"class":151},[137,8341,2604],{"class":261},[137,8343,195],{"class":179},[137,8345,8347,8349,8351,8353],{"class":139,"line":8346},360,[137,8348,2611],{"class":147},[137,8350,288],{"class":151},[137,8352,2616],{"class":241},[137,8354,604],{"class":147},[137,8356,8358,8360,8362],{"class":139,"line":8357},361,[137,8359,2623],{"class":151},[137,8361,1319],{"class":143},[137,8363,195],{"class":179},[137,8365,8367,8369],{"class":139,"line":8366},362,[137,8368,2632],{"class":147},[137,8370,2233],{"class":151},[137,8372,8374,8377,8379,8381,8383],{"class":139,"line":8373},363,[137,8375,8376],{"class":241},"        Boolean",[137,8378,1939],{"class":147},[137,8380,288],{"class":151},[137,8382,2644],{"class":147},[137,8384,195],{"class":179},[137,8386,8388],{"class":139,"line":8387},364,[137,8389,346],{"class":179},[137,8391,8393],{"class":139,"line":8392},365,[137,8394,165],{"emptyLinePlaceholder":6},[137,8396,8398,8400,8402],{"class":139,"line":8397},366,[137,8399,1871],{"class":147},[137,8401,189],{"class":151},[137,8403,180],{"class":179},[137,8405,8407,8409],{"class":139,"line":8406},367,[137,8408,2667],{"class":147},[137,8410,2233],{"class":151},[137,8412,8414,8416,8418,8420,8422,8424],{"class":139,"line":8413},368,[137,8415,2048],{"class":147},[137,8417,288],{"class":151},[137,8419,1379],{"class":147},[137,8421,1316],{"class":151},[137,8423,1362],{"class":261},[137,8425,195],{"class":179},[137,8427,8429,8431],{"class":139,"line":8428},369,[137,8430,2686],{"class":147},[137,8432,2233],{"class":151},[137,8434,8436,8438,8440,8442,8444,8446],{"class":139,"line":8435},370,[137,8437,2048],{"class":147},[137,8439,288],{"class":151},[137,8441,2695],{"class":147},[137,8443,1316],{"class":151},[137,8445,1362],{"class":261},[137,8447,195],{"class":179},[137,8449,8451,8453],{"class":139,"line":8450},371,[137,8452,2706],{"class":147},[137,8454,2233],{"class":151},[137,8456,8458,8460,8462,8464,8466,8468],{"class":139,"line":8457},372,[137,8459,2048],{"class":147},[137,8461,288],{"class":151},[137,8463,2715],{"class":147},[137,8465,1316],{"class":151},[137,8467,1362],{"class":261},[137,8469,195],{"class":179},[137,8471,8473],{"class":139,"line":8472},373,[137,8474,346],{"class":179},[137,8476,8478],{"class":139,"line":8477},374,[137,8479,165],{"emptyLinePlaceholder":6},[137,8481,8483,8485],{"class":139,"line":8482},375,[137,8484,2230],{"class":147},[137,8486,2233],{"class":151},[137,8488,8490,8493,8495],{"class":139,"line":8489},376,[137,8491,8492],{"class":241},"      getStreakStatus",[137,8494,2364],{"class":147},[137,8496,195],{"class":179},[137,8498,8500],{"class":139,"line":8499},377,[137,8501,165],{"emptyLinePlaceholder":6},[137,8503,8505,8507],{"class":139,"line":8504},378,[137,8506,2350],{"class":147},[137,8508,2233],{"class":151},[137,8510,8512,8515],{"class":139,"line":8511},379,[137,8513,8514],{"class":241},"      normalizeCourse",[137,8516,540],{"class":147},[137,8518,8520,8523,8525],{"class":139,"line":8519},380,[137,8521,8522],{"class":241},"        getCurrentCourse",[137,8524,2364],{"class":147},[137,8526,195],{"class":179},[137,8528,8530,8532],{"class":139,"line":8529},381,[137,8531,3123],{"class":147},[137,8533,195],{"class":179},[137,8535,8537],{"class":139,"line":8536},382,[137,8538,165],{"emptyLinePlaceholder":6},[137,8540,8542,8544],{"class":139,"line":8541},383,[137,8543,1977],{"class":147},[137,8545,195],{"class":179},[137,8547,8549],{"class":139,"line":8548},384,[137,8550,576],{"class":179},[137,8552,8554],{"class":139,"line":8553},385,[137,8555,227],{"class":179},[137,8557,8559],{"class":139,"line":8558},386,[137,8560,165],{"emptyLinePlaceholder":6},[137,8562,8564,8566,8568,8571,8573,8575,8577],{"class":139,"line":8563},387,[137,8565,371],{"class":143},[137,8567,374],{"class":143},[137,8569,8570],{"class":241}," fetchUsers",[137,8572,245],{"class":179},[137,8574,382],{"class":248},[137,8576,265],{"class":179},[137,8578,180],{"class":179},[137,8580,8582,8584,8586],{"class":139,"line":8581},388,[137,8583,392],{"class":143},[137,8585,395],{"class":147},[137,8587,152],{"class":151},[137,8589,8591,8594,8596],{"class":139,"line":8590},389,[137,8592,8593],{"class":276},"    new",[137,8595,402],{"class":241},[137,8597,405],{"class":147},[137,8599,8601],{"class":139,"line":8600},390,[137,8602,165],{"emptyLinePlaceholder":6},[137,8604,8606,8608,8610,8612,8614,8616],{"class":139,"line":8605},391,[137,8607,416],{"class":147},[137,8609,288],{"class":151},[137,8611,421],{"class":147},[137,8613,288],{"class":151},[137,8615,426],{"class":241},[137,8617,540],{"class":147},[137,8619,8621,8624],{"class":139,"line":8620},392,[137,8622,8623],{"class":158},"    'username'",[137,8625,195],{"class":179},[137,8627,8629,8631],{"class":139,"line":8628},393,[137,8630,2169],{"class":147},[137,8632,195],{"class":179},[137,8634,8636],{"class":139,"line":8635},394,[137,8637,730],{"class":147},[137,8639,8641],{"class":139,"line":8640},395,[137,8642,165],{"emptyLinePlaceholder":6},[137,8644,8646,8649],{"class":139,"line":8645},396,[137,8647,8648],{"class":143},"  let",[137,8650,8651],{"class":147}," response\n",[137,8653,8655],{"class":139,"line":8654},397,[137,8656,165],{"emptyLinePlaceholder":6},[137,8658,8660,8662],{"class":139,"line":8659},398,[137,8661,2966],{"class":143},[137,8663,180],{"class":179},[137,8665,8667,8670,8672,8674,8676,8678,8680],{"class":139,"line":8666},399,[137,8668,8669],{"class":147},"    response ",[137,8671,176],{"class":151},[137,8673,454],{"class":143},[137,8675,457],{"class":241},[137,8677,460],{"class":147},[137,8679,252],{"class":179},[137,8681,180],{"class":179},[137,8683,8685,8687,8689],{"class":139,"line":8684},400,[137,8686,5488],{"class":147},[137,8688,189],{"class":151},[137,8690,180],{"class":179},[137,8692,8694,8697,8699,8701],{"class":139,"line":8693},401,[137,8695,8696],{"class":147},"        Accept",[137,8698,189],{"class":151},[137,8700,484],{"class":158},[137,8702,195],{"class":179},[137,8704,8706],{"class":139,"line":8705},402,[137,8707,3048],{"class":179},[137,8709,8711,8714,8716,8718,8720,8722],{"class":139,"line":8710},403,[137,8712,8713],{"class":147},"      signal",[137,8715,189],{"class":151},[137,8717,4926],{"class":147},[137,8719,288],{"class":151},[137,8721,4931],{"class":241},[137,8723,540],{"class":147},[137,8725,8727,8730],{"class":139,"line":8726},404,[137,8728,8729],{"class":147},"        UPSTREAM_TIMEOUT",[137,8731,195],{"class":179},[137,8733,8735,8737],{"class":139,"line":8734},405,[137,8736,3123],{"class":147},[137,8738,195],{"class":179},[137,8740,8742,8745],{"class":139,"line":8741},406,[137,8743,8744],{"class":179},"    }",[137,8746,355],{"class":147},[137,8748,8750],{"class":139,"line":8749},407,[137,8751,576],{"class":179},[137,8753,8755,8757,8760],{"class":139,"line":8754},408,[137,8756,3200],{"class":143},[137,8758,8759],{"class":147}," (error) ",[137,8761,526],{"class":179},[137,8763,8765,8767],{"class":139,"line":8764},409,[137,8766,779],{"class":143},[137,8768,1972],{"class":147},[137,8770,8772,8775,8777,8779],{"class":139,"line":8771},410,[137,8773,8774],{"class":147},"      error",[137,8776,700],{"class":151},[137,8778,1313],{"class":147},[137,8780,709],{"class":151},[137,8782,8784,8787],{"class":139,"line":8783},411,[137,8785,8786],{"class":158},"        'AbortError'",[137,8788,3471],{"class":151},[137,8790,8792,8794,8796,8798],{"class":139,"line":8791},412,[137,8793,8774],{"class":147},[137,8795,700],{"class":151},[137,8797,1313],{"class":147},[137,8799,709],{"class":151},[137,8801,8803],{"class":139,"line":8802},413,[137,8804,8805],{"class":158},"        'TimeoutError'\n",[137,8807,8809,8811],{"class":139,"line":8808},414,[137,8810,2014],{"class":147},[137,8812,526],{"class":179},[137,8814,8816,8819,8821,8823],{"class":139,"line":8815},415,[137,8817,8818],{"class":143},"      throw",[137,8820,277],{"class":276},[137,8822,4531],{"class":241},[137,8824,540],{"class":147},[137,8826,8828,8831],{"class":139,"line":8827},416,[137,8829,8830],{"class":261},"        504",[137,8832,195],{"class":179},[137,8834,8836,8839],{"class":139,"line":8835},417,[137,8837,8838],{"class":158},"        'upstream_timeout'",[137,8840,195],{"class":179},[137,8842,8844,8847],{"class":139,"line":8843},418,[137,8845,8846],{"class":158},"        'Duolingo 请求超时'",[137,8848,195],{"class":179},[137,8850,8852],{"class":139,"line":8851},419,[137,8853,932],{"class":147},[137,8855,8857],{"class":139,"line":8856},420,[137,8858,858],{"class":179},[137,8860,8862],{"class":139,"line":8861},421,[137,8863,165],{"emptyLinePlaceholder":6},[137,8865,8867,8869,8871,8873],{"class":139,"line":8866},422,[137,8868,532],{"class":143},[137,8870,277],{"class":276},[137,8872,4531],{"class":241},[137,8874,540],{"class":147},[137,8876,8878,8881],{"class":139,"line":8877},423,[137,8879,8880],{"class":261},"      502",[137,8882,195],{"class":179},[137,8884,8886,8889],{"class":139,"line":8885},424,[137,8887,8888],{"class":158},"      'upstream_error'",[137,8890,195],{"class":179},[137,8892,8894,8897],{"class":139,"line":8893},425,[137,8895,8896],{"class":158},"      '请求 Duolingo 失败'",[137,8898,195],{"class":179},[137,8900,8902],{"class":139,"line":8901},426,[137,8903,570],{"class":147},[137,8905,8907],{"class":139,"line":8906},427,[137,8908,576],{"class":179},[137,8910,8912],{"class":139,"line":8911},428,[137,8913,165],{"emptyLinePlaceholder":6},[137,8915,8917,8919,8921,8923,8925,8927,8929],{"class":139,"line":8916},429,[137,8918,509],{"class":143},[137,8920,512],{"class":147},[137,8922,515],{"class":151},[137,8924,518],{"class":147},[137,8926,288],{"class":151},[137,8928,523],{"class":147},[137,8930,526],{"class":179},[137,8932,8934,8936,8938,8940],{"class":139,"line":8933},430,[137,8935,532],{"class":143},[137,8937,277],{"class":276},[137,8939,4531],{"class":241},[137,8941,540],{"class":147},[137,8943,8945,8947],{"class":139,"line":8944},431,[137,8946,8880],{"class":261},[137,8948,195],{"class":179},[137,8950,8952,8954],{"class":139,"line":8951},432,[137,8953,8888],{"class":158},[137,8955,195],{"class":179},[137,8957,8959,8961,8963,8965,8967,8969,8971,8973],{"class":139,"line":8958},433,[137,8960,546],{"class":158},[137,8962,549],{"class":179},[137,8964,518],{"class":147},[137,8966,288],{"class":151},[137,8968,556],{"class":147},[137,8970,559],{"class":179},[137,8972,562],{"class":158},[137,8974,195],{"class":179},[137,8976,8978],{"class":139,"line":8977},434,[137,8979,570],{"class":147},[137,8981,8983],{"class":139,"line":8982},435,[137,8984,576],{"class":179},[137,8986,8988],{"class":139,"line":8987},436,[137,8989,165],{"emptyLinePlaceholder":6},[137,8991,8993,8995],{"class":139,"line":8992},437,[137,8994,8648],{"class":143},[137,8996,8997],{"class":147}," data\n",[137,8999,9001],{"class":139,"line":9000},438,[137,9002,165],{"emptyLinePlaceholder":6},[137,9004,9006,9008],{"class":139,"line":9005},439,[137,9007,2966],{"class":143},[137,9009,180],{"class":179},[137,9011,9013,9016,9018,9020,9022,9024,9026],{"class":139,"line":9012},440,[137,9014,9015],{"class":147},"    data ",[137,9017,176],{"class":151},[137,9019,454],{"class":143},[137,9021,596],{"class":147},[137,9023,288],{"class":151},[137,9025,601],{"class":241},[137,9027,604],{"class":147},[137,9029,9031],{"class":139,"line":9030},441,[137,9032,576],{"class":179},[137,9034,9036,9038],{"class":139,"line":9035},442,[137,9037,3200],{"class":143},[137,9039,180],{"class":179},[137,9041,9043,9045,9047,9049],{"class":139,"line":9042},443,[137,9044,532],{"class":143},[137,9046,277],{"class":276},[137,9048,4531],{"class":241},[137,9050,540],{"class":147},[137,9052,9054,9056],{"class":139,"line":9053},444,[137,9055,8880],{"class":261},[137,9057,195],{"class":179},[137,9059,9061,9064],{"class":139,"line":9060},445,[137,9062,9063],{"class":158},"      'invalid_upstream_response'",[137,9065,195],{"class":179},[137,9067,9069,9072],{"class":139,"line":9068},446,[137,9070,9071],{"class":158},"      'Duolingo 返回了无效 JSON'",[137,9073,195],{"class":179},[137,9075,9077],{"class":139,"line":9076},447,[137,9078,570],{"class":147},[137,9080,9082],{"class":139,"line":9081},448,[137,9083,576],{"class":179},[137,9085,9087],{"class":139,"line":9086},449,[137,9088,165],{"emptyLinePlaceholder":6},[137,9090,9092,9094],{"class":139,"line":9091},450,[137,9093,509],{"class":143},[137,9095,1972],{"class":147},[137,9097,9099,9101,9103,9106],{"class":139,"line":9098},451,[137,9100,5604],{"class":151},[137,9102,6378],{"class":241},[137,9104,9105],{"class":147},"(data) ",[137,9107,3518],{"class":151},[137,9109,9111,9113,9115,9117,9119,9121,9123],{"class":139,"line":9110},452,[137,9112,5604],{"class":151},[137,9114,5607],{"class":147},[137,9116,288],{"class":151},[137,9118,627],{"class":241},[137,9120,630],{"class":147},[137,9122,288],{"class":151},[137,9124,635],{"class":147},[137,9126,9128,9130],{"class":139,"line":9127},453,[137,9129,5926],{"class":147},[137,9131,526],{"class":179},[137,9133,9135,9137,9139,9141],{"class":139,"line":9134},454,[137,9136,532],{"class":143},[137,9138,277],{"class":276},[137,9140,4531],{"class":241},[137,9142,540],{"class":147},[137,9144,9146,9148],{"class":139,"line":9145},455,[137,9147,8880],{"class":261},[137,9149,195],{"class":179},[137,9151,9153,9155],{"class":139,"line":9152},456,[137,9154,9063],{"class":158},[137,9156,195],{"class":179},[137,9158,9160,9163],{"class":139,"line":9159},457,[137,9161,9162],{"class":158},"      'Duolingo 返回结构异常'",[137,9164,195],{"class":179},[137,9166,9168],{"class":139,"line":9167},458,[137,9169,570],{"class":147},[137,9171,9173],{"class":139,"line":9172},459,[137,9174,576],{"class":179},[137,9176,9178],{"class":139,"line":9177},460,[137,9179,165],{"emptyLinePlaceholder":6},[137,9181,9183,9185,9187,9189,9191,9193,9195],{"class":139,"line":9182},461,[137,9184,273],{"class":143},[137,9186,644],{"class":147},[137,9188,288],{"class":151},[137,9190,2808],{"class":147},[137,9192,288],{"class":151},[137,9194,2452],{"class":241},[137,9196,6590],{"class":147},[137,9198,9200],{"class":139,"line":9199},462,[137,9201,227],{"class":179},[137,9203,9205],{"class":139,"line":9204},463,[137,9206,165],{"emptyLinePlaceholder":6},[137,9208,9210,9212,9214],{"class":139,"line":9209},464,[137,9211,238],{"class":143},[137,9213,2803],{"class":241},[137,9215,540],{"class":179},[137,9217,9219,9222],{"class":139,"line":9218},465,[137,9220,9221],{"class":248},"  users",[137,9223,195],{"class":179},[137,9225,9227,9230],{"class":139,"line":9226},466,[137,9228,9229],{"class":248},"  username",[137,9231,195],{"class":179},[137,9233,9235,9237],{"class":139,"line":9234},467,[137,9236,265],{"class":179},[137,9238,180],{"class":179},[137,9240,9242,9244,9246],{"class":139,"line":9241},468,[137,9243,392],{"class":143},[137,9245,2824],{"class":147},[137,9247,152],{"class":151},[137,9249,9251,9253,9255,9257],{"class":139,"line":9250},469,[137,9252,2169],{"class":147},[137,9254,288],{"class":151},[137,9256,703],{"class":241},[137,9258,604],{"class":147},[137,9260,9262],{"class":139,"line":9261},470,[137,9263,165],{"emptyLinePlaceholder":6},[137,9265,9267,9269,9271,9273,9275],{"class":139,"line":9266},471,[137,9268,273],{"class":143},[137,9270,671],{"class":147},[137,9272,288],{"class":151},[137,9274,676],{"class":241},[137,9276,540],{"class":147},[137,9278,9280,9282],{"class":139,"line":9279},472,[137,9281,684],{"class":248},[137,9283,687],{"class":143},[137,9285,9287,9289,9291,9293,9295],{"class":139,"line":9286},473,[137,9288,2863],{"class":151},[137,9290,1275],{"class":147},[137,9292,288],{"class":151},[137,9294,2178],{"class":147},[137,9296,709],{"class":151},[137,9298,9300,9303],{"class":139,"line":9299},474,[137,9301,9302],{"class":158},"        'string'",[137,9304,2877],{"class":151},[137,9306,9308,9310,9312,9314,9316,9318,9320],{"class":139,"line":9307},475,[137,9309,693],{"class":147},[137,9311,288],{"class":151},[137,9313,382],{"class":147},[137,9315,288],{"class":151},[137,9317,703],{"class":241},[137,9319,706],{"class":147},[137,9321,709],{"class":151},[137,9323,9325,9327],{"class":139,"line":9324},476,[137,9326,2898],{"class":147},[137,9328,195],{"class":179},[137,9330,9332],{"class":139,"line":9331},477,[137,9333,730],{"class":147},[137,9335,9337],{"class":139,"line":9336},478,[137,9338,227],{"class":179},[137,9340,9342],{"class":139,"line":9341},479,[137,9343,165],{"emptyLinePlaceholder":6},[137,9345,9347,9349,9351,9353],{"class":139,"line":9346},480,[137,9348,371],{"class":143},[137,9350,374],{"class":143},[137,9352,4182],{"class":241},[137,9354,540],{"class":179},[137,9356,9358,9360],{"class":139,"line":9357},481,[137,9359,9229],{"class":248},[137,9361,195],{"class":179},[137,9363,9365,9367],{"class":139,"line":9364},482,[137,9366,265],{"class":179},[137,9368,180],{"class":179},[137,9370,9372,9374,9376],{"class":139,"line":9371},483,[137,9373,392],{"class":143},[137,9375,617],{"class":147},[137,9377,152],{"class":151},[137,9379,9381,9384,9386],{"class":139,"line":9380},484,[137,9382,9383],{"class":143},"    await",[137,9385,8570],{"class":241},[137,9387,4185],{"class":147},[137,9389,9391],{"class":139,"line":9390},485,[137,9392,165],{"emptyLinePlaceholder":6},[137,9394,9396,9398,9400],{"class":139,"line":9395},486,[137,9397,392],{"class":143},[137,9399,1159],{"class":147},[137,9401,152],{"class":151},[137,9403,9405,9408],{"class":139,"line":9404},487,[137,9406,9407],{"class":241},"    findExactUser",[137,9409,540],{"class":147},[137,9411,9413,9416],{"class":139,"line":9412},488,[137,9414,9415],{"class":147},"      users",[137,9417,195],{"class":179},[137,9419,9421,9423],{"class":139,"line":9420},489,[137,9422,715],{"class":147},[137,9424,195],{"class":179},[137,9426,9428],{"class":139,"line":9427},490,[137,9429,570],{"class":147},[137,9431,9433],{"class":139,"line":9432},491,[137,9434,165],{"emptyLinePlaceholder":6},[137,9436,9438,9440,9442,9444,9447],{"class":139,"line":9437},492,[137,9439,509],{"class":143},[137,9441,512],{"class":147},[137,9443,515],{"class":151},[137,9445,9446],{"class":147},"user) ",[137,9448,526],{"class":179},[137,9450,9452,9454,9456,9458],{"class":139,"line":9451},493,[137,9453,532],{"class":143},[137,9455,277],{"class":276},[137,9457,4531],{"class":241},[137,9459,540],{"class":147},[137,9461,9463,9466],{"class":139,"line":9462},494,[137,9464,9465],{"class":261},"      404",[137,9467,195],{"class":179},[137,9469,9471,9474],{"class":139,"line":9470},495,[137,9472,9473],{"class":158},"      'user_not_found'",[137,9475,195],{"class":179},[137,9477,9479,9482,9484,9486,9488,9491],{"class":139,"line":9478},496,[137,9480,9481],{"class":158},"      `User \"",[137,9483,549],{"class":179},[137,9485,382],{"class":147},[137,9487,559],{"class":179},[137,9489,9490],{"class":158},"\" not found`",[137,9492,195],{"class":179},[137,9494,9496],{"class":139,"line":9495},497,[137,9497,570],{"class":147},[137,9499,9501],{"class":139,"line":9500},498,[137,9502,576],{"class":179},[137,9504,9506],{"class":139,"line":9505},499,[137,9507,165],{"emptyLinePlaceholder":6},[137,9509,9511,9513],{"class":139,"line":9510},500,[137,9512,273],{"class":143},[137,9514,9515],{"class":147}," user\n",[137,9517,9519],{"class":139,"line":9518},501,[137,9520,227],{"class":179},[137,9522,9524],{"class":139,"line":9523},502,[137,9525,165],{"emptyLinePlaceholder":6},[137,9527,9529,9531,9533,9535,9537,9539,9541],{"class":139,"line":9528},503,[137,9530,371],{"class":143},[137,9532,374],{"class":143},[137,9534,4141],{"class":241},[137,9536,245],{"class":179},[137,9538,4057],{"class":248},[137,9540,265],{"class":179},[137,9542,180],{"class":179},[137,9544,9546,9548,9550],{"class":139,"line":9545},504,[137,9547,392],{"class":143},[137,9549,1053],{"class":147},[137,9551,152],{"class":151},[137,9553,9555,9558],{"class":139,"line":9554},505,[137,9556,9557],{"class":241},"    getMeUsername",[137,9559,4408],{"class":147},[137,9561,9563],{"class":139,"line":9562},506,[137,9564,165],{"emptyLinePlaceholder":6},[137,9566,9568,9570,9572],{"class":139,"line":9567},507,[137,9569,392],{"class":143},[137,9571,1159],{"class":147},[137,9573,152],{"class":151},[137,9575,9577,9579,9581],{"class":139,"line":9576},508,[137,9578,9383],{"class":143},[137,9580,4182],{"class":241},[137,9582,4185],{"class":147},[137,9584,9586],{"class":139,"line":9585},509,[137,9587,165],{"emptyLinePlaceholder":6},[137,9589,9591,9593,9595,9597],{"class":139,"line":9590},510,[137,9592,392],{"class":143},[137,9594,4196],{"class":147},[137,9596,176],{"class":151},[137,9598,180],{"class":179},[137,9600,9602,9604,9606,9608],{"class":139,"line":9601},511,[137,9603,4205],{"class":151},[137,9605,4208],{"class":241},[137,9607,2364],{"class":147},[137,9609,195],{"class":179},[137,9611,9613,9615],{"class":139,"line":9612},512,[137,9614,4217],{"class":147},[137,9616,2233],{"class":151},[137,9618,9620,9622,9624,9626,9628,9630,9632],{"class":139,"line":9619},513,[137,9621,6760],{"class":276},[137,9623,2586],{"class":241},[137,9625,722],{"class":147},[137,9627,288],{"class":151},[137,9629,2616],{"class":241},[137,9631,722],{"class":147},[137,9633,195],{"class":179},[137,9635,9637],{"class":139,"line":9636},514,[137,9638,576],{"class":179},[137,9640,9642],{"class":139,"line":9641},515,[137,9643,165],{"emptyLinePlaceholder":6},[137,9645,9647,9649,9651,9653,9655,9657,9659],{"class":139,"line":9646},516,[137,9648,4246],{"class":143},[137,9650,769],{"class":147},[137,9652,288],{"class":151},[137,9654,4253],{"class":261},[137,9656,288],{"class":151},[137,9658,4258],{"class":241},[137,9660,540],{"class":147},[137,9662,9664,9666,9668],{"class":139,"line":9663},517,[137,9665,4265],{"class":241},[137,9667,4268],{"class":147},[137,9669,195],{"class":179},[137,9671,9673,9675,9677,9679,9681],{"class":139,"line":9672},518,[137,9674,4275],{"class":261},[137,9676,288],{"class":151},[137,9678,291],{"class":241},[137,9680,4282],{"class":147},[137,9682,195],{"class":179},[137,9684,9686],{"class":139,"line":9685},519,[137,9687,4289],{"class":179},[137,9689,9691,9693],{"class":139,"line":9690},520,[137,9692,4294],{"class":147},[137,9694,2233],{"class":151},[137,9696,9698,9701],{"class":139,"line":9697},521,[137,9699,9700],{"class":147},"        CACHE_TTL",[137,9702,195],{"class":179},[137,9704,9706],{"class":139,"line":9705},522,[137,9707,346],{"class":179},[137,9709,9711],{"class":139,"line":9710},523,[137,9712,730],{"class":147},[137,9714,9716],{"class":139,"line":9715},524,[137,9717,165],{"emptyLinePlaceholder":6},[137,9719,9721,9723],{"class":139,"line":9720},525,[137,9722,273],{"class":143},[137,9724,4320],{"class":147},[137,9726,9728],{"class":139,"line":9727},526,[137,9729,227],{"class":179},[137,9731,9733],{"class":139,"line":9732},527,[137,9734,165],{"emptyLinePlaceholder":6},[137,9736,9738,9740,9742],{"class":139,"line":9737},528,[137,9739,746],{"class":143},[137,9741,749],{"class":143},[137,9743,180],{"class":179},[137,9745,9747,9749,9751,9753,9755,9757,9759,9761],{"class":139,"line":9746},529,[137,9748,757],{"class":143},[137,9750,457],{"class":241},[137,9752,245],{"class":179},[137,9754,764],{"class":248},[137,9756,252],{"class":179},[137,9758,769],{"class":248},[137,9760,265],{"class":179},[137,9762,180],{"class":179},[137,9764,9766,9768],{"class":139,"line":9765},530,[137,9767,779],{"class":143},[137,9769,1972],{"class":147},[137,9771,9773,9776,9778,9780],{"class":139,"line":9772},531,[137,9774,9775],{"class":147},"      request",[137,9777,288],{"class":151},[137,9779,787],{"class":147},[137,9781,709],{"class":151},[137,9783,9785],{"class":139,"line":9784},532,[137,9786,9787],{"class":158},"      'OPTIONS'\n",[137,9789,9791,9793],{"class":139,"line":9790},533,[137,9792,2014],{"class":147},[137,9794,526],{"class":179},[137,9796,9798,9800,9802,9804,9806,9808,9810],{"class":139,"line":9797},534,[137,9799,804],{"class":143},[137,9801,277],{"class":276},[137,9803,280],{"class":241},[137,9805,245],{"class":147},[137,9807,813],{"class":143},[137,9809,252],{"class":179},[137,9811,180],{"class":179},[137,9813,9815,9817,9819,9821],{"class":139,"line":9814},535,[137,9816,823],{"class":147},[137,9818,189],{"class":151},[137,9820,828],{"class":261},[137,9822,195],{"class":179},[137,9824,9826,9828,9830,9832],{"class":139,"line":9825},536,[137,9827,836],{"class":147},[137,9829,189],{"class":151},[137,9831,842],{"class":841},[137,9833,195],{"class":179},[137,9835,9837,9839],{"class":139,"line":9836},537,[137,9838,850],{"class":179},[137,9840,355],{"class":147},[137,9842,9844],{"class":139,"line":9843},538,[137,9845,858],{"class":179},[137,9847,9849],{"class":139,"line":9848},539,[137,9850,165],{"emptyLinePlaceholder":6},[137,9852,9854,9856],{"class":139,"line":9853},540,[137,9855,779],{"class":143},[137,9857,1972],{"class":147},[137,9859,9861,9863,9865,9867,9869],{"class":139,"line":9860},541,[137,9862,9775],{"class":147},[137,9864,288],{"class":151},[137,9866,787],{"class":147},[137,9868,877],{"class":151},[137,9870,9871],{"class":158}," 'GET'\n",[137,9873,9875,9877],{"class":139,"line":9874},542,[137,9876,2014],{"class":147},[137,9878,526],{"class":179},[137,9880,9882,9884,9886],{"class":139,"line":9881},543,[137,9883,804],{"class":143},[137,9885,242],{"class":241},[137,9887,540],{"class":147},[137,9889,9891],{"class":139,"line":9890},544,[137,9892,899],{"class":179},[137,9894,9896,9898],{"class":139,"line":9895},545,[137,9897,905],{"class":147},[137,9899,2233],{"class":151},[137,9901,9903,9906],{"class":139,"line":9902},546,[137,9904,9905],{"class":158},"            'method_not_allowed'",[137,9907,195],{"class":179},[137,9909,9911],{"class":139,"line":9910},547,[137,9912,918],{"class":179},[137,9914,9916,9918],{"class":139,"line":9915},548,[137,9917,924],{"class":261},[137,9919,195],{"class":179},[137,9921,9923,9926],{"class":139,"line":9922},549,[137,9924,9925],{"class":158},"        'no-store'",[137,9927,195],{"class":179},[137,9929,9931],{"class":139,"line":9930},550,[137,9932,899],{"class":179},[137,9934,9936,9939,9941,9943],{"class":139,"line":9935},551,[137,9937,9938],{"class":147},"          Allow",[137,9940,189],{"class":151},[137,9942,206],{"class":158},[137,9944,195],{"class":179},[137,9946,9948],{"class":139,"line":9947},552,[137,9949,918],{"class":179},[137,9951,9953],{"class":139,"line":9952},553,[137,9954,932],{"class":147},[137,9956,9958],{"class":139,"line":9957},554,[137,9959,858],{"class":179},[137,9961,9963],{"class":139,"line":9962},555,[137,9964,165],{"emptyLinePlaceholder":6},[137,9966,9968,9970,9972],{"class":139,"line":9967},556,[137,9969,948],{"class":143},[137,9971,395],{"class":147},[137,9973,152],{"class":151},[137,9975,9977,9979,9981,9983,9985],{"class":139,"line":9976},557,[137,9978,6760],{"class":276},[137,9980,402],{"class":241},[137,9982,959],{"class":147},[137,9984,288],{"class":151},[137,9986,964],{"class":147},[137,9988,9990],{"class":139,"line":9989},558,[137,9991,165],{"emptyLinePlaceholder":6},[137,9993,9995,9997],{"class":139,"line":9994},559,[137,9996,1148],{"class":143},[137,9998,180],{"class":179},[137,10000,10002],{"class":139,"line":10001},560,[137,10003,10004],{"class":7809},"      \u002F\u002F 固定用户，每小时更新\n",[137,10006,10008,10010],{"class":139,"line":10007},561,[137,10009,1182],{"class":143},[137,10011,1972],{"class":147},[137,10013,10015,10018,10020,10022,10024],{"class":139,"line":10014},562,[137,10016,10017],{"class":147},"        url",[137,10019,288],{"class":151},[137,10021,982],{"class":147},[137,10023,790],{"class":151},[137,10025,10026],{"class":158}," '\u002Fme'\n",[137,10028,10030,10033],{"class":139,"line":10029},563,[137,10031,10032],{"class":147},"      ) ",[137,10034,526],{"class":179},[137,10036,10038],{"class":139,"line":10037},564,[137,10039,10040],{"class":7809},"        \u002F\u002F 是否强制刷新\n",[137,10042,10044,10047,10050],{"class":139,"line":10043},565,[137,10045,10046],{"class":143},"        const",[137,10048,10049],{"class":147}," refresh ",[137,10051,152],{"class":151},[137,10053,10055,10058,10060,10062,10064,10066],{"class":139,"line":10054},566,[137,10056,10057],{"class":147},"          url",[137,10059,288],{"class":151},[137,10061,421],{"class":147},[137,10063,288],{"class":151},[137,10065,4354],{"class":241},[137,10067,540],{"class":147},[137,10069,10071,10074],{"class":139,"line":10070},567,[137,10072,10073],{"class":158},"            'refresh'",[137,10075,195],{"class":179},[137,10077,10079],{"class":139,"line":10078},568,[137,10080,10081],{"class":147},"          )\n",[137,10083,10085],{"class":139,"line":10084},569,[137,10086,165],{"emptyLinePlaceholder":6},[137,10088,10090,10093],{"class":139,"line":10089},570,[137,10091,10092],{"class":143},"        if",[137,10094,1972],{"class":147},[137,10096,10098,10101,10104,10106],{"class":139,"line":10097},571,[137,10099,10100],{"class":841},"          refresh",[137,10102,10103],{"class":151}," !==",[137,10105,1319],{"class":143},[137,10107,2877],{"class":151},[137,10109,10111,10113,10115],{"class":139,"line":10110},572,[137,10112,10100],{"class":841},[137,10114,10103],{"class":151},[137,10116,10117],{"class":158}," '1'\n",[137,10119,10121,10124],{"class":139,"line":10120},573,[137,10122,10123],{"class":147},"        ) ",[137,10125,526],{"class":179},[137,10127,10129,10132,10134,10136],{"class":139,"line":10128},574,[137,10130,10131],{"class":143},"          throw",[137,10133,277],{"class":276},[137,10135,4531],{"class":241},[137,10137,540],{"class":147},[137,10139,10141,10144],{"class":139,"line":10140},575,[137,10142,10143],{"class":261},"            400",[137,10145,195],{"class":179},[137,10147,10149,10152],{"class":139,"line":10148},576,[137,10150,10151],{"class":158},"            'invalid_refresh'",[137,10153,195],{"class":179},[137,10155,10157,10160],{"class":139,"line":10156},577,[137,10158,10159],{"class":158},"            'refresh 参数仅支持 1'",[137,10161,195],{"class":179},[137,10163,10165],{"class":139,"line":10164},578,[137,10166,10081],{"class":147},[137,10168,10170],{"class":139,"line":10169},579,[137,10171,3855],{"class":179},[137,10173,10175],{"class":139,"line":10174},580,[137,10176,165],{"emptyLinePlaceholder":6},[137,10178,10180,10182,10185],{"class":139,"line":10179},581,[137,10181,10046],{"class":143},[137,10183,10184],{"class":147}," shouldRefresh ",[137,10186,152],{"class":151},[137,10188,10190,10192,10195],{"class":139,"line":10189},582,[137,10191,10100],{"class":841},[137,10193,10194],{"class":151}," ===",[137,10196,10117],{"class":158},[137,10198,10200],{"class":139,"line":10199},583,[137,10201,165],{"emptyLinePlaceholder":6},[137,10203,10205,10207,10209,10212,10214],{"class":139,"line":10204},584,[137,10206,10092],{"class":143},[137,10208,512],{"class":147},[137,10210,10211],{"class":841},"shouldRefresh",[137,10213,796],{"class":147},[137,10215,526],{"class":179},[137,10217,10219,10222],{"class":139,"line":10218},585,[137,10220,10221],{"class":241},"          assertRefreshAuthorized",[137,10223,540],{"class":147},[137,10225,10227,10230],{"class":139,"line":10226},586,[137,10228,10229],{"class":841},"            request",[137,10231,195],{"class":179},[137,10233,10235,10238],{"class":139,"line":10234},587,[137,10236,10237],{"class":841},"            env",[137,10239,195],{"class":179},[137,10241,10243],{"class":139,"line":10242},588,[137,10244,10081],{"class":147},[137,10246,10248],{"class":139,"line":10247},589,[137,10249,3855],{"class":179},[137,10251,10253],{"class":139,"line":10252},590,[137,10254,165],{"emptyLinePlaceholder":6},[137,10256,10258,10261,10263,10265],{"class":139,"line":10257},591,[137,10259,10260],{"class":143},"        let",[137,10262,644],{"class":841},[137,10264,258],{"class":151},[137,10266,1651],{"class":143},[137,10268,10270],{"class":139,"line":10269},592,[137,10271,165],{"emptyLinePlaceholder":6},[137,10273,10275,10277,10279,10281,10283,10285],{"class":139,"line":10274},593,[137,10276,10092],{"class":143},[137,10278,512],{"class":147},[137,10280,515],{"class":151},[137,10282,10211],{"class":841},[137,10284,796],{"class":147},[137,10286,526],{"class":179},[137,10288,10290,10293],{"class":139,"line":10289},594,[137,10291,10292],{"class":841},"          data",[137,10294,10295],{"class":151}," =\n",[137,10297,10299,10302,10304,10306,10308,10310,10312],{"class":139,"line":10298},595,[137,10300,10301],{"class":143},"            await",[137,10303,769],{"class":147},[137,10305,288],{"class":151},[137,10307,4253],{"class":261},[137,10309,288],{"class":151},[137,10311,4354],{"class":241},[137,10313,540],{"class":147},[137,10315,10317,10320,10322,10324,10326],{"class":139,"line":10316},596,[137,10318,10319],{"class":241},"              getMeCacheKey",[137,10321,245],{"class":147},[137,10323,4057],{"class":841},[137,10325,265],{"class":147},[137,10327,195],{"class":179},[137,10329,10331,10334],{"class":139,"line":10330},597,[137,10332,10333],{"class":158},"              'json'",[137,10335,195],{"class":179},[137,10337,10339],{"class":139,"line":10338},598,[137,10340,10341],{"class":147},"            )\n",[137,10343,10345],{"class":139,"line":10344},599,[137,10346,3855],{"class":179},[137,10348,10350],{"class":139,"line":10349},600,[137,10351,165],{"emptyLinePlaceholder":6},[137,10353,10355],{"class":139,"line":10354},601,[137,10356,10357],{"class":7809},"        \u002F\u002F 第一次访问时立即初始化，不用等待 Cron\n",[137,10359,10361,10363,10365,10367,10369,10371],{"class":139,"line":10360},602,[137,10362,10092],{"class":143},[137,10364,512],{"class":147},[137,10366,515],{"class":151},[137,10368,249],{"class":841},[137,10370,796],{"class":147},[137,10372,526],{"class":179},[137,10374,10376,10378],{"class":139,"line":10375},603,[137,10377,10292],{"class":841},[137,10379,10295],{"class":151},[137,10381,10383,10385,10387,10389,10391],{"class":139,"line":10382},604,[137,10384,10301],{"class":143},[137,10386,4141],{"class":241},[137,10388,245],{"class":147},[137,10390,4057],{"class":841},[137,10392,355],{"class":147},[137,10394,10396],{"class":139,"line":10395},605,[137,10397,3855],{"class":179},[137,10399,10401],{"class":139,"line":10400},606,[137,10402,165],{"emptyLinePlaceholder":6},[137,10404,10406,10408,10410],{"class":139,"line":10405},607,[137,10407,1199],{"class":143},[137,10409,242],{"class":241},[137,10411,540],{"class":147},[137,10413,10415,10417],{"class":139,"line":10414},608,[137,10416,10292],{"class":841},[137,10418,195],{"class":179},[137,10420,10422,10425],{"class":139,"line":10421},609,[137,10423,10424],{"class":261},"          200",[137,10426,195],{"class":179},[137,10428,10430],{"class":139,"line":10429},610,[137,10431,10432],{"class":841},"          shouldRefresh\n",[137,10434,10436,10439],{"class":139,"line":10435},611,[137,10437,10438],{"class":151},"            ?",[137,10440,10441],{"class":158}," 'no-store'\n",[137,10443,10445,10448,10451],{"class":139,"line":10444},612,[137,10446,10447],{"class":151},"            :",[137,10449,10450],{"class":158}," 'public, max-age=300'",[137,10452,195],{"class":179},[137,10454,10456],{"class":139,"line":10455},613,[137,10457,1242],{"class":147},[137,10459,10461],{"class":139,"line":10460},614,[137,10462,1248],{"class":179},[137,10464,10466],{"class":139,"line":10465},615,[137,10467,165],{"emptyLinePlaceholder":6},[137,10469,10471],{"class":139,"line":10470},616,[137,10472,10473],{"class":7809},"      \u002F\u002F 简略搜索\n",[137,10475,10477,10479],{"class":139,"line":10476},617,[137,10478,1182],{"class":143},[137,10480,1972],{"class":147},[137,10482,10484,10486,10488,10490],{"class":139,"line":10483},618,[137,10485,10017],{"class":147},[137,10487,288],{"class":151},[137,10489,982],{"class":147},[137,10491,709],{"class":151},[137,10493,10495],{"class":139,"line":10494},619,[137,10496,10497],{"class":158},"        '\u002Fsearch'\n",[137,10499,10501,10503],{"class":139,"line":10500},620,[137,10502,10032],{"class":147},[137,10504,526],{"class":179},[137,10506,10508,10510,10512],{"class":139,"line":10507},621,[137,10509,10046],{"class":143},[137,10511,1053],{"class":147},[137,10513,152],{"class":151},[137,10515,10517,10520,10522,10524],{"class":139,"line":10516},622,[137,10518,10519],{"class":241},"          getRequestUsername",[137,10521,245],{"class":147},[137,10523,5797],{"class":841},[137,10525,355],{"class":147},[137,10527,10529],{"class":139,"line":10528},623,[137,10530,165],{"emptyLinePlaceholder":6},[137,10532,10534,10536,10538],{"class":139,"line":10533},624,[137,10535,10046],{"class":143},[137,10537,617],{"class":147},[137,10539,152],{"class":151},[137,10541,10543,10546,10548,10550,10552],{"class":139,"line":10542},625,[137,10544,10545],{"class":143},"          await",[137,10547,8570],{"class":241},[137,10549,245],{"class":147},[137,10551,382],{"class":841},[137,10553,355],{"class":147},[137,10555,10557],{"class":139,"line":10556},626,[137,10558,165],{"emptyLinePlaceholder":6},[137,10560,10562,10564,10566],{"class":139,"line":10561},627,[137,10563,1199],{"class":143},[137,10565,242],{"class":241},[137,10567,540],{"class":147},[137,10569,10571],{"class":139,"line":10570},628,[137,10572,1209],{"class":179},[137,10574,10576,10579,10581,10583],{"class":139,"line":10575},629,[137,10577,10578],{"class":147},"            query",[137,10580,189],{"class":151},[137,10582,2813],{"class":841},[137,10584,195],{"class":179},[137,10586,10588,10591],{"class":139,"line":10587},630,[137,10589,10590],{"class":147},"            count",[137,10592,2233],{"class":151},[137,10594,10596,10599,10601,10604],{"class":139,"line":10595},631,[137,10597,10598],{"class":147},"              users",[137,10600,288],{"class":151},[137,10602,10603],{"class":147},"length",[137,10605,195],{"class":179},[137,10607,10609,10612],{"class":139,"line":10608},632,[137,10610,10611],{"class":147},"            users",[137,10613,2233],{"class":151},[137,10615,10617,10619,10621,10623],{"class":139,"line":10616},633,[137,10618,10598],{"class":147},[137,10620,288],{"class":151},[137,10622,2442],{"class":241},[137,10624,540],{"class":147},[137,10626,10628,10631],{"class":139,"line":10627},634,[137,10629,10630],{"class":841},"                summarizeUser",[137,10632,195],{"class":179},[137,10634,10636,10639],{"class":139,"line":10635},635,[137,10637,10638],{"class":147},"              )",[137,10640,195],{"class":179},[137,10642,10644,10647],{"class":139,"line":10643},636,[137,10645,10646],{"class":147},"            updatedAt",[137,10648,2233],{"class":151},[137,10650,10652,10655,10657],{"class":139,"line":10651},637,[137,10653,10654],{"class":276},"              new",[137,10656,2586],{"class":241},[137,10658,604],{"class":147},[137,10660,10662,10665,10667,10669],{"class":139,"line":10661},638,[137,10663,10664],{"class":151},"                .",[137,10666,2616],{"class":241},[137,10668,722],{"class":147},[137,10670,195],{"class":179},[137,10672,10674],{"class":139,"line":10673},639,[137,10675,1228],{"class":179},[137,10677,10679,10681],{"class":139,"line":10678},640,[137,10680,10424],{"class":261},[137,10682,195],{"class":179},[137,10684,10686,10689],{"class":139,"line":10685},641,[137,10687,10688],{"class":158},"          'public, max-age=300'",[137,10690,195],{"class":179},[137,10692,10694],{"class":139,"line":10693},642,[137,10695,1242],{"class":147},[137,10697,10699],{"class":139,"line":10698},643,[137,10700,1248],{"class":179},[137,10702,10704],{"class":139,"line":10703},644,[137,10705,165],{"emptyLinePlaceholder":6},[137,10707,10709],{"class":139,"line":10708},645,[137,10710,10711],{"class":7809},"      \u002F\u002F 详细搜索\n",[137,10713,10715,10717],{"class":139,"line":10714},646,[137,10716,1182],{"class":143},[137,10718,1972],{"class":147},[137,10720,10722,10724,10726,10728],{"class":139,"line":10721},647,[137,10723,10017],{"class":147},[137,10725,288],{"class":151},[137,10727,982],{"class":147},[137,10729,709],{"class":151},[137,10731,10733],{"class":139,"line":10732},648,[137,10734,10735],{"class":158},"        '\u002Fdetail'\n",[137,10737,10739,10741],{"class":139,"line":10738},649,[137,10740,10032],{"class":147},[137,10742,526],{"class":179},[137,10744,10746,10748,10750],{"class":139,"line":10745},650,[137,10747,10046],{"class":143},[137,10749,1053],{"class":147},[137,10751,152],{"class":151},[137,10753,10755,10757,10759,10761],{"class":139,"line":10754},651,[137,10756,10519],{"class":241},[137,10758,245],{"class":147},[137,10760,5797],{"class":841},[137,10762,355],{"class":147},[137,10764,10766],{"class":139,"line":10765},652,[137,10767,165],{"emptyLinePlaceholder":6},[137,10769,10771,10773,10775],{"class":139,"line":10770},653,[137,10772,10046],{"class":143},[137,10774,1159],{"class":147},[137,10776,152],{"class":151},[137,10778,10780,10782,10784],{"class":139,"line":10779},654,[137,10781,10545],{"class":143},[137,10783,4182],{"class":241},[137,10785,540],{"class":147},[137,10787,10789,10792],{"class":139,"line":10788},655,[137,10790,10791],{"class":841},"            username",[137,10793,195],{"class":179},[137,10795,10797],{"class":139,"line":10796},656,[137,10798,10081],{"class":147},[137,10800,10802],{"class":139,"line":10801},657,[137,10803,165],{"emptyLinePlaceholder":6},[137,10805,10807,10809,10811],{"class":139,"line":10806},658,[137,10808,1199],{"class":143},[137,10810,242],{"class":241},[137,10812,540],{"class":147},[137,10814,10816],{"class":139,"line":10815},659,[137,10817,1209],{"class":179},[137,10819,10821,10823,10825,10827],{"class":139,"line":10820},660,[137,10822,10578],{"class":147},[137,10824,189],{"class":151},[137,10826,2813],{"class":841},[137,10828,195],{"class":179},[137,10830,10832,10834],{"class":139,"line":10831},661,[137,10833,2593],{"class":147},[137,10835,2233],{"class":151},[137,10837,10839,10842,10844,10846,10848],{"class":139,"line":10838},662,[137,10840,10841],{"class":241},"              detailUser",[137,10843,245],{"class":147},[137,10845,1189],{"class":841},[137,10847,265],{"class":147},[137,10849,195],{"class":179},[137,10851,10853,10855],{"class":139,"line":10852},663,[137,10854,10646],{"class":147},[137,10856,2233],{"class":151},[137,10858,10860,10862,10864],{"class":139,"line":10859},664,[137,10861,10654],{"class":276},[137,10863,2586],{"class":241},[137,10865,604],{"class":147},[137,10867,10869,10871,10873,10875],{"class":139,"line":10868},665,[137,10870,10664],{"class":151},[137,10872,2616],{"class":241},[137,10874,722],{"class":147},[137,10876,195],{"class":179},[137,10878,10880],{"class":139,"line":10879},666,[137,10881,1228],{"class":179},[137,10883,10885,10887],{"class":139,"line":10884},667,[137,10886,10424],{"class":261},[137,10888,195],{"class":179},[137,10890,10892,10894],{"class":139,"line":10891},668,[137,10893,10688],{"class":158},[137,10895,195],{"class":179},[137,10897,10899],{"class":139,"line":10898},669,[137,10900,1242],{"class":147},[137,10902,10904],{"class":139,"line":10903},670,[137,10905,1248],{"class":179},[137,10907,10909],{"class":139,"line":10908},671,[137,10910,165],{"emptyLinePlaceholder":6},[137,10912,10914,10916,10918],{"class":139,"line":10913},672,[137,10915,804],{"class":143},[137,10917,242],{"class":241},[137,10919,540],{"class":147},[137,10921,10923],{"class":139,"line":10922},673,[137,10924,899],{"class":179},[137,10926,10928,10930,10932,10934],{"class":139,"line":10927},674,[137,10929,905],{"class":147},[137,10931,189],{"class":151},[137,10933,1015],{"class":158},[137,10935,195],{"class":179},[137,10937,10939],{"class":139,"line":10938},675,[137,10940,918],{"class":179},[137,10942,10944,10946],{"class":139,"line":10943},676,[137,10945,1028],{"class":261},[137,10947,195],{"class":179},[137,10949,10951],{"class":139,"line":10950},677,[137,10952,932],{"class":147},[137,10954,10956],{"class":139,"line":10955},678,[137,10957,858],{"class":179},[137,10959,10961,10963,10965,10968,10970],{"class":139,"line":10960},679,[137,10962,1403],{"class":143},[137,10964,512],{"class":147},[137,10966,10967],{"class":841},"error",[137,10969,796],{"class":147},[137,10971,526],{"class":179},[137,10973,10975,10978,10980,10982,10984,10986],{"class":139,"line":10974},680,[137,10976,10977],{"class":147},"      console",[137,10979,288],{"class":151},[137,10981,10967],{"class":241},[137,10983,245],{"class":147},[137,10985,10967],{"class":841},[137,10987,355],{"class":147},[137,10989,10991],{"class":139,"line":10990},681,[137,10992,165],{"emptyLinePlaceholder":6},[137,10994,10996,10998],{"class":139,"line":10995},682,[137,10997,1182],{"class":143},[137,10999,1972],{"class":147},[137,11001,11003,11006],{"class":139,"line":11002},683,[137,11004,11005],{"class":841},"        error",[137,11007,11008],{"class":143}," instanceof\n",[137,11010,11012],{"class":139,"line":11011},684,[137,11013,11014],{"class":841},"        HttpError\n",[137,11016,11018,11020],{"class":139,"line":11017},685,[137,11019,10032],{"class":147},[137,11021,526],{"class":179},[137,11023,11025,11027,11029],{"class":139,"line":11024},686,[137,11026,1199],{"class":143},[137,11028,242],{"class":241},[137,11030,540],{"class":147},[137,11032,11034],{"class":139,"line":11033},687,[137,11035,1209],{"class":179},[137,11037,11039,11041,11043,11046,11048,11050],{"class":139,"line":11038},688,[137,11040,1215],{"class":147},[137,11042,189],{"class":151},[137,11044,11045],{"class":147}," error",[137,11047,288],{"class":151},[137,11049,34],{"class":147},[137,11051,195],{"class":179},[137,11053,11055,11058],{"class":139,"line":11054},689,[137,11056,11057],{"class":147},"            message",[137,11059,2233],{"class":151},[137,11061,11063,11066,11068,11071],{"class":139,"line":11062},690,[137,11064,11065],{"class":147},"              error",[137,11067,288],{"class":151},[137,11069,11070],{"class":147},"message",[137,11072,195],{"class":179},[137,11074,11076],{"class":139,"line":11075},691,[137,11077,1228],{"class":179},[137,11079,11081,11083,11085,11087],{"class":139,"line":11080},692,[137,11082,905],{"class":147},[137,11084,288],{"class":151},[137,11086,556],{"class":147},[137,11088,195],{"class":179},[137,11090,11092,11095],{"class":139,"line":11091},693,[137,11093,11094],{"class":158},"          'no-store'",[137,11096,195],{"class":179},[137,11098,11100,11102,11104,11106],{"class":139,"line":11099},694,[137,11101,905],{"class":147},[137,11103,288],{"class":151},[137,11105,4585],{"class":147},[137,11107,195],{"class":179},[137,11109,11111],{"class":139,"line":11110},695,[137,11112,1242],{"class":147},[137,11114,11116],{"class":139,"line":11115},696,[137,11117,1248],{"class":179},[137,11119,11121],{"class":139,"line":11120},697,[137,11122,165],{"emptyLinePlaceholder":6},[137,11124,11126,11128,11130],{"class":139,"line":11125},698,[137,11127,804],{"class":143},[137,11129,242],{"class":241},[137,11131,540],{"class":147},[137,11133,11135],{"class":139,"line":11134},699,[137,11136,899],{"class":179},[137,11138,11140,11142],{"class":139,"line":11139},700,[137,11141,905],{"class":147},[137,11143,2233],{"class":151},[137,11145,11147,11150],{"class":139,"line":11146},701,[137,11148,11149],{"class":158},"            'internal_error'",[137,11151,195],{"class":179},[137,11153,11155,11158],{"class":139,"line":11154},702,[137,11156,11157],{"class":147},"          message",[137,11159,2233],{"class":151},[137,11161,11163,11166],{"class":139,"line":11162},703,[137,11164,11165],{"class":158},"            '服务暂时不可用'",[137,11167,195],{"class":179},[137,11169,11171],{"class":139,"line":11170},704,[137,11172,918],{"class":179},[137,11174,11176,11178],{"class":139,"line":11175},705,[137,11177,1125],{"class":261},[137,11179,195],{"class":179},[137,11181,11183],{"class":139,"line":11182},706,[137,11184,932],{"class":147},[137,11186,11188],{"class":139,"line":11187},707,[137,11189,858],{"class":179},[137,11191,11193],{"class":139,"line":11192},708,[137,11194,1460],{"class":179},[137,11196,11198],{"class":139,"line":11197},709,[137,11199,165],{"emptyLinePlaceholder":6},[137,11201,11203],{"class":139,"line":11202},710,[137,11204,11205],{"class":7809},"  \u002F\u002F cron 定时方法\n",[137,11207,11209,11212,11214,11217,11219,11221,11223,11226,11228],{"class":139,"line":11208},711,[137,11210,11211],{"class":241},"  scheduled",[137,11213,245],{"class":179},[137,11215,11216],{"class":248},"_event",[137,11218,252],{"class":179},[137,11220,769],{"class":248},[137,11222,252],{"class":179},[137,11224,11225],{"class":248}," ctx",[137,11227,265],{"class":179},[137,11229,180],{"class":179},[137,11231,11233,11236,11238,11240],{"class":139,"line":11232},712,[137,11234,11235],{"class":147},"    ctx",[137,11237,288],{"class":151},[137,11239,4821],{"class":241},[137,11241,540],{"class":147},[137,11243,11245,11248,11250,11252,11254],{"class":139,"line":11244},713,[137,11246,11247],{"class":241},"      updateMe",[137,11249,245],{"class":147},[137,11251,4057],{"class":841},[137,11253,265],{"class":147},[137,11255,195],{"class":179},[137,11257,11259],{"class":139,"line":11258},714,[137,11260,570],{"class":147},[137,11262,11264],{"class":139,"line":11263},715,[137,11265,1460],{"class":179},[137,11267,11269],{"class":139,"line":11268},716,[137,11270,227],{"class":179},[76,11272],{},[79,11274,11276],{"id":11275},"cloudflare-中需要配置的内容","Cloudflare 中需要配置的内容",[105,11278,11279],{"id":11279},"普通环境变量",[63,11281,11284],{"className":11282,"code":11283,"language":68,"meta":69},[66],"USERNAME\n",[34,11285,11283],{"__ignoreMap":69},[17,11287,11288],{},"值为固定查询的 Duolingo 用户名。",[105,11290,11292],{"id":11291},"secret","Secret",[63,11294,11296],{"className":11295,"code":4505,"language":68,"meta":69},[66],[34,11297,4505],{"__ignoreMap":69},[17,11299,11300],{},"用于保护强制刷新接口，不要直接写在代码中。",[105,11302,11304],{"id":11303},"kv-binding","KV Binding",[63,11306,11309],{"className":11307,"code":11308,"language":68,"meta":69},[66],"DUO_CACHE\n",[34,11310,11308],{"__ignoreMap":69},[17,11312,11313,11314,11316],{},"用于缓存 ",[34,11315,2088],{}," 的用户数据。",[105,11318,11320],{"id":11319},"cron-trigger","Cron Trigger",[63,11322,11324],{"className":11323,"code":4776,"language":68,"meta":69},[66],[34,11325,4776],{"__ignoreMap":69},[17,11327,11328],{},"每小时更新一次固定用户的数据。",[76,11330],{},[79,11332,11333],{"id":11333},"接口列表",[17,11335,11336],{},"查询固定用户：",[63,11338,11340],{"className":11339,"code":101,"language":68,"meta":69},[66],[34,11341,101],{"__ignoreMap":69},[17,11343,11344],{},"强制刷新固定用户：",[63,11346,11349],{"className":11347,"code":11348,"language":68,"meta":69},[66],"GET \u002Fme?refresh=1\nAuthorization: Bearer REFRESH_TOKEN\n",[34,11350,11348],{"__ignoreMap":69},[17,11352,11353],{},"搜索用户：",[63,11355,11358],{"className":11356,"code":11357,"language":68,"meta":69},[66],"GET \u002Fsearch?username=用户名\n",[34,11359,11357],{"__ignoreMap":69},[17,11361,11362],{},"查询精确用户详情：",[63,11364,11367],{"className":11365,"code":11366,"language":68,"meta":69},[66],"GET \u002Fdetail?username=用户名\n",[34,11368,11366],{"__ignoreMap":69},[17,11370,11371],{},"这个版本已经能满足个人主页、状态卡片或者博客组件的使用需求。",[17,11373,11374],{},"继续往下扩展时，可以考虑限制允许访问的域名、给公开搜索接口增加限流，或者把响应格式抽成固定版本，避免上游字段变化直接影响前端。",[79,11376,11378],{"id":11377},"reference","Reference",[27,11380,11381],{},[30,11382,11383,4025],{},[11384,11385,11389],"a",{"href":11386,"rel":11387},"https:\u002F\u002Fleanrada.com\u002Fnotes\u002Fget-duolingo-streak\u002F",[11388],"nofollow","getDuolingoStreak() — Lean Rada",[11391,11392,11393],"style",{},"html pre.shiki code .sDkzg, html code.shiki .sDkzg{--shiki-default:#CBA6F7;--shiki-light:#8839EF}html pre.shiki code .szT_X, html code.shiki .szT_X{--shiki-default:#CDD6F4;--shiki-light:#4C4F69}html pre.shiki code .siJSA, html code.shiki .siJSA{--shiki-default:#94E2D5;--shiki-light:#179299}html pre.shiki code .ssZzq, html code.shiki .ssZzq{--shiki-default:#A6E3A1;--shiki-light:#40A02B}html pre.shiki code .sxk1D, html code.shiki .sxk1D{--shiki-default:#9399B2;--shiki-light:#7C7F93}html pre.shiki code .s3Fsb, html code.shiki .s3Fsb{--shiki-default:#89B4FA;--shiki-default-font-style:italic;--shiki-light:#1E66F5;--shiki-light-font-style:italic}html pre.shiki code .sYNyg, html code.shiki .sYNyg{--shiki-default:#EBA0AC;--shiki-default-font-style:italic;--shiki-light:#E64553;--shiki-light-font-style:italic}html pre.shiki code .s_wmW, html code.shiki .s_wmW{--shiki-default:#FAB387;--shiki-light:#FE640B}html pre.shiki code .sNeR2, html code.shiki .sNeR2{--shiki-default:#CBA6F7;--shiki-default-font-weight:bold;--shiki-light:#8839EF;--shiki-light-font-weight:bold}html pre.shiki code .sAKOx, html code.shiki .sAKOx{--shiki-default:#EBA0AC;--shiki-light:#E64553}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .sZBvu, html code.shiki .sZBvu{--shiki-default:#89B4FA;--shiki-light:#1E66F5}html pre.shiki code .s9Cko, html code.shiki .s9Cko{--shiki-default:#F5C2E7;--shiki-light:#EA76CB}html pre.shiki code .szFfR, html code.shiki .szFfR{--shiki-default:#F9E2AF;--shiki-default-font-style:italic;--shiki-light:#DF8E1D;--shiki-light-font-style:italic}html pre.shiki code .s3vbe, html code.shiki .s3vbe{--shiki-default:#F38BA8;--shiki-light:#D20F39}html pre.shiki code .s0D_2, html code.shiki .s0D_2{--shiki-default:#9399B2;--shiki-default-font-style:italic;--shiki-light:#7C7F93;--shiki-light-font-style:italic}",{"title":69,"searchDepth":301,"depth":183,"links":11395},[11396,11400,11401,11405,11406,11407,11408,11409,11410,11411,11417,11418],{"id":81,"depth":155,"text":82,"children":11397},[11398,11399],{"id":107,"depth":162,"text":107},{"id":128,"depth":162,"text":128},{"id":1601,"depth":155,"text":1601},{"id":2082,"depth":155,"text":2082,"children":11402},[11403,11404],{"id":2120,"depth":162,"text":2120},{"id":2384,"depth":162,"text":2384},{"id":2913,"depth":155,"text":2913},{"id":4018,"depth":155,"text":4019},{"id":4438,"depth":155,"text":4438},{"id":4765,"depth":155,"text":4766},{"id":4847,"depth":155,"text":4847},{"id":5139,"depth":155,"text":5139},{"id":11275,"depth":155,"text":11276,"children":11412},[11413,11414,11415,11416],{"id":11279,"depth":162,"text":11279},{"id":11291,"depth":162,"text":11292},{"id":11303,"depth":162,"text":11304},{"id":11319,"depth":162,"text":11320},{"id":11333,"depth":155,"text":11333},{"id":11377,"depth":155,"text":11378},[11420],"工具","\u002Fimages\u002F2026\u002Fduolingo\u002Fduolingo.png","本文介绍使用 Cloudflare Workers 构建 Duolingo 用户信息接口，解决跨域与缓存问题。接口支持按环境变量查询固定用户，返回昵称、头像、经验及连续学习天数，并提供搜索和其他用户详情接口。通过 KV 缓存和定时任务减少上游请求，支持带鉴权的手动刷新，并包含超时和错误处理。","md",{},"\u002Fposts\u002F2026\u002Fduolingo",0,"2026-07-14",{"title":5,"description":11422},"posts\u002F2026\u002Fduolingo","ai",[11432,11433],"API","Cloudflare","#a369ff",false,1581,"T5ISQTF2QN8mbjtQYSBCghOiS34KpnvcYPNWIgTjDuY",[11439,11454,11468,11476,11489,11503,11515,11525,11528,11540,11551,11562,11574,11584,11597,11608,11616,11629,11641,11653,11665,11673,11683,11692],{"path":11440,"stem":11441,"title":11442,"description":11443,"wordCount":11444,"publish":11445,"update":11445,"cover":11446,"tags":11447,"categories":11453,"series":7,"seriesOrder":7,"pin":11426,"wip":11435,"theme":11434},"\u002Fposts\u002F2026\u002Fwsl3","posts\u002F2026\u002Fwsl3","WSL 3 正式发布~","微软发布 WSL 3.0.1，正式提供稳定的 WSL 容器功能，无需 Docker 即可原生创建和运行 Linux 容器。该版本改进包括跨操作系统文件访问性能最高提升至原来的两倍（采用 virtiofs），以及网络模式 Consomme 优化端口映射和 VPN 兼容性。文章介绍了 WSL 安装、从 WSL 2 升级的方法，并示例使用 wslc 运行 Ubuntu、Nginx 容器及构建自定义镜像。",1038,"2026-10-01","\u002Fimages\u002F2026\u002Fwsl3\u002Fwsl3.png",[11448,11449,11450,11451,11452],"WSL","Linux","Windows","Docker","容器",[11420],{"path":11455,"stem":11456,"title":11457,"description":11458,"wordCount":11459,"publish":11460,"update":7,"cover":11461,"tags":11462,"categories":11467,"series":7,"seriesOrder":7,"pin":11426,"wip":11435,"theme":11434},"\u002Fposts\u002F2026\u002Fcodex-prompt","posts\u002F2026\u002Fcodex-prompt","Codex 的 GPT-6 Sol 提示词泄露了？","文章围绕网传Codex GPT-6 Sol提示词泄露展开，选取部分内容解读。提示词要求像同事一样交流、降低认知负担，用具体描述并说明改动、原因、测试与风险；明确禁止使用AI套话；通过高质量和低质量示例约束输出。摘要表还涵盖沟通、执行、权限、长期任务、工具与界面、质量与证据等核心要求。",1073,"2026-09-25","\u002Fimages\u002F2026\u002Fcodex-prompt\u002Fcodex-prompt.png",[11463,11464,11465,11466],"AI","Codex","提示词","Agent",[11463],{"path":11469,"stem":11470,"title":11471,"description":11472,"wordCount":11473,"publish":11460,"update":7,"cover":7,"tags":11474,"categories":11475,"series":7,"seriesOrder":7,"pin":11426,"wip":11435,"theme":11434},"\u002Fposts\u002F2026\u002Fcodex-prompt-translation","posts\u002F2026\u002Fcodex-prompt-translation","Codex GPT-6 Sol 提示词完整中文译文","第三方仓库收录的 Codex GPT-6 Sol 提示词中文译文，按原顺序保留全部 54 个模板。",34261,[11463,11464,11465,11466],[11463],{"path":11477,"stem":11478,"title":11479,"description":11480,"wordCount":11481,"publish":11482,"update":11483,"cover":11484,"tags":11485,"categories":11488,"series":7,"seriesOrder":7,"pin":11426,"wip":11435,"theme":11434},"\u002Fposts\u002F2026\u002Fjev","posts\u002F2026\u002Fjev","JEV 是好模型吗？","本文评析JEV模型，认为其并非通用大模型，而是专做预定义判断的System One模型，通过选择、评分、是非题返回结构化结果，不生成文本。其快与便宜源于非自回归并行输出，但“零幻觉”仅指输出结构合规，判断仍可能出错。该思路适用于答案范围明确、需频繁调用的场景，也可用普通大模型近似实现，核心在于把任务收窄为单一判断。",2429,"2026-09-21","2026-09-23","\u002Fimages\u002F2026\u002Fjev\u002Fjev.webp",[11463,11486,11487],"JEV","LLM",[11463],{"path":11490,"stem":11491,"title":11492,"description":11493,"wordCount":11494,"publish":11495,"update":11496,"cover":7,"tags":11497,"categories":11501,"series":7,"seriesOrder":7,"pin":11426,"wip":11435,"theme":11434},"\u002Fposts\u002Fblog\u002Foverview","posts\u002F2.blog\u002F01.overview","新版博客已上线！","新版博客“mukuchi”上线，具备文章写作、标签分类、全文搜索、阅读目录、代码复制、图片缩放、深浅主题切换及移动端适配等功能。内容以Markdown和MDC编写，后台支持草稿、上传、预览与发布，并可生成AI摘要、朗读和双人播客。技术栈采用Nuxt、Vue、UnoCSS、Nuxt Content及Cloudflare服务，文章存于GitHub仓库。后续计划增加工具、重做账号系统并改为站内评论。",1059,"2026-09-14","2026-09-22",[11498,11499,11500,11433],"博客","Nuxt","Vue",[11502],"建站记录",{"path":11504,"stem":11505,"title":11506,"description":11507,"wordCount":8600,"publish":11508,"update":7,"cover":7,"tags":11509,"categories":11513,"series":7,"seriesOrder":7,"pin":11426,"wip":11435,"theme":11434},"\u002Fposts\u002F2026\u002Fgame-dlss5","posts\u002F2026\u002Fgame-dlss5","哦，我的上帝！这是真实的！ —— DLSS 5 渲染实测","文章以《崩坏3rd》和《崩坏：星穹铁道》为例，展示DLSS 5渲染在多个场景下开启与关闭的画面对比。教程说明通过XXMI-Launcher注入ReShade的d3d12.dll，启动游戏后按Home键配置RenoDX DLSS参数，并提示下线前需手动关闭。文末附相关工具与网盘资源下载方式。","2026-09-08",[11510,11511,11512],"DLSS5","mod","xxmi",[11514],"游戏",{"path":11516,"stem":11517,"title":11518,"description":11519,"wordCount":7173,"publish":11520,"update":11521,"cover":7,"tags":11522,"categories":11524,"series":7,"seriesOrder":7,"pin":11426,"wip":11435,"theme":11434},"\u002Fposts\u002F2026\u002Fmilanote-api","posts\u002F2026\u002Fmilanote-api","Milanote API","本文介绍了作者开发的 Milanote API 项目，用于在外部使用 Milanote 分享 Board 的内容。项目已完成根据分享链接获取完整 API 数据、解析卡片内容与布局、构建 Playground 在线可视化示例、部署至 Cloudflare Workers 并提供字段筛选功能；待实现免密钥在线解析。文章还说明了获取 Milanote 只读分享链接的步骤，并展示了 Playground 界面效果。","2026-07-22","2026-07-23",[11523,11432],"Milanote",[11420],{"path":11425,"stem":11429,"title":5,"description":11422,"wordCount":11436,"publish":11427,"update":7,"cover":11421,"tags":11526,"categories":11527,"series":7,"seriesOrder":7,"pin":11426,"wip":11435,"theme":11434},[11432,11433],[11420],{"path":11529,"stem":11530,"title":11531,"description":11532,"wordCount":6398,"publish":11533,"update":7,"cover":7,"tags":11534,"categories":11539,"series":7,"seriesOrder":7,"pin":11426,"wip":11435,"theme":11434},"\u002Fposts\u002Fblender","posts\u002Fblender\u002Findex","Blender 专题","本文介绍Blender这一免费开源3D建模软件，涵盖建模、动画、渲染、视频剪辑等功能，适合从入门到高级开发。文档提供官网地址；教程部分包含动画大师课VV purple、角色建模课Zimon3D，并附B站链接；素材推荐BlenderKit官方素材库、Sketchfab及模之屋等免费资源平台。","2026-06-18",[11535,11536,11537,11538],"Blender","3D","建模","动画",[11535],{"path":11541,"stem":11542,"title":11543,"description":11544,"wordCount":8843,"publish":11533,"update":7,"cover":7,"tags":11545,"categories":11550,"series":7,"seriesOrder":7,"pin":11426,"wip":11435,"theme":11434},"\u002Fposts\u002Fthreejs","posts\u002Fthreejs\u002Findex","Three.js 专题","本文介绍Three.js作为Web端主流3D图形库，封装WebGL\u002FWebGPU，用于构建3D场景、动画、游戏和数据可视化等。文章汇总官方资源，包括官网、示例、文档、教程、在线编辑器和GitHub仓库。基础使用方面，说明在Vue3中通过TresJS、React中通过React Three Fiber进行组件化开发，并提及GSAP动画库和Blender建模软件。其他资源推荐Three.js Journey系统教程、The Book of Shaders书籍和Kenney免费游戏素材，AI与问题部分尚在完善中。",[11546,11547,11548,11549],"Three.js","WebGL","WebGPU","Shader",[11546],{"path":11552,"stem":11553,"title":11554,"description":11555,"wordCount":11556,"publish":11557,"update":11557,"cover":11558,"tags":11559,"categories":11561,"series":7,"seriesOrder":7,"pin":11426,"wip":11435,"theme":11434},"\u002Fposts\u002F2025\u002Fmagic-js","posts\u002F2025\u002Fmagic-js","你能看懂这些 JavaScript 表达式吗？","本文解析了JavaScript中多个怪异表达式结果的原因，指出其源于IEEE 754浮点数表示、隐式类型转换及同一符号在不同语法环境中的歧义。例如NaN为number、大整数舍入、0.1+0.2不等于0.3、空数组与对象相加、布尔值运算及宽松相等等行为，均可据此解释。建议工程中使用严格相等和明确转换以避免陷阱。",2035,"2025-07-31","\u002Fimages\u002F2025\u002Fmagic-js\u002Fmagic-js.png",[11560],"JavaScript",[11560],{"path":11563,"stem":11564,"title":11565,"description":11566,"wordCount":11567,"publish":11568,"update":11569,"cover":11570,"tags":11571,"categories":11573,"series":7,"seriesOrder":7,"pin":11426,"wip":11435,"theme":11434},"\u002Fposts\u002F2021\u002Fgit","posts\u002F2021\u002Fgit","Git 笔记","本文介绍Git的安装与基础配置，涵盖用户名邮箱设置及配置作用域优先级；解释工作区、暂存区和本地仓库的工作流；列举git add、commit、branch、switch、log、diff、stash、rm、mv等常用命令；说明查看日志、比较差异、对象关系、搁置改动、忽略文件等操作；并回答删除分支、修改提交信息、合并提交、取消暂存、丢弃改动和删除文件等常见问题。",878,"2021-09-07","2026-05-17","https:\u002F\u002Fgit-scm.com\u002Fimages\u002Flogo@2x.png",[11572],"Git",[11420],{"path":11575,"stem":11576,"title":11577,"description":11578,"wordCount":10234,"publish":11579,"update":7,"cover":11580,"tags":11581,"categories":11583,"series":7,"seriesOrder":7,"pin":11426,"wip":11435,"theme":11434},"\u002Fposts\u002F2021\u002Fhexo-editor","posts\u002F2021\u002Fhexo-editor","HexoEditor(适用于Hexo的专用编辑器)","本文介绍了专为Hexo优化的Markdown编辑器HexoEditor。该编辑器预览效果与Hexo生成页面高度相似，支持快速执行Hexo命令。软件开源，可从GitHub获取安装程序及中英文手册。配置包括通用、编辑、Hexo路径设置、渲染主题（支持GitHub和Next）以及图片云存储（如SM.MS、腾讯云等）。还提供右键快捷操作Hexo命令。","2021-03-22","\u002Fimages\u002F2021\u002Fhexo-editor\u002Fhexo-editor.jpg",[11420,11582],"Hexo",[11420],{"path":11585,"stem":11586,"title":11587,"description":11588,"wordCount":11589,"publish":11579,"update":7,"cover":11590,"tags":11591,"categories":11595,"series":7,"seriesOrder":7,"pin":11426,"wip":11435,"theme":11434},"\u002Fposts\u002F2021\u002Ftomcat-servlet","posts\u002F2021\u002Ftomcat-servlet","Tomcat和Servlet应用配置及部分问题","本文介绍Tomcat与Servlet的配置及常见问题。Tomcat部分涵盖安装、环境变量、启动关闭、乱码与端口占用处理、项目部署及IDEA集成。Servlet部分说明实现方式、生命周期、请求与响应对象、乱码处理、请求转发与重定向，以及Cookie、Session、ServletContext等对象和三大域对象的作用范围。",4196,"\u002Fimages\u002F2021\u002Ftomcat-servlet\u002Ftomcat-servlet.jpg",[11592,11593,11594],"JavaWEb","Tomcat","Servlet",[11596],"笔记",{"path":11598,"stem":11599,"title":11600,"description":11601,"wordCount":11602,"publish":11603,"update":7,"cover":11604,"tags":11605,"categories":11607,"series":7,"seriesOrder":7,"pin":11426,"wip":11435,"theme":11434},"\u002Fposts\u002F2021\u002Fgithub-actions","posts\u002F2021\u002Fgithub-actions","使用Github Action实现全自动部署","本文介绍使用GitHub Action实现Hexo博客全自动部署的流程。需先获取GitHub与Coding的个人访问令牌，创建存放源码的私有仓库，并在站点配置中设置部署仓库地址和令牌。接着在.github\u002Fworkflows目录创建自动部署工作流文件，配置检出、安装Node与Hexo、缓存依赖、生成静态文件和部署步骤。随后更新远程仓库分支，添加.gitignore屏蔽项并推送源码，最后通过Actions查看部署状态。",910,"2021-01-26","\u002Fimages\u002F2021\u002Fgithub-actions\u002Fgithub-actions.jpg",[11606],"博客优化",[11606],{"path":11609,"stem":11610,"title":11611,"description":11612,"wordCount":7481,"publish":11603,"update":7,"cover":11613,"tags":11614,"categories":11615,"series":7,"seriesOrder":7,"pin":11426,"wip":11435,"theme":11434},"\u002Fposts\u002F2021\u002Fhexo-auto-open-editor","posts\u002F2021\u002Fhexo-auto-open-editor","Hexo添加文章时自动打开编辑器","本文介绍Hexo新建文章后自动打开编辑器的方法。通过监听Hexo的new事件并在scripts目录下添加脚本，利用child_process.exec执行系统命令，Windows使用start、macOS使用open -a启动指定编辑器并打开新文章路径。用户需替换脚本中的编辑器绝对地址，保存后执行hexo new即可自动打开对应文件。","\u002Fimages\u002F2021\u002Fhexo-auto-open-editor\u002Fhexo-auto-open-editor.webp",[11606],[11606],{"path":11617,"stem":11618,"title":11619,"description":11620,"wordCount":9562,"publish":11621,"update":7,"cover":11622,"tags":11623,"categories":11628,"series":7,"seriesOrder":7,"pin":11426,"wip":11435,"theme":11434},"\u002Fposts\u002F2021\u002Fhttp-canary-ca","posts\u002F2021\u002Fhttp-canary-ca","解决部分安卓11HttpCanary无法安装证书及其他诸多问题","本文分享安卓11下HttpCanary证书安装失败等问题的解决方法，需root或虚拟机。MIUI系统点击安装根证书无反应时，将指定缓存路径的HttpCanary.pem复制为HttpCanary.jks并重启应用，再以root权限安装到系统；无效则先导出带.0证书再安装。抓https失败或提示证书不可信，可安装Xposed框架和JustTrustMe插件关闭SSL认证。资源可从酷安或应用商店获取，免费版与付费版主要区别为插件支持。","2021-01-16","\u002Fimages\u002F2021\u002Fhttp-canary-ca\u002Fhttp-canary-ca.png",[11624,11625,11626,11627],"Android","HttpCanary","抓包","问题",[11626],{"path":11630,"stem":11631,"title":11632,"description":11633,"wordCount":11634,"publish":11635,"update":7,"cover":11636,"tags":11637,"categories":11640,"series":7,"seriesOrder":7,"pin":11426,"wip":11435,"theme":11434},"\u002Fposts\u002F2020\u002Fmysql-basics","posts\u002F2020\u002Fmysql-basics","MySQL 基础","本文介绍MySQL关系型数据库管理系统基础知识，包括数据库、数据库管理系统、数据库系统和数据库应用系统的概念，及其数据结构化、共享性高、冗余度低、独立性强和统一管理等特点；简述数据库的创建、查看、打开、修改和删除操作，以及数据表的创建、修改、删除和表数据的添加、更新、删除方法，并提及图形化管理工具。",1825,"2020-06-05","\u002Fimages\u002F2020\u002Fmysql-basics\u002Fmysql-basics.png",[11638,11639],"mysql","数据库",[11596],{"path":11642,"stem":11643,"title":11644,"description":11645,"wordCount":11646,"publish":11647,"update":7,"cover":11648,"tags":11649,"categories":11652,"series":7,"seriesOrder":7,"pin":11426,"wip":11435,"theme":11434},"\u002Fposts\u002F2020\u002Fpython-tkinter","posts\u002F2020\u002Fpython-tkinter","Python图形用户界面(Tkinter)","本文简介Python常用GUI库，重点说明Tkinter的标准控件、共同属性及pack、grid、place三种几何布局管理器。使用Tkinter需导入模块、创建控件、添加交互并编写函数、进入主事件循环。文中以简单登录界面为例，演示标签、输入框、按钮的放置，以及为按钮设置回调函数进行输入校验和登录提示。",965,"2020-05-25","\u002Fimages\u002F2020\u002Fpython-tkinter\u002Fpython-tkinter.jpg",[11650,11651],"Python","GUI",[11596],{"path":11654,"stem":11655,"title":11656,"description":11657,"wordCount":8911,"publish":11658,"update":11659,"cover":7,"tags":11660,"categories":11663,"series":11664,"seriesOrder":183,"pin":11426,"wip":11435,"theme":11434},"\u002Fposts\u002Fmarkdown\u002Fcollapse","posts\u002F1.markdown\u002F05.collapse","在正文中使用折叠内容","本文说明正文中折叠内容的使用方法：折叠块适合放置补充说明、较长代码或可选阅读内容，标题始终可见，点击整行展开，各折叠块独立记录状态。支持默认收起，也可通过 open 属性设置初始展开。折叠内部可包含 Markdown、列表、代码、表格、图片等，目录或锚点访问内部标题会先展开所属折叠块。还支持嵌套折叠，外层使用三个冒号、内层使用两个冒号，内外层独立控制；访问嵌套目标可一次展开沿途两层。","1970-01-01","2026-09-26",[11661,11662],"Markdown","MDC",[11664],"文章示例",{"path":11666,"stem":11667,"title":11668,"description":11669,"wordCount":10330,"publish":11658,"update":11483,"cover":7,"tags":11670,"categories":11672,"series":11664,"seriesOrder":168,"pin":11426,"wip":11435,"theme":11434},"\u002Fposts\u002Fmarkdown\u002Fvideo","posts\u002F1.markdown\u002F04.video","在文章中嵌入视频","本文介绍在文章与关于页中嵌入Bilibili和YouTube视频的MDC组件用法，无需API密钥或手写iframe。播放器按16:9自适应宽度，接近可视区域时加载，默认不自动播放。Bilibili可通过BV号或视频链接指定分P与开始时间，YouTube可通过11位视频ID或链接指定开始时间，标题由title参数设置。组件会过滤分享追踪参数与自动播放设置，无效参数仅显示提示，不影响正文。",[11661,11662,11671],"视频",[11664],{"path":11674,"stem":11675,"title":11676,"description":11677,"wordCount":11678,"publish":11658,"update":11679,"cover":7,"tags":11680,"categories":11682,"series":11664,"seriesOrder":162,"pin":11426,"wip":6,"theme":11434},"\u002Fposts\u002Fmarkdown\u002Fmarkdown-extended","posts\u002F1.markdown\u002F03.markdown-extended","Markdown 扩展功能","本文介绍Markdown扩展功能。已实现多风格提醒框，支持GitHub、Obsidian、VitePress、Docusaurus四种主题及折叠嵌套，可通过参数或全站配置设置；同时提供GitHub仓库卡片、Bilibili\u002FYouTube视频卡片与正文图片预览。图片画廊与作品集仍在计划中，当前采用标准图片语法配合图注和链接。GitHub仓库卡片在构建时获取公开仓库数据快照，不可用字段显示短横线。后续将实现图片画廊与作品集。",1822,"2026-09-27",[11661,11662,11681],"功能规划",[11664],{"path":11684,"stem":11685,"title":11686,"description":11687,"wordCount":11688,"publish":11658,"update":11679,"cover":7,"tags":11689,"categories":11691,"series":11664,"seriesOrder":155,"pin":11426,"wip":11435,"theme":11434},"\u002Fposts\u002Fmarkdown\u002Fmdc-tutorial","posts\u002F1.markdown\u002F02.mdc-tutorial","MDC 教程","本文介绍 MDC（Markdown Components）在 Nuxt Content 中的语法与用法，涵盖块级容器、行内属性、Props 传递、插槽、嵌套、绑定文章数据，以及代码块与代码组、图片预览、GitHub 仓库卡片、视频卡片、提醒框和文章自动提醒等已接入功能。文末说明自定义组件需实现并注册，并解答组件不显示、插槽误识别等常见问题。",2594,[11662,11690,11500],"Nuxt Content",[11664],{"path":11693,"stem":11694,"title":11695,"description":11696,"wordCount":11697,"publish":11658,"update":11495,"cover":7,"tags":11698,"categories":11700,"series":11664,"seriesOrder":140,"pin":11426,"wip":11435,"theme":11434},"\u002Fposts\u002Fmarkdown\u002Fmarkdown","posts\u002F1.markdown\u002F01.markdown","Markdown 教程","本文为 Markdown 教程，系统介绍常用语法：段落与换行、标题与目录生成、引用、无序\u002F有序\u002F任务列表、强调与行内代码、普通\u002F引用式\u002F自动链接、图片、代码块、表格、分隔线与转义，并说明本站 Nuxt Content 环境下文章文件位置、frontmatter 要求及后续扩展内容。",1449,[11661,11699],"写作",[11664],1791108779685]