@hashgraphonline/standards-sdk 0.1.190 → 0.1.191
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/hcs-25/adapters/ans-trust-discovery.d.ts +22 -0
- package/dist/browser/hcs-25/adapters/ans-trust-discovery.d.ts.map +1 -0
- package/dist/browser/hcs-25/adapters/index.d.ts +1 -0
- package/dist/browser/hcs-25/adapters/index.d.ts.map +1 -1
- package/dist/browser/hcs-25/collectors/ans-trust-discovery.d.ts +32 -0
- package/dist/browser/hcs-25/collectors/ans-trust-discovery.d.ts.map +1 -0
- package/dist/browser/hcs-25/collectors/catalog.d.ts +9 -2
- package/dist/browser/hcs-25/collectors/catalog.d.ts.map +1 -1
- package/dist/browser/hcs-25/collectors/index.d.ts +1 -0
- package/dist/browser/hcs-25/collectors/index.d.ts.map +1 -1
- package/dist/browser/hcs-25/signals/ans-trust-discovery.d.ts +50 -0
- package/dist/browser/hcs-25/signals/ans-trust-discovery.d.ts.map +1 -0
- package/dist/browser/hcs-25/signals/index.d.ts +1 -0
- package/dist/browser/hcs-25/signals/index.d.ts.map +1 -1
- package/dist/browser-root/hcs-25/adapters/ans-trust-discovery.d.ts +22 -0
- package/dist/browser-root/hcs-25/adapters/ans-trust-discovery.d.ts.map +1 -0
- package/dist/browser-root/hcs-25/adapters/index.d.ts +1 -0
- package/dist/browser-root/hcs-25/adapters/index.d.ts.map +1 -1
- package/dist/browser-root/hcs-25/collectors/ans-trust-discovery.d.ts +32 -0
- package/dist/browser-root/hcs-25/collectors/ans-trust-discovery.d.ts.map +1 -0
- package/dist/browser-root/hcs-25/collectors/catalog.d.ts +9 -2
- package/dist/browser-root/hcs-25/collectors/catalog.d.ts.map +1 -1
- package/dist/browser-root/hcs-25/collectors/index.d.ts +1 -0
- package/dist/browser-root/hcs-25/collectors/index.d.ts.map +1 -1
- package/dist/browser-root/hcs-25/signals/ans-trust-discovery.d.ts +50 -0
- package/dist/browser-root/hcs-25/signals/ans-trust-discovery.d.ts.map +1 -0
- package/dist/browser-root/hcs-25/signals/index.d.ts +1 -0
- package/dist/browser-root/hcs-25/signals/index.d.ts.map +1 -1
- package/dist/cjs/hcs-25/adapters/ans-trust-discovery.d.ts +22 -0
- package/dist/cjs/hcs-25/adapters/ans-trust-discovery.d.ts.map +1 -0
- package/dist/cjs/hcs-25/adapters/index.d.ts +1 -0
- package/dist/cjs/hcs-25/adapters/index.d.ts.map +1 -1
- package/dist/cjs/hcs-25/collectors/ans-trust-discovery.d.ts +32 -0
- package/dist/cjs/hcs-25/collectors/ans-trust-discovery.d.ts.map +1 -0
- package/dist/cjs/hcs-25/collectors/catalog.d.ts +9 -2
- package/dist/cjs/hcs-25/collectors/catalog.d.ts.map +1 -1
- package/dist/cjs/hcs-25/collectors/index.d.ts +1 -0
- package/dist/cjs/hcs-25/collectors/index.d.ts.map +1 -1
- package/dist/cjs/hcs-25/signals/ans-trust-discovery.d.ts +50 -0
- package/dist/cjs/hcs-25/signals/ans-trust-discovery.d.ts.map +1 -0
- package/dist/cjs/hcs-25/signals/index.d.ts +1 -0
- package/dist/cjs/hcs-25/signals/index.d.ts.map +1 -1
- package/dist/cjs/standards-sdk.cjs +1 -1
- package/dist/cjs/standards-sdk.cjs.map +1 -1
- package/dist/es/hcs-25/adapters/ans-trust-discovery.d.ts +22 -0
- package/dist/es/hcs-25/adapters/ans-trust-discovery.d.ts.map +1 -0
- package/dist/es/hcs-25/adapters/index.d.ts +1 -0
- package/dist/es/hcs-25/adapters/index.d.ts.map +1 -1
- package/dist/es/hcs-25/collectors/ans-trust-discovery.d.ts +32 -0
- package/dist/es/hcs-25/collectors/ans-trust-discovery.d.ts.map +1 -0
- package/dist/es/hcs-25/collectors/catalog.d.ts +9 -2
- package/dist/es/hcs-25/collectors/catalog.d.ts.map +1 -1
- package/dist/es/hcs-25/collectors/index.d.ts +1 -0
- package/dist/es/hcs-25/collectors/index.d.ts.map +1 -1
- package/dist/es/hcs-25/signals/ans-trust-discovery.d.ts +50 -0
- package/dist/es/hcs-25/signals/ans-trust-discovery.d.ts.map +1 -0
- package/dist/es/hcs-25/signals/index.d.ts +1 -0
- package/dist/es/hcs-25/signals/index.d.ts.map +1 -1
- package/dist/es/standards-sdk.es.js +78 -71
- package/dist/es/standards-sdk.es.js.map +1 -1
- package/dist/es/standards-sdk.es101.js +2 -2
- package/dist/es/standards-sdk.es103.js +2 -2
- package/dist/es/standards-sdk.es104.js +1 -1
- package/dist/es/standards-sdk.es106.js +1 -1
- package/dist/es/standards-sdk.es108.js +2 -2
- package/dist/es/standards-sdk.es11.js +1 -1
- package/dist/es/standards-sdk.es110.js +1 -1
- package/dist/es/standards-sdk.es111.js +2 -2
- package/dist/es/standards-sdk.es115.js +3 -3
- package/dist/es/standards-sdk.es116.js +4 -4
- package/dist/es/standards-sdk.es12.js +1 -1
- package/dist/es/standards-sdk.es120.js +22 -4
- package/dist/es/standards-sdk.es120.js.map +1 -1
- package/dist/es/standards-sdk.es121.js +15 -12
- package/dist/es/standards-sdk.es121.js.map +1 -1
- package/dist/es/standards-sdk.es123.js +6 -5
- package/dist/es/standards-sdk.es123.js.map +1 -1
- package/dist/es/standards-sdk.es124.js +6 -5
- package/dist/es/standards-sdk.es124.js.map +1 -1
- package/dist/es/standards-sdk.es127.js +6 -5
- package/dist/es/standards-sdk.es127.js.map +1 -1
- package/dist/es/standards-sdk.es128.js +110 -136
- package/dist/es/standards-sdk.es128.js.map +1 -1
- package/dist/es/standards-sdk.es129.js +133 -141
- package/dist/es/standards-sdk.es129.js.map +1 -1
- package/dist/es/standards-sdk.es13.js +1 -1
- package/dist/es/standards-sdk.es130.js +135 -345
- package/dist/es/standards-sdk.es130.js.map +1 -1
- package/dist/es/standards-sdk.es131.js +332 -344
- package/dist/es/standards-sdk.es131.js.map +1 -1
- package/dist/es/standards-sdk.es132.js +338 -178
- package/dist/es/standards-sdk.es132.js.map +1 -1
- package/dist/es/standards-sdk.es133.js +200 -196
- package/dist/es/standards-sdk.es133.js.map +1 -1
- package/dist/es/standards-sdk.es134.js +216 -364
- package/dist/es/standards-sdk.es134.js.map +1 -1
- package/dist/es/standards-sdk.es135.js +358 -100
- package/dist/es/standards-sdk.es135.js.map +1 -1
- package/dist/es/standards-sdk.es136.js +91 -220
- package/dist/es/standards-sdk.es136.js.map +1 -1
- package/dist/es/standards-sdk.es137.js +173 -1250
- package/dist/es/standards-sdk.es137.js.map +1 -1
- package/dist/es/standards-sdk.es138.js +1295 -98
- package/dist/es/standards-sdk.es138.js.map +1 -1
- package/dist/es/standards-sdk.es139.js +109 -246
- package/dist/es/standards-sdk.es139.js.map +1 -1
- package/dist/es/standards-sdk.es14.js +1 -1
- package/dist/es/standards-sdk.es140.js +263 -97
- package/dist/es/standards-sdk.es140.js.map +1 -1
- package/dist/es/standards-sdk.es141.js +107 -248
- package/dist/es/standards-sdk.es141.js.map +1 -1
- package/dist/es/standards-sdk.es142.js +246 -472
- package/dist/es/standards-sdk.es142.js.map +1 -1
- package/dist/es/standards-sdk.es143.js +458 -85
- package/dist/es/standards-sdk.es143.js.map +1 -1
- package/dist/es/standards-sdk.es144.js +96 -151
- package/dist/es/standards-sdk.es144.js.map +1 -1
- package/dist/es/standards-sdk.es145.js +155 -29
- package/dist/es/standards-sdk.es145.js.map +1 -1
- package/dist/es/standards-sdk.es146.js +26 -4
- package/dist/es/standards-sdk.es146.js.map +1 -1
- package/dist/es/standards-sdk.es147.js +10 -180
- package/dist/es/standards-sdk.es147.js.map +1 -1
- package/dist/es/standards-sdk.es148.js +179 -26
- package/dist/es/standards-sdk.es148.js.map +1 -1
- package/dist/es/standards-sdk.es149.js +27 -20
- package/dist/es/standards-sdk.es149.js.map +1 -1
- package/dist/es/standards-sdk.es15.js +1 -1
- package/dist/es/standards-sdk.es150.js +18 -156
- package/dist/es/standards-sdk.es150.js.map +1 -1
- package/dist/es/standards-sdk.es151.js +148 -190
- package/dist/es/standards-sdk.es151.js.map +1 -1
- package/dist/es/standards-sdk.es152.js +159 -747
- package/dist/es/standards-sdk.es152.js.map +1 -1
- package/dist/es/standards-sdk.es153.js +786 -9
- package/dist/es/standards-sdk.es153.js.map +1 -1
- package/dist/es/standards-sdk.es154.js +13 -567
- package/dist/es/standards-sdk.es154.js.map +1 -1
- package/dist/es/standards-sdk.es155.js +541 -600
- package/dist/es/standards-sdk.es155.js.map +1 -1
- package/dist/es/standards-sdk.es156.js +625 -12
- package/dist/es/standards-sdk.es156.js.map +1 -1
- package/dist/es/standards-sdk.es157.js +13 -2
- package/dist/es/standards-sdk.es157.js.map +1 -1
- package/dist/es/standards-sdk.es158.js +2 -87
- package/dist/es/standards-sdk.es158.js.map +1 -1
- package/dist/es/standards-sdk.es159.js +84 -37
- package/dist/es/standards-sdk.es159.js.map +1 -1
- package/dist/es/standards-sdk.es16.js +6 -6
- package/dist/es/standards-sdk.es160.js +40 -2
- package/dist/es/standards-sdk.es160.js.map +1 -1
- package/dist/es/standards-sdk.es161.js +2 -235
- package/dist/es/standards-sdk.es161.js.map +1 -1
- package/dist/es/standards-sdk.es162.js +204 -1109
- package/dist/es/standards-sdk.es162.js.map +1 -1
- package/dist/es/standards-sdk.es163.js +1059 -225
- package/dist/es/standards-sdk.es163.js.map +1 -1
- package/dist/es/standards-sdk.es164.js +303 -419
- package/dist/es/standards-sdk.es164.js.map +1 -1
- package/dist/es/standards-sdk.es165.js +418 -351
- package/dist/es/standards-sdk.es165.js.map +1 -1
- package/dist/es/standards-sdk.es166.js +347 -1114
- package/dist/es/standards-sdk.es166.js.map +1 -1
- package/dist/es/standards-sdk.es167.js +1094 -180
- package/dist/es/standards-sdk.es167.js.map +1 -1
- package/dist/es/standards-sdk.es168.js +153 -1512
- package/dist/es/standards-sdk.es168.js.map +1 -1
- package/dist/es/standards-sdk.es169.js +1457 -1056
- package/dist/es/standards-sdk.es169.js.map +1 -1
- package/dist/es/standards-sdk.es170.js +1163 -14
- package/dist/es/standards-sdk.es170.js.map +1 -1
- package/dist/es/standards-sdk.es171.js +15 -449
- package/dist/es/standards-sdk.es171.js.map +1 -1
- package/dist/es/standards-sdk.es172.js +440 -248
- package/dist/es/standards-sdk.es172.js.map +1 -1
- package/dist/es/standards-sdk.es173.js +259 -4
- package/dist/es/standards-sdk.es173.js.map +1 -1
- package/dist/es/standards-sdk.es174.js +4 -81
- package/dist/es/standards-sdk.es174.js.map +1 -1
- package/dist/es/standards-sdk.es175.js +71 -77
- package/dist/es/standards-sdk.es175.js.map +1 -1
- package/dist/es/standards-sdk.es176.js +80 -53
- package/dist/es/standards-sdk.es176.js.map +1 -1
- package/dist/es/standards-sdk.es177.js +59 -2546
- package/dist/es/standards-sdk.es177.js.map +1 -1
- package/dist/es/standards-sdk.es178.js +2547 -159
- package/dist/es/standards-sdk.es178.js.map +1 -1
- package/dist/es/standards-sdk.es179.js +159 -7
- package/dist/es/standards-sdk.es179.js.map +1 -1
- package/dist/es/standards-sdk.es18.js +13 -13
- package/dist/es/standards-sdk.es180.js +7 -86
- package/dist/es/standards-sdk.es180.js.map +1 -1
- package/dist/es/standards-sdk.es181.js +65 -44
- package/dist/es/standards-sdk.es181.js.map +1 -1
- package/dist/es/standards-sdk.es182.js +57 -188
- package/dist/es/standards-sdk.es182.js.map +1 -1
- package/dist/es/standards-sdk.es183.js +27 -26
- package/dist/es/standards-sdk.es183.js.map +1 -1
- package/dist/es/standards-sdk.es184.js +191 -53
- package/dist/es/standards-sdk.es184.js.map +1 -1
- package/dist/es/standards-sdk.es185.js +21 -109
- package/dist/es/standards-sdk.es185.js.map +1 -1
- package/dist/es/standards-sdk.es186.js +49 -47
- package/dist/es/standards-sdk.es186.js.map +1 -1
- package/dist/es/standards-sdk.es187.js +89 -205
- package/dist/es/standards-sdk.es187.js.map +1 -1
- package/dist/es/standards-sdk.es188.js +35 -58
- package/dist/es/standards-sdk.es188.js.map +1 -1
- package/dist/es/standards-sdk.es189.js +48 -39
- package/dist/es/standards-sdk.es189.js.map +1 -1
- package/dist/es/standards-sdk.es19.js +10 -10
- package/dist/es/standards-sdk.es190.js +218 -48
- package/dist/es/standards-sdk.es190.js.map +1 -1
- package/dist/es/standards-sdk.es191.js +66 -42
- package/dist/es/standards-sdk.es191.js.map +1 -1
- package/dist/es/standards-sdk.es192.js +33 -105
- package/dist/es/standards-sdk.es192.js.map +1 -1
- package/dist/es/standards-sdk.es193.js +49 -43
- package/dist/es/standards-sdk.es193.js.map +1 -1
- package/dist/es/standards-sdk.es194.js +33 -42
- package/dist/es/standards-sdk.es194.js.map +1 -1
- package/dist/es/standards-sdk.es195.js +123 -72
- package/dist/es/standards-sdk.es195.js.map +1 -1
- package/dist/es/standards-sdk.es196.js +58 -75
- package/dist/es/standards-sdk.es196.js.map +1 -1
- package/dist/es/standards-sdk.es197.js +60 -44
- package/dist/es/standards-sdk.es197.js.map +1 -1
- package/dist/es/standards-sdk.es198.js +72 -36
- package/dist/es/standards-sdk.es198.js.map +1 -1
- package/dist/es/standards-sdk.es199.js +75 -30
- package/dist/es/standards-sdk.es199.js.map +1 -1
- package/dist/es/standards-sdk.es2.js +2 -2
- package/dist/es/standards-sdk.es20.js +1 -1
- package/dist/es/standards-sdk.es200.js +44 -34
- package/dist/es/standards-sdk.es200.js.map +1 -1
- package/dist/es/standards-sdk.es201.js +36 -48
- package/dist/es/standards-sdk.es201.js.map +1 -1
- package/dist/es/standards-sdk.es202.js +30 -138
- package/dist/es/standards-sdk.es202.js.map +1 -1
- package/dist/es/standards-sdk.es203.js +34 -42
- package/dist/es/standards-sdk.es203.js.map +1 -1
- package/dist/es/standards-sdk.es204.js +48 -12482
- package/dist/es/standards-sdk.es204.js.map +1 -1
- package/dist/es/standards-sdk.es205.js +134 -13
- package/dist/es/standards-sdk.es205.js.map +1 -1
- package/dist/es/standards-sdk.es206.js +36 -50
- package/dist/es/standards-sdk.es206.js.map +1 -1
- package/dist/es/standards-sdk.es207.js +12449 -78
- package/dist/es/standards-sdk.es207.js.map +1 -1
- package/dist/es/standards-sdk.es208.js +15 -79
- package/dist/es/standards-sdk.es208.js.map +1 -1
- package/dist/es/standards-sdk.es209.js +48 -192
- package/dist/es/standards-sdk.es209.js.map +1 -1
- package/dist/es/standards-sdk.es21.js +1 -1
- package/dist/es/standards-sdk.es210.js +90 -651
- package/dist/es/standards-sdk.es210.js.map +1 -1
- package/dist/es/standards-sdk.es211.js +71 -63
- package/dist/es/standards-sdk.es211.js.map +1 -1
- package/dist/es/standards-sdk.es212.js +188 -160
- package/dist/es/standards-sdk.es212.js.map +1 -1
- package/dist/es/standards-sdk.es213.js +65 -314
- package/dist/es/standards-sdk.es213.js.map +1 -1
- package/dist/es/standards-sdk.es214.js +661 -335
- package/dist/es/standards-sdk.es214.js.map +1 -1
- package/dist/es/standards-sdk.es215.js +129 -410
- package/dist/es/standards-sdk.es215.js.map +1 -1
- package/dist/es/standards-sdk.es216.js +200 -209
- package/dist/es/standards-sdk.es216.js.map +1 -1
- package/dist/es/standards-sdk.es217.js +334 -64
- package/dist/es/standards-sdk.es217.js.map +1 -1
- package/dist/es/standards-sdk.es218.js +438 -124
- package/dist/es/standards-sdk.es218.js.map +1 -1
- package/dist/es/standards-sdk.es219.js +310 -496
- package/dist/es/standards-sdk.es219.js.map +1 -1
- package/dist/es/standards-sdk.es22.js +1 -1
- package/dist/es/standards-sdk.es220.js +60 -243
- package/dist/es/standards-sdk.es220.js.map +1 -1
- package/dist/es/standards-sdk.es221.js +118 -175
- package/dist/es/standards-sdk.es221.js.map +1 -1
- package/dist/es/standards-sdk.es222.js +465 -67
- package/dist/es/standards-sdk.es222.js.map +1 -1
- package/dist/es/standards-sdk.es223.js +250 -143
- package/dist/es/standards-sdk.es223.js.map +1 -1
- package/dist/es/standards-sdk.es224.js +172 -160
- package/dist/es/standards-sdk.es224.js.map +1 -1
- package/dist/es/standards-sdk.es225.js +65 -630
- package/dist/es/standards-sdk.es225.js.map +1 -1
- package/dist/es/standards-sdk.es226.js +128 -161
- package/dist/es/standards-sdk.es226.js.map +1 -1
- package/dist/es/standards-sdk.es227.js +144 -195
- package/dist/es/standards-sdk.es227.js.map +1 -1
- package/dist/es/standards-sdk.es228.js +668 -223
- package/dist/es/standards-sdk.es228.js.map +1 -1
- package/dist/es/standards-sdk.es229.js +188 -0
- package/dist/es/standards-sdk.es229.js.map +1 -0
- package/dist/es/standards-sdk.es23.js +1 -1
- package/dist/es/standards-sdk.es230.js +238 -0
- package/dist/es/standards-sdk.es230.js.map +1 -0
- package/dist/es/standards-sdk.es231.js +242 -0
- package/dist/es/standards-sdk.es231.js.map +1 -0
- package/dist/es/standards-sdk.es24.js +1 -1
- package/dist/es/standards-sdk.es25.js +1 -1
- package/dist/es/standards-sdk.es26.js +1 -1
- package/dist/es/standards-sdk.es27.js +13 -13
- package/dist/es/standards-sdk.es30.js +2 -2
- package/dist/es/standards-sdk.es31.js +4 -4
- package/dist/es/standards-sdk.es32.js +1 -1
- package/dist/es/standards-sdk.es35.js +7 -7
- package/dist/es/standards-sdk.es36.js +4 -4
- package/dist/es/standards-sdk.es37.js +2 -2
- package/dist/es/standards-sdk.es38.js +2 -2
- package/dist/es/standards-sdk.es39.js +1 -1
- package/dist/es/standards-sdk.es4.js +2 -2
- package/dist/es/standards-sdk.es40.js +1 -1
- package/dist/es/standards-sdk.es41.js +2 -2
- package/dist/es/standards-sdk.es46.js +1 -1
- package/dist/es/standards-sdk.es5.js +2 -2
- package/dist/es/standards-sdk.es51.js +1 -1
- package/dist/es/standards-sdk.es53.js +1 -1
- package/dist/es/standards-sdk.es56.js +2 -2
- package/dist/es/standards-sdk.es59.js +1 -1
- package/dist/es/standards-sdk.es6.js +2 -2
- package/dist/es/standards-sdk.es60.js +1 -1
- package/dist/es/standards-sdk.es62.js +1 -1
- package/dist/es/standards-sdk.es63.js +2 -2
- package/dist/es/standards-sdk.es64.js +1 -1
- package/dist/es/standards-sdk.es65.js +1 -1
- package/dist/es/standards-sdk.es66.js +1 -1
- package/dist/es/standards-sdk.es67.js +8 -8
- package/dist/es/standards-sdk.es69.js +1 -1
- package/dist/es/standards-sdk.es7.js +1 -1
- package/dist/es/standards-sdk.es71.js +2 -2
- package/dist/es/standards-sdk.es72.js +3 -3
- package/dist/es/standards-sdk.es75.js +5 -5
- package/dist/es/standards-sdk.es76.js +3 -3
- package/dist/es/standards-sdk.es77.js +2 -2
- package/dist/es/standards-sdk.es78.js +1 -1
- package/dist/es/standards-sdk.es81.js +2 -2
- package/dist/es/standards-sdk.es83.js +2 -2
- package/dist/es/standards-sdk.es84.js +5 -5
- package/dist/es/standards-sdk.es85.js +1 -1
- package/dist/es/standards-sdk.es88.js +1 -1
- package/dist/es/standards-sdk.es89.js +2 -2
- package/dist/es/standards-sdk.es9.js +2 -2
- package/dist/es/standards-sdk.es90.js +4 -4
- package/dist/es/standards-sdk.es94.js +3 -3
- package/dist/es/standards-sdk.es96.js +2 -2
- package/dist/es/standards-sdk.es98.js +1 -1
- package/dist/es/standards-sdk.es99.js +3 -3
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standards-sdk.es137.js","sources":["../../src/hcs-25/collectors/model-evals.ts"],"sourcesContent":["import type { Hcs25JsonValue, Hcs25Subject } from '../types';\nimport { isJsonObject, readString, readSubjectAdditional } from '../signals';\nimport {\n Hcs25CollectorHttpError,\n isTimeoutError,\n requestJson,\n requestText,\n stripTrailingSlashes,\n} from './http';\nimport type {\n Hcs25CollectContext,\n Hcs25SignalAdapter,\n Hcs25SignalAdapterResult,\n} from './types';\n\nconst HF_API_BASE = 'https://huggingface.co/api';\nconst HF_DATASETS_BASE = 'https://huggingface.co/datasets';\nconst OPENROUTER_API_BASE = 'https://openrouter.ai/api/v1';\nconst OPENROUTER_FRONTEND_BASE = 'https://openrouter.ai/api/frontend';\nconst OPENLM_ARENA_URL = 'https://openlm.ai/chatbot-arena/';\nconst OPENLLM_DATASET_ID = 'open-llm-leaderboard/results';\nconst OPENLLM_DATASET_BRANCH = 'main';\n\nconst DEFAULT_MODEL_REGISTRIES: readonly string[] = ['openrouter', 'near-ai'];\nconst OPENROUTER_CATEGORY_SOURCE = 'openrouter:category-rankings';\nconst HUGGINGFACE_MODEL_INDEX_SOURCE = 'huggingface:model-index';\nconst HUGGINGFACE_POPULARITY_SOURCE = 'huggingface:popularity';\nconst CHATBOT_ARENA_SOURCE = 'chatbot-arena:leaderboard';\nconst OPENLLM_EVAL_SOURCES = ['openllm-leaderboard'];\n\nconst MODEL_ID_KEYS = [\n 'openrouterModelId',\n 'huggingFaceModelId',\n 'openrouterHuggingFaceId',\n 'modelId',\n 'model',\n 'name',\n] as const;\n\n/**\n * Resolves the subject's model identifier from `metadata.additional` keys\n * (in order) or falls back to `subject.id`.\n */\nexport function resolveModelId(subject: Hcs25Subject): string | null {\n const additional = readSubjectAdditional(subject);\n for (const key of MODEL_ID_KEYS) {\n const value = readString(additional, key);\n if (value) {\n return value;\n }\n }\n const metadata = subject.metadata ?? {};\n for (const key of MODEL_ID_KEYS) {\n const value = readString(metadata, key);\n if (value) {\n return value;\n }\n }\n return subject.id || null;\n}\n\n/**\n * True when two model identifiers refer to the same model: exact match,\n * or one is the `org/` prefixed form of the other.\n */\nexport function modelIdMatches(candidate: string, wanted: string): boolean {\n const a = candidate.trim().toLowerCase();\n const b = wanted.trim().toLowerCase();\n if (a === b) {\n return true;\n }\n const stripOrg = (id: string): string =>\n id.includes('/') ? id.slice(id.lastIndexOf('/') + 1) : id;\n return stripOrg(a) === stripOrg(b);\n}\n\nfunction statusFromError(error: unknown): 'timeout' | 'error' {\n return isTimeoutError(error) ? 'timeout' : 'error';\n}\n\nfunction asRecord(value: unknown): Record<string, Hcs25JsonValue> | undefined {\n return isJsonObject(value as Hcs25JsonValue)\n ? (value as Record<string, Hcs25JsonValue>)\n : undefined;\n}\n\nfunction parseNumber(value: unknown): number | null {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'string' && value.trim()) {\n const parsed = Number(value.trim());\n return Number.isFinite(parsed) ? parsed : null;\n }\n return null;\n}\n\nconst encodeModelIdForPath = (modelId: string): string =>\n modelId\n .split('/')\n .map(segment => encodeURIComponent(segment))\n .join('/');\n\n// ---------------------------------------------------------------------------\n// Shared metric helpers (ported from registry-broker production adapters)\n// ---------------------------------------------------------------------------\n\nconst METRIC_EXCLUDE_TOKENS = [\n 'loss',\n 'perplexity',\n 'ppl',\n 'error',\n 'rmse',\n 'mae',\n 'wer',\n 'cer',\n 'bits',\n];\n\nconst METRIC_INCLUDE_TOKENS = [\n 'accuracy',\n 'acc',\n 'exact',\n 'em',\n 'f1',\n 'precision',\n 'recall',\n 'score',\n 'pass',\n 'win',\n 'bleu',\n 'rouge',\n 'mmlu',\n 'gsm',\n 'arc',\n 'hellaswag',\n 'truthfulqa',\n 'gpqa',\n 'humaneval',\n 'mbpp',\n 'swe',\n 'math',\n 'bbh',\n 'ceval',\n];\n\nconst hasToken = (input: string, tokens: readonly string[]): boolean =>\n tokens.some(token => input.includes(token));\n\n/**\n * Filters metric names like the production adapters: drops error-rate style\n * metrics and keeps the known capability-metric families.\n */\nexport function shouldIncludeMetric(name: string): boolean {\n const normalized = name.trim().toLowerCase();\n if (!normalized) {\n return false;\n }\n if (hasToken(normalized, METRIC_EXCLUDE_TOKENS)) {\n return false;\n }\n return hasToken(normalized, METRIC_INCLUDE_TOKENS);\n}\n\n/**\n * Normalizes a raw upstream metric to `[0,100]`: values ≤1 are treated as\n * ratios (×100), ≤100 clamp as percentages, anything larger is dropped\n * (returns null).\n */\nexport function normalizeMetricValue(raw: number): number | null {\n if (!Number.isFinite(raw)) {\n return null;\n }\n if (raw <= 1) {\n return Math.min(100, Math.max(0, raw * 100));\n }\n if (raw <= 100) {\n return Math.min(100, Math.max(0, raw));\n }\n return null;\n}\n\n/**\n * Log-scale popularity normalization: `log10(v+1)/log10(max+1)*100`.\n */\nexport function normalizeLogScore(value: number, max: number): number | null {\n if (\n !Number.isFinite(value) ||\n value <= 0 ||\n !Number.isFinite(max) ||\n max <= 0\n ) {\n return null;\n }\n const numerator = Math.log10(value + 1);\n const denominator = Math.log10(max + 1);\n if (\n !Number.isFinite(numerator) ||\n !Number.isFinite(denominator) ||\n denominator <= 0\n ) {\n return null;\n }\n return Math.min(100, Math.max(0, (numerator / denominator) * 100));\n}\n\n/**\n * Production popularity proxy: log-scaled downloads (cap 10M) and likes\n * (cap 100K), mixed 0.7/0.3.\n */\nexport function computePopularityScore(\n downloads: number | null,\n likes: number | null,\n downloadsCap = 10_000_000,\n likesCap = 100_000,\n): number | null {\n const downloadsScore =\n downloads !== null ? normalizeLogScore(downloads, downloadsCap) : null;\n const likesScore = likes !== null ? normalizeLogScore(likes, likesCap) : null;\n if (downloadsScore === null) {\n return likesScore;\n }\n if (likesScore === null) {\n return downloadsScore;\n }\n return downloadsScore * 0.7 + likesScore * 0.3;\n}\n\ninterface HuggingFaceModelResponse {\n id?: string;\n downloads?: number;\n likes?: number;\n 'model-index'?: unknown;\n model_index?: unknown;\n modelIndex?: unknown;\n cardData?: { 'model-index'?: unknown };\n}\n\n/**\n * Extracts normalized model-index metrics from a HF `/api/models/{id}`\n * payload, reading the top-level `model-index` (plus `model_index` /\n * `modelIndex` / `cardData.model-index` fallbacks). Metrics arrive either\n * as an array of `{name|metric|type, value}` or a `Record<name, value>`\n * map; names are filtered by {@link shouldIncludeMetric} and values by\n * {@link normalizeMetricValue}.\n */\nexport function extractModelIndexMetrics(\n payload: HuggingFaceModelResponse | undefined,\n maxMetrics = 60,\n): Array<{ name: string; value: number }> {\n const modelIndex =\n payload?.['model-index'] ??\n payload?.model_index ??\n payload?.modelIndex ??\n payload?.cardData?.['model-index'];\n if (!Array.isArray(modelIndex)) {\n return [];\n }\n const metrics: Array<{ name: string; value: number }> = [];\n for (const entry of modelIndex) {\n const results = asRecord(entry)?.results;\n if (!Array.isArray(results)) {\n continue;\n }\n for (const result of results) {\n const block = asRecord(result)?.metrics;\n const push = (name: unknown, rawValue: unknown): void => {\n const rawName =\n typeof name === 'string' && name.trim() ? name.trim() : null;\n const parsed = parseNumber(rawValue);\n if (!rawName || parsed === null || !shouldIncludeMetric(rawName)) {\n return;\n }\n const normalized = normalizeMetricValue(parsed);\n if (normalized === null) {\n return;\n }\n metrics.push({ name: rawName, value: normalized });\n };\n if (Array.isArray(block)) {\n for (const metric of block) {\n const record = asRecord(metric);\n if (!record) {\n continue;\n }\n const name = record.name ?? record.metric ?? record.type ?? null;\n push(name, record.value);\n if (metrics.length >= maxMetrics) {\n return metrics;\n }\n }\n } else if (block && typeof block === 'object') {\n for (const [name, value] of Object.entries(\n block as Record<string, unknown>,\n )) {\n push(name, value);\n if (metrics.length >= maxMetrics) {\n return metrics;\n }\n }\n }\n }\n }\n return metrics;\n}\n\n/**\n * Resolves the canonical Hugging Face model id for a subject: stored\n * `huggingFaceModelId`/`openrouterHuggingFaceId` first, then the\n * OpenRouter `/api/v1/models` `hugging_face_id` link, then a HF search\n * fallback matching the normalized id.\n */\nexport async function resolveHuggingFaceModelId(\n modelId: string,\n context: Hcs25CollectContext,\n options: {\n huggingFaceApiBase?: string;\n openrouterApiBase?: string;\n token?: string;\n } = {},\n): Promise<string | null> {\n const normalized = modelId.trim().toLowerCase();\n if (!normalized) {\n return null;\n }\n\n // OpenRouter model catalog carries an explicit `hugging_face_id` link.\n try {\n const payload = await requestJson<{\n data?: Array<{ id?: unknown; hugging_face_id?: unknown }>;\n }>(`${options.openrouterApiBase ?? OPENROUTER_API_BASE}/models`, {\n fetch: context.fetch,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n });\n if (Array.isArray(payload.data)) {\n const match = payload.data.find(entry => {\n const id = typeof entry.id === 'string' ? entry.id.trim() : '';\n return id.toLowerCase() === normalized;\n });\n const hfId =\n match && typeof match.hugging_face_id === 'string'\n ? match.hugging_face_id.trim()\n : '';\n if (hfId) {\n return hfId;\n }\n }\n } catch {\n // fall through to HF search\n }\n\n // Fallback: HF search over the normalized id.\n try {\n const headers: Record<string, string> = options.token\n ? { authorization: `Bearer ${options.token}` }\n : {};\n const payload = await requestJson<unknown>(\n `${options.huggingFaceApiBase ?? HF_API_BASE}/models?search=${encodeURIComponent(normalized)}`,\n {\n fetch: context.fetch,\n headers,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n },\n );\n if (Array.isArray(payload)) {\n const match = payload.find(entry => {\n const id = asRecord(entry)?.id;\n return typeof id === 'string' && modelIdMatches(id, normalized);\n });\n const id = asRecord(match)?.id;\n if (typeof id === 'string' && id.trim()) {\n return id.trim();\n }\n }\n } catch {\n // unresolved\n }\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// OpenRouter category benchmarks\n// ---------------------------------------------------------------------------\n\n/**\n * A single category ranking/benchmark entry for one model.\n */\nexport interface Hcs25OpenRouterEvalRow {\n /** Model identifier or alias. */\n model: string;\n /** Benchmark category (e.g. \"coding\", \"reasoning\"). */\n category?: string;\n /** Rank position (1-based) when the source is a ranking. */\n rank?: number;\n /** Total entries ranked in this category (enables percentile). */\n outOf?: number;\n /** Direct score in `[0,100]` when the source provides one. */\n score?: number;\n /** Optional per-row weight (e.g. category volume). Default 1. */\n weight?: number;\n}\n\nexport interface Hcs25OpenRouterEvalsData {\n rows: readonly Hcs25OpenRouterEvalRow[];\n /**\n * Raw coverage proxy (e.g. summed entry volume). When provided,\n * `low-coverage` is emitted when the summed row weight falls below\n * `lowCoverageThreshold`.\n */\n coverageWeight?: number;\n /** Source identifiers stored in `openrouterEvalSources`. */\n sources?: readonly string[];\n /** Resolved Hugging Face id, persisted as `openrouterHuggingFaceId`. */\n huggingFaceId?: string;\n /** Total categories the source covers (ratio fallback for coverage). */\n totalCategories?: number;\n}\n\n/**\n * Fetches OpenRouter-style category benchmark data for a subject. Return\n * null when the source has no data for the model.\n */\nexport type Hcs25OpenRouterEvalsSource = (\n subject: Hcs25Subject,\n context: Hcs25CollectContext,\n) => Promise<Hcs25OpenRouterEvalsData | null>;\n\n/**\n * Options for the `openrouter-evals` signal adapter.\n */\nexport interface Hcs25OpenRouterEvalsSignalAdapterOptions {\n /** Data source. Default: {@link createOpenRouterBenchmarksSource} (the\n * production OpenRouter endpoint). */\n source?: Hcs25OpenRouterEvalsSource;\n /**\n * Minimum summed row weight before coverage is considered adequate.\n * Default 5 (matching production `minCoverageWeight`).\n */\n lowCoverageThreshold?: number;\n /**\n * Minimum number of covered categories before coverage is considered\n * adequate. Default 1.\n */\n minCategoryCount?: number;\n timeoutMs?: number;\n includeRegistries?: readonly string[];\n appliesTo?: (subject: Hcs25Subject) => boolean;\n}\n\n/**\n * Creates an OpenRouter evals source that fetches a JSON document shaped\n * `{rows: Hcs25OpenRouterEvalRow[], ...}` from a configured endpoint. For\n * sources with a different shape, wrap `requestJson` in a custom\n * `Hcs25OpenRouterEvalsSource`.\n */\nexport function createOpenRouterEvalsHttpSource(options: {\n url: string | ((subject: Hcs25Subject) => string | null);\n}): Hcs25OpenRouterEvalsSource {\n return async (subject, context) => {\n const url =\n typeof options.url === 'function' ? options.url(subject) : options.url;\n if (!url) {\n return null;\n }\n const data = await requestJson<Hcs25OpenRouterEvalsData>(url, {\n fetch: context.fetch,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n });\n if (!data || !Array.isArray(data.rows)) {\n return null;\n }\n return data;\n };\n}\n\ninterface OpenRouterBenchmarkEntry {\n model?: string;\n category?: string;\n rank?: number;\n volume?: number;\n count?: number;\n}\n\nconst stripDateSuffix = (value: string): string | null => {\n const trimmed = value.trim().toLowerCase();\n const match = trimmed.match(/^(.*?)-(\\d{8}|\\d{4}-\\d{2}-\\d{2}|\\d{2}-\\d{4})$/);\n return match?.[1]?.trim() || null;\n};\n\nconst buildBenchmarkCandidates = (normalizedId: string): string[] => {\n const candidates = new Set([normalizedId, `${normalizedId}:free`]);\n if (normalizedId.endsWith(':free')) {\n candidates.add(normalizedId.slice(0, -':free'.length));\n }\n return [...candidates];\n};\n\n/**\n * Production-shaped OpenRouter benchmarks source: fetches\n * `{frontendBase}/models/find?q=benchmarks`, indexes the per-model\n * `category`/`rank`/`volume` entries with `:free` and date-suffix aliases,\n * and emits rank-percentile rows for the subject's model. When\n * `preferHuggingFace` is set (default true) the subject's\n * `hugging_face_id` (resolved via the OpenRouter `/models` catalog) yields\n * a direct HF model-index score first, matching production precedence.\n */\nexport function createOpenRouterBenchmarksSource(\n options: {\n openrouterFrontendBaseUrl?: string;\n openrouterApiBaseUrl?: string;\n huggingFaceApiBase?: string;\n /** Benchmarks snapshot cache TTL in ms. Default 24h. */\n cacheTtlMs?: number;\n /** Try the HF model-index score first when an HF id resolves. */\n preferHuggingFace?: boolean;\n } = {},\n): Hcs25OpenRouterEvalsSource {\n const frontendBase = stripTrailingSlashes(\n options.openrouterFrontendBaseUrl ?? OPENROUTER_FRONTEND_BASE,\n );\n const apiBase = stripTrailingSlashes(\n options.openrouterApiBaseUrl ?? OPENROUTER_API_BASE,\n );\n const hfBase = stripTrailingSlashes(\n options.huggingFaceApiBase ?? HF_API_BASE,\n );\n const cacheTtlMs = options.cacheTtlMs ?? 24 * 60 * 60 * 1000;\n const preferHuggingFace = options.preferHuggingFace ?? true;\n let cache: {\n fetchedAt: number;\n byModel: Map<string, OpenRouterBenchmarkEntry[]>;\n categoryMaxRank: Map<string, number>;\n } | null = null;\n\n const loadBenchmarks = async (\n context: Hcs25CollectContext,\n ): Promise<{\n byModel: Map<string, OpenRouterBenchmarkEntry[]>;\n categoryMaxRank: Map<string, number>;\n } | null> => {\n if (cache && Date.now() - cache.fetchedAt < cacheTtlMs) {\n return cache;\n }\n const payload = await requestJson<{\n data?: { categories?: Record<string, OpenRouterBenchmarkEntry[]> };\n }>(`${frontendBase}/models/find?q=benchmarks`, {\n fetch: context.fetch,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n });\n const categories = payload.data?.categories;\n if (!categories || typeof categories !== 'object') {\n return null;\n }\n const byModel = new Map<string, OpenRouterBenchmarkEntry[]>();\n const categoryMaxRank = new Map<string, number>();\n for (const [model, entries] of Object.entries(categories)) {\n if (!Array.isArray(entries) || entries.length === 0) {\n continue;\n }\n const normalizedModel = model.trim().toLowerCase();\n if (!normalizedModel) {\n continue;\n }\n const registerAlias = (alias: string | null): void => {\n const candidate = alias?.trim().toLowerCase() ?? '';\n if (candidate && !byModel.has(candidate)) {\n byModel.set(candidate, entries);\n }\n };\n byModel.set(normalizedModel, entries);\n const noFree = normalizedModel.endsWith(':free')\n ? normalizedModel.slice(0, -':free'.length)\n : null;\n registerAlias(noFree);\n registerAlias(stripDateSuffix(normalizedModel));\n registerAlias(noFree ? stripDateSuffix(noFree) : null);\n for (const entry of entries) {\n const category =\n typeof entry.category === 'string'\n ? entry.category.trim().toLowerCase()\n : null;\n const rank = parseNumber(entry.rank);\n if (!category || rank === null) {\n continue;\n }\n const currentMax = categoryMaxRank.get(category) ?? 0;\n if (rank > currentMax) {\n categoryMaxRank.set(category, rank);\n }\n }\n }\n cache = { fetchedAt: Date.now(), byModel, categoryMaxRank };\n return cache;\n };\n\n return async (subject, context) => {\n const modelId = resolveModelId(subject);\n if (!modelId) {\n return null;\n }\n const normalizedId = modelId.trim().toLowerCase();\n\n // HF-first path (production precedence): resolve hugging_face_id via\n // the OpenRouter catalog, then reuse the HF model-index score.\n let huggingFaceId: string | null = null;\n if (preferHuggingFace) {\n huggingFaceId = await resolveHuggingFaceModelId(modelId, context, {\n openrouterApiBase: apiBase,\n huggingFaceApiBase: hfBase,\n }).catch((): null => null);\n if (huggingFaceId) {\n try {\n const payload = await requestJson<HuggingFaceModelResponse>(\n `${hfBase}/models/${encodeModelIdForPath(huggingFaceId)}`,\n {\n fetch: context.fetch,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n },\n );\n const metrics = extractModelIndexMetrics(payload);\n if (metrics.length > 0) {\n const score =\n metrics.reduce((sum, m) => sum + m.value, 0) / metrics.length;\n return {\n rows: [\n {\n model: modelId,\n score,\n weight: metrics.length,\n },\n ],\n coverageWeight: metrics.length,\n sources: [HUGGINGFACE_MODEL_INDEX_SOURCE],\n huggingFaceId,\n };\n }\n } catch {\n // fall through to benchmark rankings\n }\n }\n }\n\n const snapshot = await loadBenchmarks(context);\n if (!snapshot) {\n return null;\n }\n let entries: OpenRouterBenchmarkEntry[] | undefined;\n for (const candidate of buildBenchmarkCandidates(normalizedId)) {\n entries = snapshot.byModel.get(candidate);\n if (entries?.length) {\n break;\n }\n }\n if (!entries?.length) {\n return null;\n }\n const rows: Hcs25OpenRouterEvalRow[] = [];\n for (const entry of entries) {\n const category =\n typeof entry.category === 'string'\n ? entry.category.trim().toLowerCase()\n : undefined;\n const rank = parseNumber(entry.rank);\n if (!category || rank === null) {\n continue;\n }\n const maxRank = snapshot.categoryMaxRank.get(category);\n if (!maxRank || maxRank <= 0) {\n continue;\n }\n const volume = parseNumber(entry.volume);\n const count = parseNumber(entry.count);\n rows.push({\n model: modelId,\n category,\n rank,\n outOf: maxRank,\n score: ((maxRank - rank + 1) / maxRank) * 100,\n weight: volume && volume > 0 ? volume : count && count > 0 ? count : 1,\n });\n }\n if (rows.length === 0) {\n return null;\n }\n return {\n rows,\n coverageWeight: rows.reduce((sum, row) => sum + (row.weight ?? 1), 0),\n sources: [OPENROUTER_CATEGORY_SOURCE],\n huggingFaceId: huggingFaceId ?? undefined,\n };\n };\n}\n\n/**\n * Creates the `openrouter-evals` signal adapter: collects per-category\n * benchmark rows for the subject's model, computes a coverage-weighted\n * score, and stores the `openrouterEval*` fields under\n * `metadata.additional`. `openrouterEvalStatus` is `low-coverage` when the\n * summed row weight or category count falls under the configured floors.\n */\nexport function createOpenRouterEvalsSignalAdapter(\n options: Hcs25OpenRouterEvalsSignalAdapterOptions = {},\n): Hcs25SignalAdapter {\n const lowCoverageThreshold = options.lowCoverageThreshold ?? 5;\n const minCategoryCount = options.minCategoryCount ?? 1;\n const source = options.source ?? createOpenRouterBenchmarksSource();\n\n const collect = async (\n subject: Hcs25Subject,\n context: Hcs25CollectContext,\n ): Promise<Hcs25SignalAdapterResult[]> => {\n const now = context.now.toISOString();\n const modelId = resolveModelId(subject);\n\n let data: Hcs25OpenRouterEvalsData | null = null;\n try {\n data = await source(subject, context);\n } catch (error) {\n if (error instanceof Hcs25CollectorHttpError && error.status === 404) {\n data = null;\n } else {\n return [\n {\n signalId: 'openrouter.evals',\n status: statusFromError(error),\n fields: [\n {\n scope: 'additional',\n values: {\n openrouterEvalStatus: 'error',\n openrouterEvalUpdatedAt: now,\n },\n },\n ],\n },\n ];\n }\n }\n\n const rows =\n data && modelId\n ? data.rows.filter(row => modelIdMatches(row.model, modelId))\n : [];\n\n if (!data || rows.length === 0) {\n return [\n {\n signalId: 'openrouter.evals',\n status: 'missing',\n fields: [\n {\n scope: 'additional',\n values: {\n openrouterEvalStatus: 'missing',\n openrouterEvalUpdatedAt: now,\n openrouterEvalMetricsCount: 0,\n },\n },\n ],\n },\n ];\n }\n\n let weightedSum = 0;\n let totalWeight = 0;\n const categoryStats = new Map<\n string,\n { scoreSum: number; weightSum: number }\n >();\n for (const row of rows) {\n const score =\n typeof row.score === 'number'\n ? row.score\n : typeof row.rank === 'number' &&\n typeof row.outOf === 'number' &&\n row.outOf > 0\n ? ((row.outOf - row.rank + 1) / row.outOf) * 100\n : null;\n if (score === null) {\n continue;\n }\n const weight = row.weight ?? 1;\n weightedSum += score * weight;\n totalWeight += weight;\n if (row.category) {\n const existing = categoryStats.get(row.category) ?? {\n scoreSum: 0,\n weightSum: 0,\n };\n existing.scoreSum += score * weight;\n existing.weightSum += weight;\n categoryStats.set(row.category, existing);\n }\n }\n\n if (totalWeight <= 0) {\n return [\n {\n signalId: 'openrouter.evals',\n status: 'missing',\n fields: [\n {\n scope: 'additional',\n values: {\n openrouterEvalStatus: 'missing',\n openrouterEvalUpdatedAt: now,\n },\n },\n ],\n },\n ];\n }\n\n const score = Math.min(100, Math.max(0, weightedSum / totalWeight));\n // Coverage proxy: prefer the source's raw weight (e.g. summed volume);\n // otherwise derive a category-coverage ratio.\n const coverageWeight =\n data.coverageWeight ??\n (data.totalCategories && data.totalCategories > 0\n ? categoryStats.size / data.totalCategories\n : totalWeight);\n const status =\n categoryStats.size < minCategoryCount ||\n coverageWeight < lowCoverageThreshold\n ? 'low-coverage'\n : 'ok';\n const topCategories = [...categoryStats.entries()]\n .map(([category, stats]) => ({\n category,\n score:\n (stats.weightSum > 0\n ? Math.min(100, Math.max(0, stats.scoreSum / stats.weightSum))\n : 0) *\n Math.min(1, Math.max(0, stats.weightSum / lowCoverageThreshold)),\n weight: stats.weightSum,\n }))\n .sort((a, b) => b.score - a.score || b.weight - a.weight)\n .slice(0, 5)\n .map(entry => entry.category);\n\n return [\n {\n signalId: 'openrouter.evals',\n status: 'ok',\n value: score,\n fields: [\n {\n scope: 'additional',\n values: {\n openrouterEvalScore: Math.round(score * 100) / 100,\n openrouterEvalStatus: status,\n openrouterEvalUpdatedAt: now,\n openrouterEvalSources:\n data.sources && data.sources.length > 0\n ? [...data.sources]\n : [OPENROUTER_CATEGORY_SOURCE],\n openrouterEvalMetricsCount: rows.length,\n openrouterEvalCategoryCount: categoryStats.size,\n openrouterEvalCoverageWeight:\n Math.round(coverageWeight * 1000) / 1000,\n ...(topCategories.length > 0\n ? { openrouterEvalCategories: topCategories }\n : {}),\n ...(data.huggingFaceId\n ? { openrouterHuggingFaceId: data.huggingFaceId }\n : {}),\n },\n },\n ],\n provenance: {\n source: 'openrouter',\n subjectId: modelId,\n fetchedAt: now,\n },\n },\n ];\n };\n\n return {\n id: 'openrouter-evals',\n produces: ['openrouter.evals'],\n timeoutMs: options.timeoutMs,\n includeRegistries: options.includeRegistries ?? DEFAULT_MODEL_REGISTRIES,\n appliesTo: options.appliesTo,\n collect,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Chatbot Arena (preference leaderboard)\n// ---------------------------------------------------------------------------\n\n/**\n * One leaderboard entry.\n */\nexport interface Hcs25LeaderboardEntry {\n /** Model identifier or display name. */\n model: string;\n /** Elo-like rating or score. */\n score: number;\n /** Vote/sample count when available. */\n votes?: number;\n /** Organization/provider label when the source carries it. */\n organization?: string;\n}\n\n/**\n * Fetches a leaderboard snapshot for min/max normalization.\n */\nexport type Hcs25LeaderboardSource = (\n subject: Hcs25Subject,\n context: Hcs25CollectContext,\n) => Promise<readonly Hcs25LeaderboardEntry[] | null>;\n\n/**\n * Options for the `chatbot-arena` signal adapter.\n */\nexport interface Hcs25ChatbotArenaSignalAdapterOptions {\n /** Leaderboard source. Default: {@link createOpenLmArenaSource}. */\n source?: Hcs25LeaderboardSource;\n /** Extra aliases for the subject's model on the leaderboard. */\n aliases?: readonly string[];\n timeoutMs?: number;\n includeRegistries?: readonly string[];\n appliesTo?: (subject: Hcs25Subject) => boolean;\n}\n\n/**\n * Creates a leaderboard source from a JSON endpoint returning an array (or\n * `{entries|rows|leaderboard: []}`) of objects with configurable key names.\n */\nexport function createJsonLeaderboardSource(options: {\n url: string;\n modelKey?: string;\n scoreKey?: string;\n votesKey?: string;\n}): Hcs25LeaderboardSource {\n const modelKey = options.modelKey ?? 'model';\n const scoreKey = options.scoreKey ?? 'score';\n const votesKey = options.votesKey ?? 'votes';\n\n return async (_subject, context) => {\n const data = await requestJson<unknown>(options.url, {\n fetch: context.fetch,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n });\n const record = asRecord(data);\n const rows = Array.isArray(data)\n ? data\n : (record?.entries ?? record?.rows ?? record?.leaderboard);\n if (!Array.isArray(rows)) {\n return null;\n }\n const entries: Hcs25LeaderboardEntry[] = [];\n for (const row of rows) {\n const rowRecord = asRecord(row);\n if (!rowRecord) {\n continue;\n }\n const model = readString(rowRecord, modelKey);\n const score = rowRecord[scoreKey];\n const votes = rowRecord[votesKey];\n if (!model || typeof score !== 'number' || !Number.isFinite(score)) {\n continue;\n }\n entries.push({\n model,\n score,\n votes: typeof votes === 'number' ? votes : undefined,\n });\n }\n return entries;\n };\n}\n\nconst stripHtmlTags = (html: string): string => {\n // Loop until stable: a single pass over `<<script>` leaves a residual\n // tag fragment behind.\n let current = html;\n for (;;) {\n const next = current.replace(/<[^<>]*>/g, '');\n if (next === current) {\n return next;\n }\n current = next;\n }\n};\n\nconst decodeHtmlEntities = (html: string): string =>\n html\n .replace(/ /gi, ' ')\n .replace(/</gi, '<')\n .replace(/>/gi, '>')\n .replace(/"/gi, '\"')\n .replace(/'/g, \"'\")\n .replace(/&#(\\d+);/g, (_match, codepoint) => {\n const parsed = Number(codepoint);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n return '';\n }\n try {\n return String.fromCodePoint(parsed);\n } catch {\n return '';\n }\n })\n // `&` decodes last so double-escaped sequences (`&lt;`) resolve\n // to the literal text `<`, not `<`.\n .replace(/&/gi, '&');\n\nconst normalizeArenaLabel = (value: string): string => {\n const trimmed = value.trim();\n // `Name (suffix)` — take the final parenthesized group without a\n // backtracking-prone `.*` scan.\n const open = trimmed.lastIndexOf('(');\n const base =\n open > 0 && trimmed.endsWith(')') ? trimmed.slice(0, open).trim() : trimmed;\n const suffix =\n open > 0 && trimmed.endsWith(')')\n ? trimmed.slice(open + 1, -1).trim()\n : null;\n const compactSuffix = suffix?.split(/\\s+/).join('') ?? '';\n const isDate =\n suffix !== null &&\n (/^20\\d{2}-\\d{2}-\\d{2}$/.test(suffix) ||\n /^20\\d{2}\\d{2}\\d{2}$/.test(compactSuffix));\n const combined = !isDate && suffix ? `${base} ${suffix}` : base;\n const slugged = combined.toLowerCase().replace(/[^a-z0-9]+/g, '-');\n let start = 0;\n let end = slugged.length;\n while (start < end && slugged.charCodeAt(start) === 45) {\n start += 1;\n }\n while (end > start && slugged.charCodeAt(end - 1) === 45) {\n end -= 1;\n }\n return slugged.slice(start, end);\n};\n\nconst normalizeAlphaNum = (value: string): string =>\n value.toLowerCase().replace(/[^a-z0-9]+/g, '');\n\nconst stripTrailingDateSuffix = (value: string): string | null => {\n const match =\n value\n .trim()\n .toLowerCase()\n .match(/^(.*?)-(20\\d{2}-\\d{2}-\\d{2})$/) ??\n value\n .trim()\n .toLowerCase()\n .match(/^(.*?)-(20\\d{2}\\d{2})$/);\n return match?.[1]?.trim() || null;\n};\n\n/**\n * Production-style arena match keys for a leaderboard label: normalized\n * label, alphanumerics, provider-prefixed forms, chatgpt/gpt aliases,\n * date-suffix and `-latest` expansions.\n */\nexport function buildArenaMatchKeys(\n label: string,\n organization?: string | null,\n): string[] {\n const normalized = normalizeArenaLabel(label);\n const keys = new Set<string>();\n if (!normalized) {\n return [];\n }\n const pushKey = (value: string | null | undefined): void => {\n const candidate = value?.trim() ?? '';\n if (!candidate) {\n return;\n }\n keys.add(candidate);\n keys.add(normalizeAlphaNum(candidate));\n };\n const expandChatGptAliases = (value: string): void => {\n if (value.startsWith('chatgpt-')) {\n pushKey(`gpt-${value.slice('chatgpt-'.length)}`);\n }\n if (value.startsWith('gpt-')) {\n const rest = value.slice('gpt-'.length);\n pushKey(`chatgpt-${rest}`);\n pushKey(`chatgpt-${rest}-latest`);\n }\n };\n const expandDateAliases = (value: string): void => {\n const stripped = stripTrailingDateSuffix(value);\n if (stripped) {\n pushKey(stripped);\n expandChatGptAliases(stripped);\n }\n };\n\n pushKey(normalized);\n const org = normalizeArenaLabel(organization ?? '');\n if (org) {\n pushKey(`${org}-${normalized}`);\n pushKey(`${org}/${normalized}`);\n }\n expandChatGptAliases(normalized);\n expandDateAliases(normalized);\n if (normalized.endsWith('-latest')) {\n const without = normalized.slice(0, -'-latest'.length);\n pushKey(without);\n expandChatGptAliases(without);\n expandDateAliases(without);\n }\n return [...keys].filter(Boolean);\n}\n\nconst arenaCandidateKeys = (modelId: string): string[] => {\n const base = modelId\n .trim()\n .toLowerCase()\n .replace(/:free$/i, '');\n const candidates = new Set<string>();\n const add = (value: string): void => {\n const trimmed = value.trim();\n if (trimmed) {\n candidates.add(normalizeArenaLabel(trimmed));\n candidates.add(normalizeAlphaNum(trimmed));\n }\n };\n add(base);\n add(base.replace(/\\//g, '-'));\n const withoutFast = base.replace(/-fast$/i, '');\n if (withoutFast !== base) {\n add(withoutFast);\n }\n const stripped = stripTrailingDateSuffix(base);\n if (stripped) {\n add(stripped);\n }\n if (base.startsWith('gpt-')) {\n add(`chatgpt-${base.slice(4)}`);\n }\n if (base.startsWith('chatgpt-')) {\n add(`gpt-${base.slice(8)}`);\n }\n if (base.endsWith('-latest')) {\n add(base.slice(0, -'-latest'.length));\n }\n const orgPrefix = base.includes('/') ? base.split('/')[0] : null;\n if (orgPrefix) {\n const model = base.slice(orgPrefix.length + 1);\n add(`${orgPrefix}-${model}`);\n add(`${orgPrefix}/${model}`);\n }\n return [...candidates].filter(Boolean);\n};\n\n/**\n * Scrapes the production OpenLM Chatbot Arena HTML leaderboard\n * (`https://openlm.ai/chatbot-arena/` by default): parses the `sortable`\n * table's `tbody` rows — medal, model label, arena elo, …, organization —\n * and emits `Hcs25LeaderboardEntry` records keyed via\n * {@link buildArenaMatchKeys} label normalization.\n */\nexport function createOpenLmArenaSource(\n options: {\n url?: string;\n /** Snapshot cache TTL in ms. Default 24h. */\n cacheTtlMs?: number;\n } = {},\n): Hcs25LeaderboardSource {\n const url = options.url ?? OPENLM_ARENA_URL;\n const cacheTtlMs = options.cacheTtlMs ?? 24 * 60 * 60 * 1000;\n let cache: { fetchedAt: number; entries: Hcs25LeaderboardEntry[] } | null =\n null;\n\n return async (_subject, context) => {\n if (cache && Date.now() - cache.fetchedAt < cacheTtlMs) {\n return cache.entries;\n }\n const html = await requestText(url, {\n fetch: context.fetch,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n headers: { accept: 'text/html' },\n });\n const tableMatch = html.match(\n /<table[^>]*class=sortable[^>]*>.*?<\\/table>/is,\n );\n if (!tableMatch) {\n return null;\n }\n const tbodyMatch = tableMatch[0].match(/<tbody[^>]*>(.*?)<\\/tbody>/is);\n const tbody = tbodyMatch?.[1];\n if (!tbody) {\n return null;\n }\n const entries: Hcs25LeaderboardEntry[] = [];\n for (const rowMatch of tbody.matchAll(/<tr[^>]*>(.*?)<\\/tr>/gis)) {\n const rowHtml = rowMatch[1] ?? '';\n if (!rowHtml) {\n continue;\n }\n const cells = Array.from(rowHtml.matchAll(/<td[^>]*>(.*?)<\\/td>/gis)).map(\n match => match[1] ?? '',\n );\n const rawLabelCell = cells[1];\n const rawScoreCell = cells[2];\n const rawOrgCell = cells[8];\n const modelLabel = decodeHtmlEntities(\n stripHtmlTags(rawLabelCell ?? ''),\n ).trim();\n if (!modelLabel) {\n continue;\n }\n const score = parseNumber(\n decodeHtmlEntities(stripHtmlTags(rawScoreCell ?? '')).trim(),\n );\n if (score === null) {\n continue;\n }\n const organization =\n decodeHtmlEntities(stripHtmlTags(rawOrgCell ?? '')).trim() || undefined;\n entries.push({ model: modelLabel, score, organization });\n }\n if (entries.length === 0) {\n return null;\n }\n cache = { fetchedAt: Date.now(), entries };\n return entries;\n };\n}\n\n/**\n * Creates the `chatbot-arena` signal adapter: looks up the subject's model\n * on a preference leaderboard (production OpenLM HTML table by default),\n * normalizes its raw Elo-like score against the snapshot min/max, and\n * stores the `chatbotArenaEval*` fields.\n */\nexport function createChatbotArenaSignalAdapter(\n options: Hcs25ChatbotArenaSignalAdapterOptions = {},\n): Hcs25SignalAdapter {\n const source = options.source ?? createOpenLmArenaSource();\n const collect = async (\n subject: Hcs25Subject,\n context: Hcs25CollectContext,\n ): Promise<Hcs25SignalAdapterResult[]> => {\n const now = context.now.toISOString();\n const modelId = resolveModelId(subject);\n const wanted = new Set<string>();\n for (const id of [modelId, ...(options.aliases ?? [])]) {\n if (!id) {\n continue;\n }\n for (const key of arenaCandidateKeys(id)) {\n wanted.add(key);\n }\n wanted.add(id.trim().toLowerCase());\n }\n\n let entries: readonly Hcs25LeaderboardEntry[] | null = null;\n try {\n entries = await source(subject, context);\n } catch (error) {\n return [\n {\n signalId: 'chatbot-arena.eval',\n status: statusFromError(error),\n },\n ];\n }\n\n const entry =\n entries?.find(candidate => {\n if (\n wanted.has(candidate.model.trim().toLowerCase()) ||\n [...wanted].some(id => modelIdMatches(candidate.model, id))\n ) {\n return true;\n }\n const keys = buildArenaMatchKeys(\n candidate.model,\n candidate.organization,\n );\n return keys.some(key => wanted.has(key));\n }) ?? null;\n\n if (!entries || entries.length === 0 || !entry) {\n return [\n {\n signalId: 'chatbot-arena.eval',\n status: 'missing',\n fields: [\n {\n scope: 'additional',\n values: {\n chatbotArenaEvalStatus: 'missing',\n chatbotArenaEvalUpdatedAt: now,\n },\n },\n ],\n },\n ];\n }\n\n const scores = entries.map(e => e.score);\n const min = Math.min(...scores);\n const max = Math.max(...scores);\n const normalized =\n max > min ? (100 * (entry.score - min)) / (max - min) : 50;\n\n return [\n {\n signalId: 'chatbot-arena.eval',\n status: 'ok',\n value: Math.round(normalized * 100) / 100,\n fields: [\n {\n scope: 'additional',\n values: {\n chatbotArenaEvalScore: Math.round(normalized * 100) / 100,\n chatbotArenaEvalElo: entry.score,\n chatbotArenaEvalVotes: entry.votes ?? null,\n chatbotArenaEvalStatus: 'ok',\n chatbotArenaEvalUpdatedAt: now,\n chatbotArenaEvalSources: [CHATBOT_ARENA_SOURCE],\n },\n },\n ],\n provenance: {\n source: 'chatbot-arena',\n subjectId: entry.model,\n fetchedAt: now,\n },\n },\n ];\n };\n\n return {\n id: 'chatbot-arena',\n produces: ['chatbot-arena.eval'],\n timeoutMs: options.timeoutMs,\n includeRegistries: options.includeRegistries ?? DEFAULT_MODEL_REGISTRIES,\n appliesTo: options.appliesTo,\n collect,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Hugging Face model index + popularity\n// ---------------------------------------------------------------------------\n\n/**\n * Options for the `huggingface-model-index` signal adapter.\n */\nexport interface Hcs25HuggingFaceSignalAdapterOptions {\n /** Hugging Face API base. Default `https://huggingface.co/api`. */\n apiBase?: string;\n /** OpenRouter API base for `hugging_face_id` resolution. */\n openrouterApiBase?: string;\n /** Optional HF token for private/gated models. */\n token?: string;\n /** Download cap for the popularity log-scale. Default 10_000_000. */\n downloadsCap?: number;\n /** Likes cap for the popularity log-scale. Default 100_000. */\n likesCap?: number;\n /** Model-index metric cap. Default 60. */\n maxMetrics?: number;\n /**\n * Resolve a canonical HF id through the OpenRouter catalog plus a HF\n * search fallback when the subject id is not already a HF id. Default\n * true.\n */\n resolveHuggingFaceId?: boolean;\n timeoutMs?: number;\n includeRegistries?: readonly string[];\n appliesTo?: (subject: Hcs25Subject) => boolean;\n}\n\n/**\n * Creates the `huggingface-model-index` signal adapter: fetches the HF\n * model record, extracts model-index metrics when present (filtered +\n * normalized per the production rules), folds in a downloads/likes\n * popularity proxy (`model-index` 0.8 / `popularity` 0.2 in `mixed` mode),\n * resolves the canonical HF id via OpenRouter/HF search, and stores the\n * `huggingFaceEval*` fields (with `huggingFaceEvalMode` distinguishing the\n * path and `openrouterHuggingFaceId` recorded when resolved via OpenRouter).\n */\nexport function createHuggingFaceSignalAdapter(\n options: Hcs25HuggingFaceSignalAdapterOptions = {},\n): Hcs25SignalAdapter {\n const apiBase = stripTrailingSlashes(options.apiBase ?? HF_API_BASE);\n\n const collect = async (\n subject: Hcs25Subject,\n context: Hcs25CollectContext,\n ): Promise<Hcs25SignalAdapterResult[]> => {\n const now = context.now.toISOString();\n const additional = readSubjectAdditional(subject);\n const storedHfId =\n readString(additional, 'huggingFaceModelId') ??\n readString(additional, 'openrouterHuggingFaceId');\n const modelId = resolveModelId(subject);\n if (!modelId && !storedHfId) {\n return [\n {\n signalId: 'huggingface.model_index',\n status: 'missing',\n fields: [\n {\n scope: 'additional',\n values: {\n huggingFaceEvalStatus: 'missing',\n huggingFaceEvalUpdatedAt: now,\n },\n },\n ],\n },\n ];\n }\n\n try {\n const headers: Record<string, string> = options.token\n ? { authorization: `Bearer ${options.token}` }\n : {};\n let huggingFaceId = storedHfId ?? modelId!;\n let resolvedViaOpenRouter = false;\n if (!storedHfId && options.resolveHuggingFaceId !== false && modelId) {\n const resolved = await resolveHuggingFaceModelId(modelId, context, {\n huggingFaceApiBase: apiBase,\n openrouterApiBase: options.openrouterApiBase,\n token: options.token,\n }).catch((): null => null);\n if (resolved) {\n huggingFaceId = resolved;\n resolvedViaOpenRouter = true;\n }\n }\n\n const data = await requestJson<HuggingFaceModelResponse>(\n `${apiBase}/models/${encodeModelIdForPath(huggingFaceId)}`,\n {\n fetch: context.fetch,\n headers,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n },\n );\n\n const metrics = extractModelIndexMetrics(data, options.maxMetrics ?? 60);\n const modelIndexScore =\n metrics.length > 0\n ? metrics.reduce((sum, m) => sum + m.value, 0) / metrics.length\n : null;\n\n const downloads = parseNumber(data.downloads);\n const likes = parseNumber(data.likes);\n const popularityScore = computePopularityScore(\n downloads,\n likes,\n options.downloadsCap ?? 10_000_000,\n options.likesCap ?? 100_000,\n );\n\n let score: number | null = null;\n let mode: string;\n if (modelIndexScore !== null && popularityScore !== null) {\n score = modelIndexScore * 0.8 + popularityScore * 0.2;\n mode = 'mixed';\n } else if (modelIndexScore !== null) {\n score = modelIndexScore;\n mode = 'model-index';\n } else if (popularityScore !== null) {\n score = popularityScore;\n mode = 'popularity';\n } else {\n mode = 'missing';\n }\n\n const normalized =\n score === null\n ? null\n : Math.round(Math.min(100, Math.max(0, score)) * 100) / 100;\n const sources: string[] = [];\n if (modelIndexScore !== null) {\n sources.push(HUGGINGFACE_MODEL_INDEX_SOURCE);\n }\n if (popularityScore !== null) {\n sources.push(HUGGINGFACE_POPULARITY_SOURCE);\n }\n\n return [\n {\n signalId: 'huggingface.model_index',\n status: normalized === null ? 'missing' : 'ok',\n value: normalized,\n fields: [\n {\n scope: 'additional',\n values: {\n huggingFaceModelId:\n typeof data.id === 'string' && data.id.trim()\n ? data.id\n : huggingFaceId,\n huggingFaceEvalScore: normalized,\n huggingFaceSignalScore: normalized,\n huggingFaceEvalMetricsCount: metrics.length,\n huggingFaceDownloads: downloads,\n huggingFaceLikes: likes,\n huggingFaceEvalMode: mode,\n huggingFaceEvalStatus: normalized === null ? 'missing' : 'ok',\n huggingFaceEvalUpdatedAt: now,\n huggingFaceEvalSources: sources,\n ...(resolvedViaOpenRouter\n ? { openrouterHuggingFaceId: huggingFaceId }\n : {}),\n },\n },\n ],\n provenance: {\n source: 'huggingface',\n sourceUrl: `${apiBase}/models/${encodeModelIdForPath(huggingFaceId)}`,\n subjectId: huggingFaceId,\n fetchedAt: now,\n },\n },\n ];\n } catch (error) {\n const missing =\n error instanceof Hcs25CollectorHttpError && error.status === 404;\n return [\n {\n signalId: 'huggingface.model_index',\n status: missing ? 'missing' : statusFromError(error),\n fields: [\n {\n scope: 'additional',\n values: {\n huggingFaceEvalStatus: missing ? 'missing' : 'error',\n huggingFaceEvalUpdatedAt: now,\n },\n },\n ],\n },\n ];\n }\n };\n\n return {\n id: 'huggingface-model-index',\n produces: ['huggingface.model_index'],\n timeoutMs: options.timeoutMs,\n includeRegistries: options.includeRegistries ?? DEFAULT_MODEL_REGISTRIES,\n appliesTo: options.appliesTo,\n collect,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Open LLM leaderboard\n// ---------------------------------------------------------------------------\n\n/**\n * A leaderboard dataset row: a model identifier plus named metric values.\n */\nexport interface Hcs25OpenLlmRow {\n model: string;\n metrics: Record<string, number>;\n}\n\nexport type Hcs25OpenLlmSource = (\n subject: Hcs25Subject,\n context: Hcs25CollectContext,\n) => Promise<readonly Hcs25OpenLlmRow[] | null>;\n\n/**\n * Options for the `openllm-leaderboard` signal adapter.\n */\nexport interface Hcs25OpenLlmSignalAdapterOptions {\n /** Leaderboard data source. Default:\n * {@link createOpenLlmHuggingFaceSource}. */\n source?: Hcs25OpenLlmSource;\n timeoutMs?: number;\n includeRegistries?: readonly string[];\n appliesTo?: (subject: Hcs25Subject) => boolean;\n}\n\n/**\n * Creates an OpenLLM source that reads rows from a JSON endpoint returning\n * `[{model: string, <metric>: number, ...}]` (or `{rows: [...]}`). Metric\n * keys are every numeric field besides the model key.\n */\nexport function createOpenLlmJsonSource(options: {\n url: string;\n modelKey?: string;\n}): Hcs25OpenLlmSource {\n const modelKey = options.modelKey ?? 'model';\n return async (_subject, context) => {\n const data = await requestJson<unknown>(options.url, {\n fetch: context.fetch,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n });\n const record = asRecord(data);\n const rows = Array.isArray(data) ? data : record?.rows;\n if (!Array.isArray(rows)) {\n return null;\n }\n const out: Hcs25OpenLlmRow[] = [];\n for (const row of rows) {\n const rowRecord = asRecord(row);\n if (!rowRecord) {\n continue;\n }\n const model = readString(rowRecord, modelKey);\n if (!model) {\n continue;\n }\n const metrics: Record<string, number> = {};\n for (const [key, value] of Object.entries(rowRecord)) {\n const parsed = parseNumber(value);\n if (key !== modelKey && parsed !== null) {\n metrics[key] = parsed;\n }\n }\n out.push({ model, metrics });\n }\n return out;\n };\n}\n\nconst tokenizeForSimilarity = (value: string): Set<string> =>\n new Set(\n value\n .toLowerCase()\n .split(/[^a-z0-9]+/)\n .filter(token => token.length > 1),\n );\n\nconst jaccardSimilarity = (a: Set<string>, b: Set<string>): number => {\n if (a.size === 0 || b.size === 0) {\n return 0;\n }\n let intersection = 0;\n for (const token of a) {\n if (b.has(token)) {\n intersection += 1;\n }\n }\n return intersection / (a.size + b.size - intersection);\n};\n\n/**\n * Production Open LLM leaderboard source: resolves the subject's HF model\n * directory inside the `open-llm-leaderboard/results` HF dataset\n * (`/api/datasets/{id}/tree/{branch}/{org}/{repo}`), picks the latest\n * `results_*.json`, fetches it via `/datasets/{id}/resolve/{branch}/{path}`\n * and extracts `payload.results` metrics. When the exact `org/repo` tree\n * path is absent, falls back to a Jaccard-similarity match across the org's\n * top-level directories (production parity).\n */\nexport function createOpenLlmHuggingFaceSource(\n options: {\n huggingFaceApiBase?: string;\n huggingFaceDatasetsBase?: string;\n datasetId?: string;\n datasetBranch?: string;\n /** Path cache TTL in ms. Default 24h. */\n cacheTtlMs?: number;\n /** Minimum Jaccard similarity for org-directory fallback. Default 0.6. */\n minSimilarity?: number;\n } = {},\n): Hcs25OpenLlmSource {\n const apiBase = stripTrailingSlashes(\n options.huggingFaceApiBase ?? HF_API_BASE,\n );\n const datasetsBase = stripTrailingSlashes(\n options.huggingFaceDatasetsBase ?? HF_DATASETS_BASE,\n );\n const datasetId = options.datasetId ?? OPENLLM_DATASET_ID;\n const branch = options.datasetBranch ?? OPENLLM_DATASET_BRANCH;\n const cacheTtlMs = options.cacheTtlMs ?? 24 * 60 * 60 * 1000;\n const minSimilarity = options.minSimilarity ?? 0.6;\n const pathCache = new Map<\n string,\n { path: string | null; fetchedAt: number }\n >();\n const orgCache = new Map<string, { paths: string[]; fetchedAt: number }>();\n\n const listTree = async (\n context: Hcs25CollectContext,\n path: string,\n ): Promise<Array<{ path?: string }>> => {\n const url = `${apiBase}/datasets/${datasetId}/tree/${branch}/${encodeModelIdForPath(path)}`;\n const payload = await requestJson<Array<{ path?: string }>>(url, {\n fetch: context.fetch,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n });\n return Array.isArray(payload) ? payload : [];\n };\n\n const latestResultsPath = async (\n context: Hcs25CollectContext,\n dir: string,\n ): Promise<string | null> => {\n const candidates = (await listTree(context, dir))\n .map(entry => (typeof entry.path === 'string' ? entry.path : ''))\n .filter(path => path.includes('results_') && path.endsWith('.json'));\n return candidates.length > 0 ? (candidates.sort().at(-1) ?? null) : null;\n };\n\n const resolveViaOrg = async (\n context: Hcs25CollectContext,\n huggingFaceId: string,\n ): Promise<string | null> => {\n const slashIndex = huggingFaceId.indexOf('/');\n if (slashIndex <= 0 || slashIndex === huggingFaceId.length - 1) {\n return null;\n }\n const org = huggingFaceId.slice(0, slashIndex);\n const repo = huggingFaceId.slice(slashIndex + 1);\n if (!org || !repo) {\n return null;\n }\n const orgKey = org.toLowerCase();\n let paths: string[];\n const cached = orgCache.get(orgKey);\n if (cached && Date.now() - cached.fetchedAt < cacheTtlMs) {\n paths = cached.paths;\n } else {\n try {\n paths = (await listTree(context, org))\n .map(entry => (typeof entry.path === 'string' ? entry.path : ''))\n .filter(\n path =>\n path.startsWith(`${org}/`) &&\n !path.slice(org.length + 1).includes('/') &&\n path.slice(org.length + 1).length > 0,\n );\n } catch {\n return null;\n }\n orgCache.set(orgKey, { paths, fetchedAt: Date.now() });\n }\n if (paths.length === 0) {\n return null;\n }\n const targetTokens = tokenizeForSimilarity(repo);\n let bestPath: string | null = null;\n let bestSimilarity = 0;\n for (const path of paths) {\n const candidateRepo = path.slice(org.length + 1);\n const similarity = jaccardSimilarity(\n targetTokens,\n tokenizeForSimilarity(candidateRepo),\n );\n if (similarity > bestSimilarity) {\n bestSimilarity = similarity;\n bestPath = path;\n }\n }\n if (!bestPath || bestSimilarity < minSimilarity) {\n return null;\n }\n try {\n return await latestResultsPath(context, bestPath);\n } catch {\n return null;\n }\n };\n\n const resolveResultsPath = async (\n context: Hcs25CollectContext,\n huggingFaceId: string,\n ): Promise<string | null> => {\n const key = huggingFaceId.toLowerCase();\n const cached = pathCache.get(key);\n if (cached && Date.now() - cached.fetchedAt < cacheTtlMs) {\n return cached.path;\n }\n let path: string | null = null;\n try {\n path = await latestResultsPath(context, huggingFaceId);\n } catch {\n path = null;\n }\n if (!path) {\n path = await resolveViaOrg(context, huggingFaceId);\n }\n pathCache.set(key, { path, fetchedAt: Date.now() });\n return path;\n };\n\n return async (subject, context) => {\n const additional = readSubjectAdditional(subject);\n const huggingFaceId =\n readString(additional, 'huggingFaceModelId') ??\n readString(additional, 'openrouterHuggingFaceId') ??\n resolveModelId(subject);\n if (!huggingFaceId) {\n return null;\n }\n const resultPath = await resolveResultsPath(context, huggingFaceId);\n if (!resultPath) {\n return null;\n }\n const url = `${datasetsBase}/${datasetId}/resolve/${branch}/${resultPath}`;\n const payload = await requestJson<Record<string, unknown>>(url, {\n fetch: context.fetch,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n });\n const results = asRecord(payload)?.results;\n if (!isJsonObject(results)) {\n return null;\n }\n const metrics: Record<string, number> = {};\n for (const groupValue of Object.values(\n results as Record<string, unknown>,\n )) {\n if (!isJsonObject(groupValue as Hcs25JsonValue)) {\n continue;\n }\n for (const [name, rawValue] of Object.entries(\n groupValue as Record<string, unknown>,\n )) {\n const normalizedName = name.trim().toLowerCase();\n if (\n !normalizedName ||\n normalizedName.includes('stderr') ||\n normalizedName === 'alias'\n ) {\n continue;\n }\n const value = parseNumber(rawValue);\n if (value === null || !shouldIncludeMetric(normalizedName)) {\n continue;\n }\n // Store the raw value; the adapter applies normalizeMetricValue.\n metrics[name] = value;\n }\n }\n if (Object.keys(metrics).length === 0) {\n return null;\n }\n return [{ model: huggingFaceId, metrics }];\n };\n}\n\n/**\n * Creates the `openllm-leaderboard` signal adapter: finds the subject's\n * model on the Open LLM leaderboard dataset (production HF-datasets source\n * by default), averages its normalized metric values, and stores the\n * `openLlmEval*` fields.\n */\nexport function createOpenLlmSignalAdapter(\n options: Hcs25OpenLlmSignalAdapterOptions = {},\n): Hcs25SignalAdapter {\n const source = options.source ?? createOpenLlmHuggingFaceSource();\n const collect = async (\n subject: Hcs25Subject,\n context: Hcs25CollectContext,\n ): Promise<Hcs25SignalAdapterResult[]> => {\n const now = context.now.toISOString();\n const modelId = resolveModelId(subject);\n if (!modelId) {\n return [\n {\n signalId: 'openllm.leaderboard',\n status: 'missing',\n fields: [\n {\n scope: 'additional',\n values: {\n openLlmEvalStatus: 'missing',\n openLlmEvalUpdatedAt: now,\n },\n },\n ],\n },\n ];\n }\n\n let rows: readonly Hcs25OpenLlmRow[] | null = null;\n try {\n rows = await source(subject, context);\n } catch (error) {\n return [\n {\n signalId: 'openllm.leaderboard',\n status: statusFromError(error),\n fields: [\n {\n scope: 'additional',\n values: {\n openLlmEvalStatus: 'error',\n openLlmEvalUpdatedAt: now,\n },\n },\n ],\n },\n ];\n }\n\n const row =\n rows?.find(candidate => modelIdMatches(candidate.model, modelId)) ??\n (rows?.length === 1 ? rows[0] : null);\n\n if (!row) {\n return [\n {\n signalId: 'openllm.leaderboard',\n status: 'missing',\n fields: [\n {\n scope: 'additional',\n values: {\n openLlmEvalStatus: 'missing',\n openLlmEvalUpdatedAt: now,\n },\n },\n ],\n },\n ];\n }\n\n const values = Object.values(row.metrics)\n .map(normalizeMetricValue)\n .filter((value): value is number => value !== null);\n const score =\n values.length > 0\n ? Math.round(\n (values.reduce((sum, v) => sum + v, 0) / values.length) * 100,\n ) / 100\n : null;\n\n return [\n {\n signalId: 'openllm.leaderboard',\n status: score === null ? 'missing' : 'ok',\n value: score,\n fields: [\n {\n scope: 'additional',\n values: {\n openLlmEvalScore: score,\n openLlmEvalMetricsCount: values.length,\n openLlmEvalStatus: score === null ? 'missing' : 'ok',\n openLlmEvalUpdatedAt: now,\n openLlmEvalSources: [...OPENLLM_EVAL_SOURCES],\n },\n },\n ],\n provenance: {\n source: 'openllm-leaderboard',\n subjectId: row.model,\n fetchedAt: now,\n },\n },\n ];\n };\n\n return {\n id: 'openllm-leaderboard',\n produces: ['openllm.leaderboard'],\n timeoutMs: options.timeoutMs,\n includeRegistries: options.includeRegistries ?? DEFAULT_MODEL_REGISTRIES,\n appliesTo: options.appliesTo,\n collect,\n };\n}\n"],"names":["id","score"],"mappings":";;;;;;AAeA,MAAM,cAAc;AACpB,MAAM,mBAAmB;AACzB,MAAM,sBAAsB;AAC5B,MAAM,2BAA2B;AACjC,MAAM,mBAAmB;AACzB,MAAM,qBAAqB;AAC3B,MAAM,yBAAyB;AAE/B,MAAM,2BAA8C,CAAC,cAAc,SAAS;AAC5E,MAAM,6BAA6B;AACnC,MAAM,iCAAiC;AACvC,MAAM,gCAAgC;AACtC,MAAM,uBAAuB;AAC7B,MAAM,uBAAuB,CAAC,qBAAqB;AAEnD,MAAM,gBAAgB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAMO,SAAS,eAAe,SAAsC;AACnE,QAAM,aAAa,sBAAsB,OAAO;AAChD,aAAW,OAAO,eAAe;AAC/B,UAAM,QAAQ,WAAW,YAAY,GAAG;AACxC,QAAI,OAAO;AACT,aAAO;AAAA,IACT;AAAA,EACF;AACA,QAAM,WAAW,QAAQ,YAAY,CAAA;AACrC,aAAW,OAAO,eAAe;AAC/B,UAAM,QAAQ,WAAW,UAAU,GAAG;AACtC,QAAI,OAAO;AACT,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,QAAQ,MAAM;AACvB;AAMO,SAAS,eAAe,WAAmB,QAAyB;AACzE,QAAM,IAAI,UAAU,KAAA,EAAO,YAAA;AAC3B,QAAM,IAAI,OAAO,KAAA,EAAO,YAAA;AACxB,MAAI,MAAM,GAAG;AACX,WAAO;AAAA,EACT;AACA,QAAM,WAAW,CAAC,OAChB,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,YAAY,GAAG,IAAI,CAAC,IAAI;AACzD,SAAO,SAAS,CAAC,MAAM,SAAS,CAAC;AACnC;AAEA,SAAS,gBAAgB,OAAqC;AAC5D,SAAO,eAAe,KAAK,IAAI,YAAY;AAC7C;AAEA,SAAS,SAAS,OAA4D;AAC5E,SAAO,aAAa,KAAuB,IACtC,QACD;AACN;AAEA,SAAS,YAAY,OAA+B;AAClD,MAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,GAAG;AACvD,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,YAAY,MAAM,QAAQ;AAC7C,UAAM,SAAS,OAAO,MAAM,KAAA,CAAM;AAClC,WAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAAA,EAC5C;AACA,SAAO;AACT;AAEA,MAAM,uBAAuB,CAAC,YAC5B,QACG,MAAM,GAAG,EACT,IAAI,CAAA,YAAW,mBAAmB,OAAO,CAAC,EAC1C,KAAK,GAAG;AAMb,MAAM,wBAAwB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,MAAM,wBAAwB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,MAAM,WAAW,CAAC,OAAe,WAC/B,OAAO,KAAK,CAAA,UAAS,MAAM,SAAS,KAAK,CAAC;AAMrC,SAAS,oBAAoB,MAAuB;AACzD,QAAM,aAAa,KAAK,KAAA,EAAO,YAAA;AAC/B,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AACA,MAAI,SAAS,YAAY,qBAAqB,GAAG;AAC/C,WAAO;AAAA,EACT;AACA,SAAO,SAAS,YAAY,qBAAqB;AACnD;AAOO,SAAS,qBAAqB,KAA4B;AAC/D,MAAI,CAAC,OAAO,SAAS,GAAG,GAAG;AACzB,WAAO;AAAA,EACT;AACA,MAAI,OAAO,GAAG;AACZ,WAAO,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,MAAM,GAAG,CAAC;AAAA,EAC7C;AACA,MAAI,OAAO,KAAK;AACd,WAAO,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,GAAG,CAAC;AAAA,EACvC;AACA,SAAO;AACT;AAKO,SAAS,kBAAkB,OAAe,KAA4B;AAC3E,MACE,CAAC,OAAO,SAAS,KAAK,KACtB,SAAS,KACT,CAAC,OAAO,SAAS,GAAG,KACpB,OAAO,GACP;AACA,WAAO;AAAA,EACT;AACA,QAAM,YAAY,KAAK,MAAM,QAAQ,CAAC;AACtC,QAAM,cAAc,KAAK,MAAM,MAAM,CAAC;AACtC,MACE,CAAC,OAAO,SAAS,SAAS,KAC1B,CAAC,OAAO,SAAS,WAAW,KAC5B,eAAe,GACf;AACA,WAAO;AAAA,EACT;AACA,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,GAAI,YAAY,cAAe,GAAG,CAAC;AACnE;AAMO,SAAS,uBACd,WACA,OACA,eAAe,KACf,WAAW,KACI;AACf,QAAM,iBACJ,cAAc,OAAO,kBAAkB,WAAW,YAAY,IAAI;AACpE,QAAM,aAAa,UAAU,OAAO,kBAAkB,OAAO,QAAQ,IAAI;AACzE,MAAI,mBAAmB,MAAM;AAC3B,WAAO;AAAA,EACT;AACA,MAAI,eAAe,MAAM;AACvB,WAAO;AAAA,EACT;AACA,SAAO,iBAAiB,MAAM,aAAa;AAC7C;AAoBO,SAAS,yBACd,SACA,aAAa,IAC2B;AACxC,QAAM,aACJ,UAAU,aAAa,KACvB,SAAS,eACT,SAAS,cACT,SAAS,WAAW,aAAa;AACnC,MAAI,CAAC,MAAM,QAAQ,UAAU,GAAG;AAC9B,WAAO,CAAA;AAAA,EACT;AACA,QAAM,UAAkD,CAAA;AACxD,aAAW,SAAS,YAAY;AAC9B,UAAM,UAAU,SAAS,KAAK,GAAG;AACjC,QAAI,CAAC,MAAM,QAAQ,OAAO,GAAG;AAC3B;AAAA,IACF;AACA,eAAW,UAAU,SAAS;AAC5B,YAAM,QAAQ,SAAS,MAAM,GAAG;AAChC,YAAM,OAAO,CAAC,MAAe,aAA4B;AACvD,cAAM,UACJ,OAAO,SAAS,YAAY,KAAK,SAAS,KAAK,KAAA,IAAS;AAC1D,cAAM,SAAS,YAAY,QAAQ;AACnC,YAAI,CAAC,WAAW,WAAW,QAAQ,CAAC,oBAAoB,OAAO,GAAG;AAChE;AAAA,QACF;AACA,cAAM,aAAa,qBAAqB,MAAM;AAC9C,YAAI,eAAe,MAAM;AACvB;AAAA,QACF;AACA,gBAAQ,KAAK,EAAE,MAAM,SAAS,OAAO,YAAY;AAAA,MACnD;AACA,UAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,mBAAW,UAAU,OAAO;AAC1B,gBAAM,SAAS,SAAS,MAAM;AAC9B,cAAI,CAAC,QAAQ;AACX;AAAA,UACF;AACA,gBAAM,OAAO,OAAO,QAAQ,OAAO,UAAU,OAAO,QAAQ;AAC5D,eAAK,MAAM,OAAO,KAAK;AACvB,cAAI,QAAQ,UAAU,YAAY;AAChC,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF,WAAW,SAAS,OAAO,UAAU,UAAU;AAC7C,mBAAW,CAAC,MAAM,KAAK,KAAK,OAAO;AAAA,UACjC;AAAA,QAAA,GACC;AACD,eAAK,MAAM,KAAK;AAChB,cAAI,QAAQ,UAAU,YAAY;AAChC,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAQA,eAAsB,0BACpB,SACA,SACA,UAII,CAAA,GACoB;AACxB,QAAM,aAAa,QAAQ,KAAA,EAAO,YAAA;AAClC,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AAGA,MAAI;AACF,UAAM,UAAU,MAAM,YAEnB,GAAG,QAAQ,qBAAqB,mBAAmB,WAAW;AAAA,MAC/D,OAAO,QAAQ;AAAA,MACf,WAAW,QAAQ;AAAA,MACnB,QAAQ,QAAQ;AAAA,IAAA,CACjB;AACD,QAAI,MAAM,QAAQ,QAAQ,IAAI,GAAG;AAC/B,YAAM,QAAQ,QAAQ,KAAK,KAAK,CAAA,UAAS;AACvC,cAAM,KAAK,OAAO,MAAM,OAAO,WAAW,MAAM,GAAG,SAAS;AAC5D,eAAO,GAAG,kBAAkB;AAAA,MAC9B,CAAC;AACD,YAAM,OACJ,SAAS,OAAO,MAAM,oBAAoB,WACtC,MAAM,gBAAgB,KAAA,IACtB;AACN,UAAI,MAAM;AACR,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AAGA,MAAI;AACF,UAAM,UAAkC,QAAQ,QAC5C,EAAE,eAAe,UAAU,QAAQ,KAAK,GAAA,IACxC,CAAA;AACJ,UAAM,UAAU,MAAM;AAAA,MACpB,GAAG,QAAQ,sBAAsB,WAAW,kBAAkB,mBAAmB,UAAU,CAAC;AAAA,MAC5F;AAAA,QACE,OAAO,QAAQ;AAAA,QACf;AAAA,QACA,WAAW,QAAQ;AAAA,QACnB,QAAQ,QAAQ;AAAA,MAAA;AAAA,IAClB;AAEF,QAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,YAAM,QAAQ,QAAQ,KAAK,CAAA,UAAS;AAClC,cAAMA,MAAK,SAAS,KAAK,GAAG;AAC5B,eAAO,OAAOA,QAAO,YAAY,eAAeA,KAAI,UAAU;AAAA,MAChE,CAAC;AACD,YAAM,KAAK,SAAS,KAAK,GAAG;AAC5B,UAAI,OAAO,OAAO,YAAY,GAAG,QAAQ;AACvC,eAAO,GAAG,KAAA;AAAA,MACZ;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AA6EO,SAAS,gCAAgC,SAEjB;AAC7B,SAAO,OAAO,SAAS,YAAY;AACjC,UAAM,MACJ,OAAO,QAAQ,QAAQ,aAAa,QAAQ,IAAI,OAAO,IAAI,QAAQ;AACrE,QAAI,CAAC,KAAK;AACR,aAAO;AAAA,IACT;AACA,UAAM,OAAO,MAAM,YAAsC,KAAK;AAAA,MAC5D,OAAO,QAAQ;AAAA,MACf,WAAW,QAAQ;AAAA,MACnB,QAAQ,QAAQ;AAAA,IAAA,CACjB;AACD,QAAI,CAAC,QAAQ,CAAC,MAAM,QAAQ,KAAK,IAAI,GAAG;AACtC,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AACF;AAUA,MAAM,kBAAkB,CAAC,UAAiC;AACxD,QAAM,UAAU,MAAM,KAAA,EAAO,YAAA;AAC7B,QAAM,QAAQ,QAAQ,MAAM,+CAA+C;AAC3E,SAAO,QAAQ,CAAC,GAAG,KAAA,KAAU;AAC/B;AAEA,MAAM,2BAA2B,CAAC,iBAAmC;AACnE,QAAM,iCAAiB,IAAI,CAAC,cAAc,GAAG,YAAY,OAAO,CAAC;AACjE,MAAI,aAAa,SAAS,OAAO,GAAG;AAClC,eAAW,IAAI,aAAa,MAAM,GAAG,CAAC,QAAQ,MAAM,CAAC;AAAA,EACvD;AACA,SAAO,CAAC,GAAG,UAAU;AACvB;AAWO,SAAS,iCACd,UAQI,IACwB;AAC5B,QAAM,eAAe;AAAA,IACnB,QAAQ,6BAA6B;AAAA,EAAA;AAEvC,QAAM,UAAU;AAAA,IACd,QAAQ,wBAAwB;AAAA,EAAA;AAElC,QAAM,SAAS;AAAA,IACb,QAAQ,sBAAsB;AAAA,EAAA;AAEhC,QAAM,aAAa,QAAQ,cAAc,KAAK,KAAK,KAAK;AACxD,QAAM,oBAAoB,QAAQ,qBAAqB;AACvD,MAAI,QAIO;AAEX,QAAM,iBAAiB,OACrB,YAIW;AACX,QAAI,SAAS,KAAK,IAAA,IAAQ,MAAM,YAAY,YAAY;AACtD,aAAO;AAAA,IACT;AACA,UAAM,UAAU,MAAM,YAEnB,GAAG,YAAY,6BAA6B;AAAA,MAC7C,OAAO,QAAQ;AAAA,MACf,WAAW,QAAQ;AAAA,MACnB,QAAQ,QAAQ;AAAA,IAAA,CACjB;AACD,UAAM,aAAa,QAAQ,MAAM;AACjC,QAAI,CAAC,cAAc,OAAO,eAAe,UAAU;AACjD,aAAO;AAAA,IACT;AACA,UAAM,8BAAc,IAAA;AACpB,UAAM,sCAAsB,IAAA;AAC5B,eAAW,CAAC,OAAO,OAAO,KAAK,OAAO,QAAQ,UAAU,GAAG;AACzD,UAAI,CAAC,MAAM,QAAQ,OAAO,KAAK,QAAQ,WAAW,GAAG;AACnD;AAAA,MACF;AACA,YAAM,kBAAkB,MAAM,KAAA,EAAO,YAAA;AACrC,UAAI,CAAC,iBAAiB;AACpB;AAAA,MACF;AACA,YAAM,gBAAgB,CAAC,UAA+B;AACpD,cAAM,YAAY,OAAO,KAAA,EAAO,iBAAiB;AACjD,YAAI,aAAa,CAAC,QAAQ,IAAI,SAAS,GAAG;AACxC,kBAAQ,IAAI,WAAW,OAAO;AAAA,QAChC;AAAA,MACF;AACA,cAAQ,IAAI,iBAAiB,OAAO;AACpC,YAAM,SAAS,gBAAgB,SAAS,OAAO,IAC3C,gBAAgB,MAAM,GAAG,CAAC,QAAQ,MAAM,IACxC;AACJ,oBAAc,MAAM;AACpB,oBAAc,gBAAgB,eAAe,CAAC;AAC9C,oBAAc,SAAS,gBAAgB,MAAM,IAAI,IAAI;AACrD,iBAAW,SAAS,SAAS;AAC3B,cAAM,WACJ,OAAO,MAAM,aAAa,WACtB,MAAM,SAAS,KAAA,EAAO,YAAA,IACtB;AACN,cAAM,OAAO,YAAY,MAAM,IAAI;AACnC,YAAI,CAAC,YAAY,SAAS,MAAM;AAC9B;AAAA,QACF;AACA,cAAM,aAAa,gBAAgB,IAAI,QAAQ,KAAK;AACpD,YAAI,OAAO,YAAY;AACrB,0BAAgB,IAAI,UAAU,IAAI;AAAA,QACpC;AAAA,MACF;AAAA,IACF;AACA,YAAQ,EAAE,WAAW,KAAK,IAAA,GAAO,SAAS,gBAAA;AAC1C,WAAO;AAAA,EACT;AAEA,SAAO,OAAO,SAAS,YAAY;AACjC,UAAM,UAAU,eAAe,OAAO;AACtC,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,IACT;AACA,UAAM,eAAe,QAAQ,KAAA,EAAO,YAAA;AAIpC,QAAI,gBAA+B;AACnC,QAAI,mBAAmB;AACrB,sBAAgB,MAAM,0BAA0B,SAAS,SAAS;AAAA,QAChE,mBAAmB;AAAA,QACnB,oBAAoB;AAAA,MAAA,CACrB,EAAE,MAAM,MAAY,IAAI;AACzB,UAAI,eAAe;AACjB,YAAI;AACF,gBAAM,UAAU,MAAM;AAAA,YACpB,GAAG,MAAM,WAAW,qBAAqB,aAAa,CAAC;AAAA,YACvD;AAAA,cACE,OAAO,QAAQ;AAAA,cACf,WAAW,QAAQ;AAAA,cACnB,QAAQ,QAAQ;AAAA,YAAA;AAAA,UAClB;AAEF,gBAAM,UAAU,yBAAyB,OAAO;AAChD,cAAI,QAAQ,SAAS,GAAG;AACtB,kBAAM,QACJ,QAAQ,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,OAAO,CAAC,IAAI,QAAQ;AACzD,mBAAO;AAAA,cACL,MAAM;AAAA,gBACJ;AAAA,kBACE,OAAO;AAAA,kBACP;AAAA,kBACA,QAAQ,QAAQ;AAAA,gBAAA;AAAA,cAClB;AAAA,cAEF,gBAAgB,QAAQ;AAAA,cACxB,SAAS,CAAC,8BAA8B;AAAA,cACxC;AAAA,YAAA;AAAA,UAEJ;AAAA,QACF,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAEA,UAAM,WAAW,MAAM,eAAe,OAAO;AAC7C,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,IACT;AACA,QAAI;AACJ,eAAW,aAAa,yBAAyB,YAAY,GAAG;AAC9D,gBAAU,SAAS,QAAQ,IAAI,SAAS;AACxC,UAAI,SAAS,QAAQ;AACnB;AAAA,MACF;AAAA,IACF;AACA,QAAI,CAAC,SAAS,QAAQ;AACpB,aAAO;AAAA,IACT;AACA,UAAM,OAAiC,CAAA;AACvC,eAAW,SAAS,SAAS;AAC3B,YAAM,WACJ,OAAO,MAAM,aAAa,WACtB,MAAM,SAAS,KAAA,EAAO,YAAA,IACtB;AACN,YAAM,OAAO,YAAY,MAAM,IAAI;AACnC,UAAI,CAAC,YAAY,SAAS,MAAM;AAC9B;AAAA,MACF;AACA,YAAM,UAAU,SAAS,gBAAgB,IAAI,QAAQ;AACrD,UAAI,CAAC,WAAW,WAAW,GAAG;AAC5B;AAAA,MACF;AACA,YAAM,SAAS,YAAY,MAAM,MAAM;AACvC,YAAM,QAAQ,YAAY,MAAM,KAAK;AACrC,WAAK,KAAK;AAAA,QACR,OAAO;AAAA,QACP;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP,QAAS,UAAU,OAAO,KAAK,UAAW;AAAA,QAC1C,QAAQ,UAAU,SAAS,IAAI,SAAS,SAAS,QAAQ,IAAI,QAAQ;AAAA,MAAA,CACtE;AAAA,IACH;AACA,QAAI,KAAK,WAAW,GAAG;AACrB,aAAO;AAAA,IACT;AACA,WAAO;AAAA,MACL;AAAA,MACA,gBAAgB,KAAK,OAAO,CAAC,KAAK,QAAQ,OAAO,IAAI,UAAU,IAAI,CAAC;AAAA,MACpE,SAAS,CAAC,0BAA0B;AAAA,MACpC,eAAe,iBAAiB;AAAA,IAAA;AAAA,EAEpC;AACF;AASO,SAAS,mCACd,UAAoD,IAChC;AACpB,QAAM,uBAAuB,QAAQ,wBAAwB;AAC7D,QAAM,mBAAmB,QAAQ,oBAAoB;AACrD,QAAM,SAAS,QAAQ,UAAU,iCAAA;AAEjC,QAAM,UAAU,OACd,SACA,YACwC;AACxC,UAAM,MAAM,QAAQ,IAAI,YAAA;AACxB,UAAM,UAAU,eAAe,OAAO;AAEtC,QAAI,OAAwC;AAC5C,QAAI;AACF,aAAO,MAAM,OAAO,SAAS,OAAO;AAAA,IACtC,SAAS,OAAO;AACd,UAAI,iBAAiB,2BAA2B,MAAM,WAAW,KAAK;AACpE,eAAO;AAAA,MACT,OAAO;AACL,eAAO;AAAA,UACL;AAAA,YACE,UAAU;AAAA,YACV,QAAQ,gBAAgB,KAAK;AAAA,YAC7B,QAAQ;AAAA,cACN;AAAA,gBACE,OAAO;AAAA,gBACP,QAAQ;AAAA,kBACN,sBAAsB;AAAA,kBACtB,yBAAyB;AAAA,gBAAA;AAAA,cAC3B;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MAEJ;AAAA,IACF;AAEA,UAAM,OACJ,QAAQ,UACJ,KAAK,KAAK,OAAO,CAAA,QAAO,eAAe,IAAI,OAAO,OAAO,CAAC,IAC1D,CAAA;AAEN,QAAI,CAAC,QAAQ,KAAK,WAAW,GAAG;AAC9B,aAAO;AAAA,QACL;AAAA,UACE,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,QAAQ;AAAA,YACN;AAAA,cACE,OAAO;AAAA,cACP,QAAQ;AAAA,gBACN,sBAAsB;AAAA,gBACtB,yBAAyB;AAAA,gBACzB,4BAA4B;AAAA,cAAA;AAAA,YAC9B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IAEJ;AAEA,QAAI,cAAc;AAClB,QAAI,cAAc;AAClB,UAAM,oCAAoB,IAAA;AAI1B,eAAW,OAAO,MAAM;AACtB,YAAMC,SACJ,OAAO,IAAI,UAAU,WACjB,IAAI,QACJ,OAAO,IAAI,SAAS,YAClB,OAAO,IAAI,UAAU,YACrB,IAAI,QAAQ,KACV,IAAI,QAAQ,IAAI,OAAO,KAAK,IAAI,QAAS,MAC3C;AACR,UAAIA,WAAU,MAAM;AAClB;AAAA,MACF;AACA,YAAM,SAAS,IAAI,UAAU;AAC7B,qBAAeA,SAAQ;AACvB,qBAAe;AACf,UAAI,IAAI,UAAU;AAChB,cAAM,WAAW,cAAc,IAAI,IAAI,QAAQ,KAAK;AAAA,UAClD,UAAU;AAAA,UACV,WAAW;AAAA,QAAA;AAEb,iBAAS,YAAYA,SAAQ;AAC7B,iBAAS,aAAa;AACtB,sBAAc,IAAI,IAAI,UAAU,QAAQ;AAAA,MAC1C;AAAA,IACF;AAEA,QAAI,eAAe,GAAG;AACpB,aAAO;AAAA,QACL;AAAA,UACE,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,QAAQ;AAAA,YACN;AAAA,cACE,OAAO;AAAA,cACP,QAAQ;AAAA,gBACN,sBAAsB;AAAA,gBACtB,yBAAyB;AAAA,cAAA;AAAA,YAC3B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IAEJ;AAEA,UAAM,QAAQ,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,cAAc,WAAW,CAAC;AAGlE,UAAM,iBACJ,KAAK,mBACJ,KAAK,mBAAmB,KAAK,kBAAkB,IAC5C,cAAc,OAAO,KAAK,kBAC1B;AACN,UAAM,SACJ,cAAc,OAAO,oBACrB,iBAAiB,uBACb,iBACA;AACN,UAAM,gBAAgB,CAAC,GAAG,cAAc,QAAA,CAAS,EAC9C,IAAI,CAAC,CAAC,UAAU,KAAK,OAAO;AAAA,MAC3B;AAAA,MACA,QACG,MAAM,YAAY,IACf,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,MAAM,WAAW,MAAM,SAAS,CAAC,IAC3D,KACJ,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,MAAM,YAAY,oBAAoB,CAAC;AAAA,MACjE,QAAQ,MAAM;AAAA,IAAA,EACd,EACD,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EACvD,MAAM,GAAG,CAAC,EACV,IAAI,CAAA,UAAS,MAAM,QAAQ;AAE9B,WAAO;AAAA,MACL;AAAA,QACE,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,QAAQ;AAAA,UACN;AAAA,YACE,OAAO;AAAA,YACP,QAAQ;AAAA,cACN,qBAAqB,KAAK,MAAM,QAAQ,GAAG,IAAI;AAAA,cAC/C,sBAAsB;AAAA,cACtB,yBAAyB;AAAA,cACzB,uBACE,KAAK,WAAW,KAAK,QAAQ,SAAS,IAClC,CAAC,GAAG,KAAK,OAAO,IAChB,CAAC,0BAA0B;AAAA,cACjC,4BAA4B,KAAK;AAAA,cACjC,6BAA6B,cAAc;AAAA,cAC3C,8BACE,KAAK,MAAM,iBAAiB,GAAI,IAAI;AAAA,cACtC,GAAI,cAAc,SAAS,IACvB,EAAE,0BAA0B,cAAA,IAC5B,CAAA;AAAA,cACJ,GAAI,KAAK,gBACL,EAAE,yBAAyB,KAAK,cAAA,IAChC,CAAA;AAAA,YAAC;AAAA,UACP;AAAA,QACF;AAAA,QAEF,YAAY;AAAA,UACV,QAAQ;AAAA,UACR,WAAW;AAAA,UACX,WAAW;AAAA,QAAA;AAAA,MACb;AAAA,IACF;AAAA,EAEJ;AAEA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,UAAU,CAAC,kBAAkB;AAAA,IAC7B,WAAW,QAAQ;AAAA,IACnB,mBAAmB,QAAQ,qBAAqB;AAAA,IAChD,WAAW,QAAQ;AAAA,IACnB;AAAA,EAAA;AAEJ;AA6CO,SAAS,4BAA4B,SAKjB;AACzB,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,WAAW,QAAQ,YAAY;AAErC,SAAO,OAAO,UAAU,YAAY;AAClC,UAAM,OAAO,MAAM,YAAqB,QAAQ,KAAK;AAAA,MACnD,OAAO,QAAQ;AAAA,MACf,WAAW,QAAQ;AAAA,MACnB,QAAQ,QAAQ;AAAA,IAAA,CACjB;AACD,UAAM,SAAS,SAAS,IAAI;AAC5B,UAAM,OAAO,MAAM,QAAQ,IAAI,IAC3B,OACC,QAAQ,WAAW,QAAQ,QAAQ,QAAQ;AAChD,QAAI,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxB,aAAO;AAAA,IACT;AACA,UAAM,UAAmC,CAAA;AACzC,eAAW,OAAO,MAAM;AACtB,YAAM,YAAY,SAAS,GAAG;AAC9B,UAAI,CAAC,WAAW;AACd;AAAA,MACF;AACA,YAAM,QAAQ,WAAW,WAAW,QAAQ;AAC5C,YAAM,QAAQ,UAAU,QAAQ;AAChC,YAAM,QAAQ,UAAU,QAAQ;AAChC,UAAI,CAAC,SAAS,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,GAAG;AAClE;AAAA,MACF;AACA,cAAQ,KAAK;AAAA,QACX;AAAA,QACA;AAAA,QACA,OAAO,OAAO,UAAU,WAAW,QAAQ;AAAA,MAAA,CAC5C;AAAA,IACH;AACA,WAAO;AAAA,EACT;AACF;AAEA,MAAM,gBAAgB,CAAC,SAAyB;AAG9C,MAAI,UAAU;AACd,aAAS;AACP,UAAM,OAAO,QAAQ,QAAQ,aAAa,EAAE;AAC5C,QAAI,SAAS,SAAS;AACpB,aAAO;AAAA,IACT;AACA,cAAU;AAAA,EACZ;AACF;AAEA,MAAM,qBAAqB,CAAC,SAC1B,KACG,QAAQ,YAAY,GAAG,EACvB,QAAQ,UAAU,GAAG,EACrB,QAAQ,UAAU,GAAG,EACrB,QAAQ,YAAY,GAAG,EACvB,QAAQ,UAAU,GAAG,EACrB,QAAQ,aAAa,CAAC,QAAQ,cAAc;AAC3C,QAAM,SAAS,OAAO,SAAS;AAC/B,MAAI,CAAC,OAAO,SAAS,MAAM,KAAK,UAAU,GAAG;AAC3C,WAAO;AAAA,EACT;AACA,MAAI;AACF,WAAO,OAAO,cAAc,MAAM;AAAA,EACpC,QAAQ;AACN,WAAO;AAAA,EACT;AACF,CAAC,EAGA,QAAQ,WAAW,GAAG;AAE3B,MAAM,sBAAsB,CAAC,UAA0B;AACrD,QAAM,UAAU,MAAM,KAAA;AAGtB,QAAM,OAAO,QAAQ,YAAY,GAAG;AACpC,QAAM,OACJ,OAAO,KAAK,QAAQ,SAAS,GAAG,IAAI,QAAQ,MAAM,GAAG,IAAI,EAAE,SAAS;AACtE,QAAM,SACJ,OAAO,KAAK,QAAQ,SAAS,GAAG,IAC5B,QAAQ,MAAM,OAAO,GAAG,EAAE,EAAE,SAC5B;AACN,QAAM,gBAAgB,QAAQ,MAAM,KAAK,EAAE,KAAK,EAAE,KAAK;AACvD,QAAM,SACJ,WAAW,SACV,wBAAwB,KAAK,MAAM,KAClC,sBAAsB,KAAK,aAAa;AAC5C,QAAM,WAAW,CAAC,UAAU,SAAS,GAAG,IAAI,IAAI,MAAM,KAAK;AAC3D,QAAM,UAAU,SAAS,YAAA,EAAc,QAAQ,eAAe,GAAG;AACjE,MAAI,QAAQ;AACZ,MAAI,MAAM,QAAQ;AAClB,SAAO,QAAQ,OAAO,QAAQ,WAAW,KAAK,MAAM,IAAI;AACtD,aAAS;AAAA,EACX;AACA,SAAO,MAAM,SAAS,QAAQ,WAAW,MAAM,CAAC,MAAM,IAAI;AACxD,WAAO;AAAA,EACT;AACA,SAAO,QAAQ,MAAM,OAAO,GAAG;AACjC;AAEA,MAAM,oBAAoB,CAAC,UACzB,MAAM,cAAc,QAAQ,eAAe,EAAE;AAE/C,MAAM,0BAA0B,CAAC,UAAiC;AAChE,QAAM,QACJ,MACG,KAAA,EACA,cACA,MAAM,+BAA+B,KACxC,MACG,KAAA,EACA,YAAA,EACA,MAAM,wBAAwB;AACnC,SAAO,QAAQ,CAAC,GAAG,KAAA,KAAU;AAC/B;AAOO,SAAS,oBACd,OACA,cACU;AACV,QAAM,aAAa,oBAAoB,KAAK;AAC5C,QAAM,2BAAW,IAAA;AACjB,MAAI,CAAC,YAAY;AACf,WAAO,CAAA;AAAA,EACT;AACA,QAAM,UAAU,CAAC,UAA2C;AAC1D,UAAM,YAAY,OAAO,KAAA,KAAU;AACnC,QAAI,CAAC,WAAW;AACd;AAAA,IACF;AACA,SAAK,IAAI,SAAS;AAClB,SAAK,IAAI,kBAAkB,SAAS,CAAC;AAAA,EACvC;AACA,QAAM,uBAAuB,CAAC,UAAwB;AACpD,QAAI,MAAM,WAAW,UAAU,GAAG;AAChC,cAAQ,OAAO,MAAM,MAAM,WAAW,MAAM,CAAC,EAAE;AAAA,IACjD;AACA,QAAI,MAAM,WAAW,MAAM,GAAG;AAC5B,YAAM,OAAO,MAAM,MAAM,OAAO,MAAM;AACtC,cAAQ,WAAW,IAAI,EAAE;AACzB,cAAQ,WAAW,IAAI,SAAS;AAAA,IAClC;AAAA,EACF;AACA,QAAM,oBAAoB,CAAC,UAAwB;AACjD,UAAM,WAAW,wBAAwB,KAAK;AAC9C,QAAI,UAAU;AACZ,cAAQ,QAAQ;AAChB,2BAAqB,QAAQ;AAAA,IAC/B;AAAA,EACF;AAEA,UAAQ,UAAU;AAClB,QAAM,MAAM,oBAAoB,gBAAgB,EAAE;AAClD,MAAI,KAAK;AACP,YAAQ,GAAG,GAAG,IAAI,UAAU,EAAE;AAC9B,YAAQ,GAAG,GAAG,IAAI,UAAU,EAAE;AAAA,EAChC;AACA,uBAAqB,UAAU;AAC/B,oBAAkB,UAAU;AAC5B,MAAI,WAAW,SAAS,SAAS,GAAG;AAClC,UAAM,UAAU,WAAW,MAAM,GAAG,CAAC,UAAU,MAAM;AACrD,YAAQ,OAAO;AACf,yBAAqB,OAAO;AAC5B,sBAAkB,OAAO;AAAA,EAC3B;AACA,SAAO,CAAC,GAAG,IAAI,EAAE,OAAO,OAAO;AACjC;AAEA,MAAM,qBAAqB,CAAC,YAA8B;AACxD,QAAM,OAAO,QACV,KAAA,EACA,cACA,QAAQ,WAAW,EAAE;AACxB,QAAM,iCAAiB,IAAA;AACvB,QAAM,MAAM,CAAC,UAAwB;AACnC,UAAM,UAAU,MAAM,KAAA;AACtB,QAAI,SAAS;AACX,iBAAW,IAAI,oBAAoB,OAAO,CAAC;AAC3C,iBAAW,IAAI,kBAAkB,OAAO,CAAC;AAAA,IAC3C;AAAA,EACF;AACA,MAAI,IAAI;AACR,MAAI,KAAK,QAAQ,OAAO,GAAG,CAAC;AAC5B,QAAM,cAAc,KAAK,QAAQ,WAAW,EAAE;AAC9C,MAAI,gBAAgB,MAAM;AACxB,QAAI,WAAW;AAAA,EACjB;AACA,QAAM,WAAW,wBAAwB,IAAI;AAC7C,MAAI,UAAU;AACZ,QAAI,QAAQ;AAAA,EACd;AACA,MAAI,KAAK,WAAW,MAAM,GAAG;AAC3B,QAAI,WAAW,KAAK,MAAM,CAAC,CAAC,EAAE;AAAA,EAChC;AACA,MAAI,KAAK,WAAW,UAAU,GAAG;AAC/B,QAAI,OAAO,KAAK,MAAM,CAAC,CAAC,EAAE;AAAA,EAC5B;AACA,MAAI,KAAK,SAAS,SAAS,GAAG;AAC5B,QAAI,KAAK,MAAM,GAAG,CAAC,UAAU,MAAM,CAAC;AAAA,EACtC;AACA,QAAM,YAAY,KAAK,SAAS,GAAG,IAAI,KAAK,MAAM,GAAG,EAAE,CAAC,IAAI;AAC5D,MAAI,WAAW;AACb,UAAM,QAAQ,KAAK,MAAM,UAAU,SAAS,CAAC;AAC7C,QAAI,GAAG,SAAS,IAAI,KAAK,EAAE;AAC3B,QAAI,GAAG,SAAS,IAAI,KAAK,EAAE;AAAA,EAC7B;AACA,SAAO,CAAC,GAAG,UAAU,EAAE,OAAO,OAAO;AACvC;AASO,SAAS,wBACd,UAII,IACoB;AACxB,QAAM,MAAM,QAAQ,OAAO;AAC3B,QAAM,aAAa,QAAQ,cAAc,KAAK,KAAK,KAAK;AACxD,MAAI,QACF;AAEF,SAAO,OAAO,UAAU,YAAY;AAClC,QAAI,SAAS,KAAK,IAAA,IAAQ,MAAM,YAAY,YAAY;AACtD,aAAO,MAAM;AAAA,IACf;AACA,UAAM,OAAO,MAAM,YAAY,KAAK;AAAA,MAClC,OAAO,QAAQ;AAAA,MACf,WAAW,QAAQ;AAAA,MACnB,QAAQ,QAAQ;AAAA,MAChB,SAAS,EAAE,QAAQ,YAAA;AAAA,IAAY,CAChC;AACD,UAAM,aAAa,KAAK;AAAA,MACtB;AAAA,IAAA;AAEF,QAAI,CAAC,YAAY;AACf,aAAO;AAAA,IACT;AACA,UAAM,aAAa,WAAW,CAAC,EAAE,MAAM,8BAA8B;AACrE,UAAM,QAAQ,aAAa,CAAC;AAC5B,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,IACT;AACA,UAAM,UAAmC,CAAA;AACzC,eAAW,YAAY,MAAM,SAAS,yBAAyB,GAAG;AAChE,YAAM,UAAU,SAAS,CAAC,KAAK;AAC/B,UAAI,CAAC,SAAS;AACZ;AAAA,MACF;AACA,YAAM,QAAQ,MAAM,KAAK,QAAQ,SAAS,yBAAyB,CAAC,EAAE;AAAA,QACpE,CAAA,UAAS,MAAM,CAAC,KAAK;AAAA,MAAA;AAEvB,YAAM,eAAe,MAAM,CAAC;AAC5B,YAAM,eAAe,MAAM,CAAC;AAC5B,YAAM,aAAa,MAAM,CAAC;AAC1B,YAAM,aAAa;AAAA,QACjB,cAAc,gBAAgB,EAAE;AAAA,MAAA,EAChC,KAAA;AACF,UAAI,CAAC,YAAY;AACf;AAAA,MACF;AACA,YAAM,QAAQ;AAAA,QACZ,mBAAmB,cAAc,gBAAgB,EAAE,CAAC,EAAE,KAAA;AAAA,MAAK;AAE7D,UAAI,UAAU,MAAM;AAClB;AAAA,MACF;AACA,YAAM,eACJ,mBAAmB,cAAc,cAAc,EAAE,CAAC,EAAE,UAAU;AAChE,cAAQ,KAAK,EAAE,OAAO,YAAY,OAAO,cAAc;AAAA,IACzD;AACA,QAAI,QAAQ,WAAW,GAAG;AACxB,aAAO;AAAA,IACT;AACA,YAAQ,EAAE,WAAW,KAAK,IAAA,GAAO,QAAA;AACjC,WAAO;AAAA,EACT;AACF;AAQO,SAAS,gCACd,UAAiD,IAC7B;AACpB,QAAM,SAAS,QAAQ,UAAU,wBAAA;AACjC,QAAM,UAAU,OACd,SACA,YACwC;AACxC,UAAM,MAAM,QAAQ,IAAI,YAAA;AACxB,UAAM,UAAU,eAAe,OAAO;AACtC,UAAM,6BAAa,IAAA;AACnB,eAAW,MAAM,CAAC,SAAS,GAAI,QAAQ,WAAW,CAAA,CAAG,GAAG;AACtD,UAAI,CAAC,IAAI;AACP;AAAA,MACF;AACA,iBAAW,OAAO,mBAAmB,EAAE,GAAG;AACxC,eAAO,IAAI,GAAG;AAAA,MAChB;AACA,aAAO,IAAI,GAAG,KAAA,EAAO,aAAa;AAAA,IACpC;AAEA,QAAI,UAAmD;AACvD,QAAI;AACF,gBAAU,MAAM,OAAO,SAAS,OAAO;AAAA,IACzC,SAAS,OAAO;AACd,aAAO;AAAA,QACL;AAAA,UACE,UAAU;AAAA,UACV,QAAQ,gBAAgB,KAAK;AAAA,QAAA;AAAA,MAC/B;AAAA,IAEJ;AAEA,UAAM,QACJ,SAAS,KAAK,CAAA,cAAa;AACzB,UACE,OAAO,IAAI,UAAU,MAAM,OAAO,YAAA,CAAa,KAC/C,CAAC,GAAG,MAAM,EAAE,KAAK,CAAA,OAAM,eAAe,UAAU,OAAO,EAAE,CAAC,GAC1D;AACA,eAAO;AAAA,MACT;AACA,YAAM,OAAO;AAAA,QACX,UAAU;AAAA,QACV,UAAU;AAAA,MAAA;AAEZ,aAAO,KAAK,KAAK,CAAA,QAAO,OAAO,IAAI,GAAG,CAAC;AAAA,IACzC,CAAC,KAAK;AAER,QAAI,CAAC,WAAW,QAAQ,WAAW,KAAK,CAAC,OAAO;AAC9C,aAAO;AAAA,QACL;AAAA,UACE,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,QAAQ;AAAA,YACN;AAAA,cACE,OAAO;AAAA,cACP,QAAQ;AAAA,gBACN,wBAAwB;AAAA,gBACxB,2BAA2B;AAAA,cAAA;AAAA,YAC7B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IAEJ;AAEA,UAAM,SAAS,QAAQ,IAAI,CAAA,MAAK,EAAE,KAAK;AACvC,UAAM,MAAM,KAAK,IAAI,GAAG,MAAM;AAC9B,UAAM,MAAM,KAAK,IAAI,GAAG,MAAM;AAC9B,UAAM,aACJ,MAAM,MAAO,OAAO,MAAM,QAAQ,QAAS,MAAM,OAAO;AAE1D,WAAO;AAAA,MACL;AAAA,QACE,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,OAAO,KAAK,MAAM,aAAa,GAAG,IAAI;AAAA,QACtC,QAAQ;AAAA,UACN;AAAA,YACE,OAAO;AAAA,YACP,QAAQ;AAAA,cACN,uBAAuB,KAAK,MAAM,aAAa,GAAG,IAAI;AAAA,cACtD,qBAAqB,MAAM;AAAA,cAC3B,uBAAuB,MAAM,SAAS;AAAA,cACtC,wBAAwB;AAAA,cACxB,2BAA2B;AAAA,cAC3B,yBAAyB,CAAC,oBAAoB;AAAA,YAAA;AAAA,UAChD;AAAA,QACF;AAAA,QAEF,YAAY;AAAA,UACV,QAAQ;AAAA,UACR,WAAW,MAAM;AAAA,UACjB,WAAW;AAAA,QAAA;AAAA,MACb;AAAA,IACF;AAAA,EAEJ;AAEA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,UAAU,CAAC,oBAAoB;AAAA,IAC/B,WAAW,QAAQ;AAAA,IACnB,mBAAmB,QAAQ,qBAAqB;AAAA,IAChD,WAAW,QAAQ;AAAA,IACnB;AAAA,EAAA;AAEJ;AA0CO,SAAS,+BACd,UAAgD,IAC5B;AACpB,QAAM,UAAU,qBAAqB,QAAQ,WAAW,WAAW;AAEnE,QAAM,UAAU,OACd,SACA,YACwC;AACxC,UAAM,MAAM,QAAQ,IAAI,YAAA;AACxB,UAAM,aAAa,sBAAsB,OAAO;AAChD,UAAM,aACJ,WAAW,YAAY,oBAAoB,KAC3C,WAAW,YAAY,yBAAyB;AAClD,UAAM,UAAU,eAAe,OAAO;AACtC,QAAI,CAAC,WAAW,CAAC,YAAY;AAC3B,aAAO;AAAA,QACL;AAAA,UACE,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,QAAQ;AAAA,YACN;AAAA,cACE,OAAO;AAAA,cACP,QAAQ;AAAA,gBACN,uBAAuB;AAAA,gBACvB,0BAA0B;AAAA,cAAA;AAAA,YAC5B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IAEJ;AAEA,QAAI;AACF,YAAM,UAAkC,QAAQ,QAC5C,EAAE,eAAe,UAAU,QAAQ,KAAK,GAAA,IACxC,CAAA;AACJ,UAAI,gBAAgB,cAAc;AAClC,UAAI,wBAAwB;AAC5B,UAAI,CAAC,cAAc,QAAQ,yBAAyB,SAAS,SAAS;AACpE,cAAM,WAAW,MAAM,0BAA0B,SAAS,SAAS;AAAA,UACjE,oBAAoB;AAAA,UACpB,mBAAmB,QAAQ;AAAA,UAC3B,OAAO,QAAQ;AAAA,QAAA,CAChB,EAAE,MAAM,MAAY,IAAI;AACzB,YAAI,UAAU;AACZ,0BAAgB;AAChB,kCAAwB;AAAA,QAC1B;AAAA,MACF;AAEA,YAAM,OAAO,MAAM;AAAA,QACjB,GAAG,OAAO,WAAW,qBAAqB,aAAa,CAAC;AAAA,QACxD;AAAA,UACE,OAAO,QAAQ;AAAA,UACf;AAAA,UACA,WAAW,QAAQ;AAAA,UACnB,QAAQ,QAAQ;AAAA,QAAA;AAAA,MAClB;AAGF,YAAM,UAAU,yBAAyB,MAAM,QAAQ,cAAc,EAAE;AACvE,YAAM,kBACJ,QAAQ,SAAS,IACb,QAAQ,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,OAAO,CAAC,IAAI,QAAQ,SACvD;AAEN,YAAM,YAAY,YAAY,KAAK,SAAS;AAC5C,YAAM,QAAQ,YAAY,KAAK,KAAK;AACpC,YAAM,kBAAkB;AAAA,QACtB;AAAA,QACA;AAAA,QACA,QAAQ,gBAAgB;AAAA,QACxB,QAAQ,YAAY;AAAA,MAAA;AAGtB,UAAI,QAAuB;AAC3B,UAAI;AACJ,UAAI,oBAAoB,QAAQ,oBAAoB,MAAM;AACxD,gBAAQ,kBAAkB,MAAM,kBAAkB;AAClD,eAAO;AAAA,MACT,WAAW,oBAAoB,MAAM;AACnC,gBAAQ;AACR,eAAO;AAAA,MACT,WAAW,oBAAoB,MAAM;AACnC,gBAAQ;AACR,eAAO;AAAA,MACT,OAAO;AACL,eAAO;AAAA,MACT;AAEA,YAAM,aACJ,UAAU,OACN,OACA,KAAK,MAAM,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,CAAC,IAAI,GAAG,IAAI;AAC5D,YAAM,UAAoB,CAAA;AAC1B,UAAI,oBAAoB,MAAM;AAC5B,gBAAQ,KAAK,8BAA8B;AAAA,MAC7C;AACA,UAAI,oBAAoB,MAAM;AAC5B,gBAAQ,KAAK,6BAA6B;AAAA,MAC5C;AAEA,aAAO;AAAA,QACL;AAAA,UACE,UAAU;AAAA,UACV,QAAQ,eAAe,OAAO,YAAY;AAAA,UAC1C,OAAO;AAAA,UACP,QAAQ;AAAA,YACN;AAAA,cACE,OAAO;AAAA,cACP,QAAQ;AAAA,gBACN,oBACE,OAAO,KAAK,OAAO,YAAY,KAAK,GAAG,KAAA,IACnC,KAAK,KACL;AAAA,gBACN,sBAAsB;AAAA,gBACtB,wBAAwB;AAAA,gBACxB,6BAA6B,QAAQ;AAAA,gBACrC,sBAAsB;AAAA,gBACtB,kBAAkB;AAAA,gBAClB,qBAAqB;AAAA,gBACrB,uBAAuB,eAAe,OAAO,YAAY;AAAA,gBACzD,0BAA0B;AAAA,gBAC1B,wBAAwB;AAAA,gBACxB,GAAI,wBACA,EAAE,yBAAyB,kBAC3B,CAAA;AAAA,cAAC;AAAA,YACP;AAAA,UACF;AAAA,UAEF,YAAY;AAAA,YACV,QAAQ;AAAA,YACR,WAAW,GAAG,OAAO,WAAW,qBAAqB,aAAa,CAAC;AAAA,YACnE,WAAW;AAAA,YACX,WAAW;AAAA,UAAA;AAAA,QACb;AAAA,MACF;AAAA,IAEJ,SAAS,OAAO;AACd,YAAM,UACJ,iBAAiB,2BAA2B,MAAM,WAAW;AAC/D,aAAO;AAAA,QACL;AAAA,UACE,UAAU;AAAA,UACV,QAAQ,UAAU,YAAY,gBAAgB,KAAK;AAAA,UACnD,QAAQ;AAAA,YACN;AAAA,cACE,OAAO;AAAA,cACP,QAAQ;AAAA,gBACN,uBAAuB,UAAU,YAAY;AAAA,gBAC7C,0BAA0B;AAAA,cAAA;AAAA,YAC5B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IAEJ;AAAA,EACF;AAEA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,UAAU,CAAC,yBAAyB;AAAA,IACpC,WAAW,QAAQ;AAAA,IACnB,mBAAmB,QAAQ,qBAAqB;AAAA,IAChD,WAAW,QAAQ;AAAA,IACnB;AAAA,EAAA;AAEJ;AAoCO,SAAS,wBAAwB,SAGjB;AACrB,QAAM,WAAW,QAAQ,YAAY;AACrC,SAAO,OAAO,UAAU,YAAY;AAClC,UAAM,OAAO,MAAM,YAAqB,QAAQ,KAAK;AAAA,MACnD,OAAO,QAAQ;AAAA,MACf,WAAW,QAAQ;AAAA,MACnB,QAAQ,QAAQ;AAAA,IAAA,CACjB;AACD,UAAM,SAAS,SAAS,IAAI;AAC5B,UAAM,OAAO,MAAM,QAAQ,IAAI,IAAI,OAAO,QAAQ;AAClD,QAAI,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxB,aAAO;AAAA,IACT;AACA,UAAM,MAAyB,CAAA;AAC/B,eAAW,OAAO,MAAM;AACtB,YAAM,YAAY,SAAS,GAAG;AAC9B,UAAI,CAAC,WAAW;AACd;AAAA,MACF;AACA,YAAM,QAAQ,WAAW,WAAW,QAAQ;AAC5C,UAAI,CAAC,OAAO;AACV;AAAA,MACF;AACA,YAAM,UAAkC,CAAA;AACxC,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,SAAS,GAAG;AACpD,cAAM,SAAS,YAAY,KAAK;AAChC,YAAI,QAAQ,YAAY,WAAW,MAAM;AACvC,kBAAQ,GAAG,IAAI;AAAA,QACjB;AAAA,MACF;AACA,UAAI,KAAK,EAAE,OAAO,QAAA,CAAS;AAAA,IAC7B;AACA,WAAO;AAAA,EACT;AACF;AAEA,MAAM,wBAAwB,CAAC,UAC7B,IAAI;AAAA,EACF,MACG,cACA,MAAM,YAAY,EAClB,OAAO,CAAA,UAAS,MAAM,SAAS,CAAC;AACrC;AAEF,MAAM,oBAAoB,CAAC,GAAgB,MAA2B;AACpE,MAAI,EAAE,SAAS,KAAK,EAAE,SAAS,GAAG;AAChC,WAAO;AAAA,EACT;AACA,MAAI,eAAe;AACnB,aAAW,SAAS,GAAG;AACrB,QAAI,EAAE,IAAI,KAAK,GAAG;AAChB,sBAAgB;AAAA,IAClB;AAAA,EACF;AACA,SAAO,gBAAgB,EAAE,OAAO,EAAE,OAAO;AAC3C;AAWO,SAAS,+BACd,UASI,IACgB;AACpB,QAAM,UAAU;AAAA,IACd,QAAQ,sBAAsB;AAAA,EAAA;AAEhC,QAAM,eAAe;AAAA,IACnB,QAAQ,2BAA2B;AAAA,EAAA;AAErC,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,SAAS,QAAQ,iBAAiB;AACxC,QAAM,aAAa,QAAQ,cAAc,KAAK,KAAK,KAAK;AACxD,QAAM,gBAAgB,QAAQ,iBAAiB;AAC/C,QAAM,gCAAgB,IAAA;AAItB,QAAM,+BAAe,IAAA;AAErB,QAAM,WAAW,OACf,SACA,SACsC;AACtC,UAAM,MAAM,GAAG,OAAO,aAAa,SAAS,SAAS,MAAM,IAAI,qBAAqB,IAAI,CAAC;AACzF,UAAM,UAAU,MAAM,YAAsC,KAAK;AAAA,MAC/D,OAAO,QAAQ;AAAA,MACf,WAAW,QAAQ;AAAA,MACnB,QAAQ,QAAQ;AAAA,IAAA,CACjB;AACD,WAAO,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAA;AAAA,EAC5C;AAEA,QAAM,oBAAoB,OACxB,SACA,QAC2B;AAC3B,UAAM,cAAc,MAAM,SAAS,SAAS,GAAG,GAC5C,IAAI,CAAA,UAAU,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO,EAAG,EAC/D,OAAO,CAAA,SAAQ,KAAK,SAAS,UAAU,KAAK,KAAK,SAAS,OAAO,CAAC;AACrE,WAAO,WAAW,SAAS,IAAK,WAAW,OAAO,GAAG,EAAE,KAAK,OAAQ;AAAA,EACtE;AAEA,QAAM,gBAAgB,OACpB,SACA,kBAC2B;AAC3B,UAAM,aAAa,cAAc,QAAQ,GAAG;AAC5C,QAAI,cAAc,KAAK,eAAe,cAAc,SAAS,GAAG;AAC9D,aAAO;AAAA,IACT;AACA,UAAM,MAAM,cAAc,MAAM,GAAG,UAAU;AAC7C,UAAM,OAAO,cAAc,MAAM,aAAa,CAAC;AAC/C,QAAI,CAAC,OAAO,CAAC,MAAM;AACjB,aAAO;AAAA,IACT;AACA,UAAM,SAAS,IAAI,YAAA;AACnB,QAAI;AACJ,UAAM,SAAS,SAAS,IAAI,MAAM;AAClC,QAAI,UAAU,KAAK,IAAA,IAAQ,OAAO,YAAY,YAAY;AACxD,cAAQ,OAAO;AAAA,IACjB,OAAO;AACL,UAAI;AACF,iBAAS,MAAM,SAAS,SAAS,GAAG,GACjC,IAAI,CAAA,UAAU,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO,EAAG,EAC/D;AAAA,UACC,CAAA,SACE,KAAK,WAAW,GAAG,GAAG,GAAG,KACzB,CAAC,KAAK,MAAM,IAAI,SAAS,CAAC,EAAE,SAAS,GAAG,KACxC,KAAK,MAAM,IAAI,SAAS,CAAC,EAAE,SAAS;AAAA,QAAA;AAAA,MAE5C,QAAQ;AACN,eAAO;AAAA,MACT;AACA,eAAS,IAAI,QAAQ,EAAE,OAAO,WAAW,KAAK,IAAA,GAAO;AAAA,IACvD;AACA,QAAI,MAAM,WAAW,GAAG;AACtB,aAAO;AAAA,IACT;AACA,UAAM,eAAe,sBAAsB,IAAI;AAC/C,QAAI,WAA0B;AAC9B,QAAI,iBAAiB;AACrB,eAAW,QAAQ,OAAO;AACxB,YAAM,gBAAgB,KAAK,MAAM,IAAI,SAAS,CAAC;AAC/C,YAAM,aAAa;AAAA,QACjB;AAAA,QACA,sBAAsB,aAAa;AAAA,MAAA;AAErC,UAAI,aAAa,gBAAgB;AAC/B,yBAAiB;AACjB,mBAAW;AAAA,MACb;AAAA,IACF;AACA,QAAI,CAAC,YAAY,iBAAiB,eAAe;AAC/C,aAAO;AAAA,IACT;AACA,QAAI;AACF,aAAO,MAAM,kBAAkB,SAAS,QAAQ;AAAA,IAClD,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,qBAAqB,OACzB,SACA,kBAC2B;AAC3B,UAAM,MAAM,cAAc,YAAA;AAC1B,UAAM,SAAS,UAAU,IAAI,GAAG;AAChC,QAAI,UAAU,KAAK,IAAA,IAAQ,OAAO,YAAY,YAAY;AACxD,aAAO,OAAO;AAAA,IAChB;AACA,QAAI,OAAsB;AAC1B,QAAI;AACF,aAAO,MAAM,kBAAkB,SAAS,aAAa;AAAA,IACvD,QAAQ;AACN,aAAO;AAAA,IACT;AACA,QAAI,CAAC,MAAM;AACT,aAAO,MAAM,cAAc,SAAS,aAAa;AAAA,IACnD;AACA,cAAU,IAAI,KAAK,EAAE,MAAM,WAAW,KAAK,IAAA,GAAO;AAClD,WAAO;AAAA,EACT;AAEA,SAAO,OAAO,SAAS,YAAY;AACjC,UAAM,aAAa,sBAAsB,OAAO;AAChD,UAAM,gBACJ,WAAW,YAAY,oBAAoB,KAC3C,WAAW,YAAY,yBAAyB,KAChD,eAAe,OAAO;AACxB,QAAI,CAAC,eAAe;AAClB,aAAO;AAAA,IACT;AACA,UAAM,aAAa,MAAM,mBAAmB,SAAS,aAAa;AAClE,QAAI,CAAC,YAAY;AACf,aAAO;AAAA,IACT;AACA,UAAM,MAAM,GAAG,YAAY,IAAI,SAAS,YAAY,MAAM,IAAI,UAAU;AACxE,UAAM,UAAU,MAAM,YAAqC,KAAK;AAAA,MAC9D,OAAO,QAAQ;AAAA,MACf,WAAW,QAAQ;AAAA,MACnB,QAAQ,QAAQ;AAAA,IAAA,CACjB;AACD,UAAM,UAAU,SAAS,OAAO,GAAG;AACnC,QAAI,CAAC,aAAa,OAAO,GAAG;AAC1B,aAAO;AAAA,IACT;AACA,UAAM,UAAkC,CAAA;AACxC,eAAW,cAAc,OAAO;AAAA,MAC9B;AAAA,IAAA,GACC;AACD,UAAI,CAAC,aAAa,UAA4B,GAAG;AAC/C;AAAA,MACF;AACA,iBAAW,CAAC,MAAM,QAAQ,KAAK,OAAO;AAAA,QACpC;AAAA,MAAA,GACC;AACD,cAAM,iBAAiB,KAAK,KAAA,EAAO,YAAA;AACnC,YACE,CAAC,kBACD,eAAe,SAAS,QAAQ,KAChC,mBAAmB,SACnB;AACA;AAAA,QACF;AACA,cAAM,QAAQ,YAAY,QAAQ;AAClC,YAAI,UAAU,QAAQ,CAAC,oBAAoB,cAAc,GAAG;AAC1D;AAAA,QACF;AAEA,gBAAQ,IAAI,IAAI;AAAA,MAClB;AAAA,IACF;AACA,QAAI,OAAO,KAAK,OAAO,EAAE,WAAW,GAAG;AACrC,aAAO;AAAA,IACT;AACA,WAAO,CAAC,EAAE,OAAO,eAAe,SAAS;AAAA,EAC3C;AACF;AAQO,SAAS,2BACd,UAA4C,IACxB;AACpB,QAAM,SAAS,QAAQ,UAAU,+BAAA;AACjC,QAAM,UAAU,OACd,SACA,YACwC;AACxC,UAAM,MAAM,QAAQ,IAAI,YAAA;AACxB,UAAM,UAAU,eAAe,OAAO;AACtC,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,QACL;AAAA,UACE,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,QAAQ;AAAA,YACN;AAAA,cACE,OAAO;AAAA,cACP,QAAQ;AAAA,gBACN,mBAAmB;AAAA,gBACnB,sBAAsB;AAAA,cAAA;AAAA,YACxB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IAEJ;AAEA,QAAI,OAA0C;AAC9C,QAAI;AACF,aAAO,MAAM,OAAO,SAAS,OAAO;AAAA,IACtC,SAAS,OAAO;AACd,aAAO;AAAA,QACL;AAAA,UACE,UAAU;AAAA,UACV,QAAQ,gBAAgB,KAAK;AAAA,UAC7B,QAAQ;AAAA,YACN;AAAA,cACE,OAAO;AAAA,cACP,QAAQ;AAAA,gBACN,mBAAmB;AAAA,gBACnB,sBAAsB;AAAA,cAAA;AAAA,YACxB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IAEJ;AAEA,UAAM,MACJ,MAAM,KAAK,CAAA,cAAa,eAAe,UAAU,OAAO,OAAO,CAAC,MAC/D,MAAM,WAAW,IAAI,KAAK,CAAC,IAAI;AAElC,QAAI,CAAC,KAAK;AACR,aAAO;AAAA,QACL;AAAA,UACE,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,QAAQ;AAAA,YACN;AAAA,cACE,OAAO;AAAA,cACP,QAAQ;AAAA,gBACN,mBAAmB;AAAA,gBACnB,sBAAsB;AAAA,cAAA;AAAA,YACxB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IAEJ;AAEA,UAAM,SAAS,OAAO,OAAO,IAAI,OAAO,EACrC,IAAI,oBAAoB,EACxB,OAAO,CAAC,UAA2B,UAAU,IAAI;AACpD,UAAM,QACJ,OAAO,SAAS,IACZ,KAAK;AAAA,MACF,OAAO,OAAO,CAAC,KAAK,MAAM,MAAM,GAAG,CAAC,IAAI,OAAO,SAAU;AAAA,IAAA,IACxD,MACJ;AAEN,WAAO;AAAA,MACL;AAAA,QACE,UAAU;AAAA,QACV,QAAQ,UAAU,OAAO,YAAY;AAAA,QACrC,OAAO;AAAA,QACP,QAAQ;AAAA,UACN;AAAA,YACE,OAAO;AAAA,YACP,QAAQ;AAAA,cACN,kBAAkB;AAAA,cAClB,yBAAyB,OAAO;AAAA,cAChC,mBAAmB,UAAU,OAAO,YAAY;AAAA,cAChD,sBAAsB;AAAA,cACtB,oBAAoB,CAAC,GAAG,oBAAoB;AAAA,YAAA;AAAA,UAC9C;AAAA,QACF;AAAA,QAEF,YAAY;AAAA,UACV,QAAQ;AAAA,UACR,WAAW,IAAI;AAAA,UACf,WAAW;AAAA,QAAA;AAAA,MACb;AAAA,IACF;AAAA,EAEJ;AAEA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,UAAU,CAAC,qBAAqB;AAAA,IAChC,WAAW,QAAQ;AAAA,IACnB,mBAAmB,QAAQ,qBAAqB;AAAA,IAChD,WAAW,QAAQ;AAAA,IACnB;AAAA,EAAA;AAEJ;"}
|
|
1
|
+
{"version":3,"file":"standards-sdk.es137.js","sources":["../../src/hcs-25/collectors/agentverse.ts"],"sourcesContent":["import type { Hcs25JsonValue, Hcs25Subject } from '../types';\nimport { readString, readSubjectAdditional } from '../signals';\nimport { parseTimestampMs } from './freshness';\nimport { Hcs25CollectorHttpError, isTimeoutError, requestJson } from './http';\nimport type {\n Hcs25CollectContext,\n Hcs25SignalAdapter,\n Hcs25SignalAdapterResult,\n} from './types';\n\nconst AGENTVERSE_API_BASE = 'https://agentverse.ai';\nconst INSIGHTS_SOURCES = ['agentverse:insights:v1'];\nconst AGENTVERSE_ADDRESS_REGEX =\n /^agent1[qpzry9x8gf2tvdw0s3jn54khce6mua7l]{59}$/i;\n\n/**\n * Options for the AgentVerse insights signal adapter.\n */\nexport interface Hcs25AgentverseSignalAdapterOptions {\n /** AgentVerse API base URL. Default `https://agentverse.ai`. */\n baseUrl?: string;\n /**\n * Almanac contract network query hint. When omitted, production behavior\n * applies: `mainnet` is tried first and `testnet` is probed on\n * missing/empty payloads.\n */\n contract?: 'mainnet' | 'testnet';\n /**\n * Also fetch `GET /v1/search/agents/{address}` and store its operational\n * status as `metrics.isOnline` / `metrics.lastActiveAt`. Default true.\n */\n fetchAgentStatus?: boolean;\n /** Refresh interval for stored `ok` state in ms. Default 6 hours. */\n ttlMs?: number;\n /** Refresh interval after a failure state in ms. Default 1 hour. */\n failureTtlMs?: number;\n timeoutMs?: number;\n includeRegistries?: readonly string[];\n excludeRegistries?: readonly string[];\n appliesTo?: (subject: Hcs25Subject) => boolean;\n}\n\nconst DEFAULT_INCLUDED_REGISTRIES: readonly string[] = ['agentverse', 'uagent'];\n\ninterface AgentverseInsightsResponse {\n address?: string;\n rating?: number | null;\n contract?: string;\n readme_quality_score?: number | null;\n readme_uniqueness_score?: number | null;\n interactions_score?: number | null;\n avg_response_time?: number | null;\n recent_uptime?: number | null;\n asi1_total_interactions?: number | null;\n asi1_total_success_interactions?: number | null;\n asi1_recent_interactions?: number | null;\n asi1_recent_success_interactions?: number | null;\n verifier_total_interactions?: number | null;\n verifier_total_success_interactions?: number | null;\n verifier_recent_interactions?: number | null;\n verifier_recent_success_interactions?: number | null;\n}\n\ninterface AgentverseAgentResponse {\n status?: string;\n last_updated?: string;\n}\n\nfunction resolveAgentAddress(subject: Hcs25Subject): string | null {\n const additional = readSubjectAdditional(subject);\n const metadata = subject.metadata ?? {};\n for (const value of [\n readString(additional, 'agentverseInsightsAddress'),\n subject.id,\n readString(metadata, 'nativeId'),\n readString(metadata, 'uid'),\n readString(metadata, 'address'),\n ]) {\n if (value && AGENTVERSE_ADDRESS_REGEX.test(value.trim())) {\n return value.trim();\n }\n }\n const uaidFull = readString(metadata, 'uaidFull');\n if (uaidFull) {\n const nativeId = uaidFull\n .match(/(?:^|;)nativeId=([^;]+)(?:;|$)/i)?.[1]\n ?.trim();\n if (nativeId && AGENTVERSE_ADDRESS_REGEX.test(nativeId)) {\n return nativeId;\n }\n const uid = uaidFull.match(/(?:^|;)uid=([^;]+)(?:;|$)/i)?.[1]?.trim();\n if (uid && AGENTVERSE_ADDRESS_REGEX.test(uid)) {\n return uid;\n }\n }\n return null;\n}\n\nfunction num(value: number | null | undefined): number | null {\n return typeof value === 'number' && Number.isFinite(value) ? value : null;\n}\n\n/**\n * Creates the `agentverse-insights` signal adapter: fetches the AgentVerse\n * insights endpoint for the subject's agent address and stores the\n * `agentverseInsights*` field family (rating, quality proxies, interaction\n * and verifier counters) under `metadata.additional`. Optionally also reads\n * the agent record for online status.\n */\nexport function createAgentverseInsightsSignalAdapter(\n options: Hcs25AgentverseSignalAdapterOptions = {},\n): Hcs25SignalAdapter {\n const baseUrl = options.baseUrl ?? AGENTVERSE_API_BASE;\n const fetchAgentStatus = options.fetchAgentStatus ?? true;\n\n const collect = async (\n subject: Hcs25Subject,\n context: Hcs25CollectContext,\n ): Promise<Hcs25SignalAdapterResult[]> => {\n const now = context.now.toISOString();\n const address = resolveAgentAddress(subject);\n if (!address) {\n return [\n {\n signalId: 'agentverse.insights',\n status: 'missing',\n fields: [\n {\n scope: 'additional',\n values: {\n agentverseInsightsStatus: 'missing',\n agentverseInsightsUpdatedAt: now,\n },\n },\n ],\n },\n ];\n }\n\n // Freshness gate (production TTL/failure-TTL semantics).\n if (!context.force) {\n const additional = readSubjectAdditional(subject);\n const storedStatus = readString(additional, 'agentverseInsightsStatus');\n const storedUpdatedMs = parseTimestampMs(\n (additional as Record<string, Hcs25JsonValue>)\n .agentverseInsightsUpdatedAt,\n );\n if (storedStatus && storedUpdatedMs !== null) {\n const ttl =\n storedStatus === 'ok'\n ? (options.ttlMs ?? 6 * 60 * 60 * 1000)\n : (options.failureTtlMs ?? 60 * 60 * 1000);\n if (context.now.getTime() - storedUpdatedMs < ttl) {\n return [\n {\n signalId: 'agentverse.insights',\n status: storedStatus === 'ok' ? 'ok' : 'missing',\n provenance: {\n source: 'agentverse',\n subjectId: address,\n fetchedAt: new Date(storedUpdatedMs).toISOString(),\n },\n },\n ];\n }\n }\n }\n\n const results: Hcs25SignalAdapterResult[] = [];\n const sources: string[] = [];\n\n const contractParam =\n options.contract ??\n readString(readSubjectAdditional(subject), 'agentverseInsightsContract');\n // Production behavior: mainnet first, then testnet on 404/422 or an\n // all-empty payload; non-missing HTTP failures are upstream-error.\n const contractsToTry: Array<'mainnet' | 'testnet'> =\n contractParam === 'mainnet' || contractParam === 'testnet'\n ? [contractParam]\n : ['mainnet', 'testnet'];\n\n let insightsResult:\n | {\n data: AgentverseInsightsResponse;\n contract: 'mainnet' | 'testnet';\n url: string;\n }\n | { status: 'missing' | 'upstream-error' }\n | { status: 'timeout' | 'error' } = { status: 'missing' };\n\n for (const contract of contractsToTry) {\n const insightsUrl = `${baseUrl}/v1/search/analytics/insights/${encodeURIComponent(address)}?contract=${contract}`;\n try {\n const data = await requestJson<AgentverseInsightsResponse>(\n insightsUrl,\n {\n fetch: context.fetch,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n },\n );\n const hasAnySignal =\n num(data.rating) !== null ||\n num(data.readme_quality_score) !== null ||\n num(data.readme_uniqueness_score) !== null ||\n num(data.interactions_score) !== null ||\n num(data.avg_response_time) !== null ||\n (num(data.asi1_total_interactions) ?? 0) > 0 ||\n (num(data.asi1_recent_interactions) ?? 0) > 0 ||\n (num(data.verifier_total_interactions) ?? 0) > 0 ||\n (num(data.verifier_recent_interactions) ?? 0) > 0;\n if (!hasAnySignal) {\n continue;\n }\n insightsResult = { data, contract, url: insightsUrl };\n break;\n } catch (error) {\n if (\n error instanceof Hcs25CollectorHttpError &&\n (error.status === 404 || error.status === 422)\n ) {\n continue;\n }\n insightsResult = {\n status: isTimeoutError(error) ? 'timeout' : 'upstream-error',\n };\n break;\n }\n }\n\n if ('data' in insightsResult) {\n const { data, contract, url } = insightsResult;\n sources.push('insights');\n results.push({\n signalId: 'agentverse.insights',\n status: 'ok',\n value: num(data.rating),\n fields: [\n {\n scope: 'additional',\n values: {\n agentverseInsightsUpdatedAt: now,\n agentverseInsightsStatus: 'ok',\n agentverseInsightsAddress: address,\n agentverseInsightsContract: contract,\n agentverseInsightsSources: [...INSIGHTS_SOURCES],\n agentverseInsightsRating: num(data.rating),\n agentverseInsightsReadmeQualityScore: num(\n data.readme_quality_score,\n ),\n agentverseInsightsReadmeUniquenessScore: num(\n data.readme_uniqueness_score,\n ),\n agentverseInsightsInteractionsScore: num(data.interactions_score),\n agentverseInsightsAvgResponseTime: num(data.avg_response_time),\n agentverseInsightsAsi1TotalInteractions:\n num(data.asi1_total_interactions) ?? 0,\n agentverseInsightsAsi1TotalSuccessInteractions:\n num(data.asi1_total_success_interactions) ?? 0,\n agentverseInsightsAsi1RecentInteractions:\n num(data.asi1_recent_interactions) ?? 0,\n agentverseInsightsAsi1RecentSuccessInteractions:\n num(data.asi1_recent_success_interactions) ?? 0,\n agentverseInsightsVerifierTotalInteractions:\n num(data.verifier_total_interactions) ?? 0,\n agentverseInsightsVerifierTotalSuccessInteractions:\n num(data.verifier_total_success_interactions) ?? 0,\n agentverseInsightsVerifierRecentInteractions:\n num(data.verifier_recent_interactions) ?? 0,\n agentverseInsightsVerifierRecentSuccessInteractions:\n num(data.verifier_recent_success_interactions) ?? 0,\n },\n },\n ],\n provenance: {\n source: 'agentverse',\n sourceUrl: url,\n subjectId: address,\n fetchedAt: now,\n },\n });\n } else {\n const stored =\n insightsResult.status === 'missing' ? 'missing' : 'upstream-error';\n results.push({\n signalId: 'agentverse.insights',\n status:\n insightsResult.status === 'timeout'\n ? 'timeout'\n : stored === 'missing'\n ? 'missing'\n : 'error',\n fields: [\n {\n scope: 'additional',\n values: {\n agentverseInsightsUpdatedAt: now,\n agentverseInsightsStatus: stored,\n agentverseInsightsAddress: address,\n agentverseInsightsSources: [...INSIGHTS_SOURCES],\n },\n },\n ],\n provenance: {\n source: 'agentverse',\n subjectId: address,\n fetchedAt: now,\n },\n });\n }\n\n if (fetchAgentStatus) {\n const agentUrl = `${baseUrl}/v1/search/agents/${encodeURIComponent(address)}${contractParam ? `?contract=${contractParam}` : ''}`;\n try {\n const agent = await requestJson<AgentverseAgentResponse>(agentUrl, {\n fetch: context.fetch,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n });\n sources.push('search-agent');\n results.push({\n signalId: 'agentverse.agent_status',\n status: 'ok',\n value: agent.status ?? null,\n fields: [\n {\n scope: 'metrics',\n values: {\n isOnline: agent.status === 'active',\n lastActiveAt: agent.last_updated ?? null,\n },\n },\n ],\n provenance: {\n source: 'agentverse',\n sourceUrl: agentUrl,\n subjectId: address,\n fetchedAt: now,\n },\n });\n } catch {\n results.push({\n signalId: 'agentverse.agent_status',\n status: 'missing',\n });\n }\n }\n\n if (sources.length > 0) {\n results.push({\n signalId: 'agentverse.sources',\n status: 'ok',\n value: sources,\n fields: [\n {\n scope: 'additional',\n values: { agentverseInsightsSources: sources },\n },\n ],\n });\n }\n\n return results;\n };\n\n return {\n id: 'agentverse-insights',\n produces: [\n 'agentverse.insights',\n 'agentverse.agent_status',\n 'agentverse.sources',\n ],\n timeoutMs: options.timeoutMs,\n includeRegistries: options.includeRegistries ?? DEFAULT_INCLUDED_REGISTRIES,\n excludeRegistries: options.excludeRegistries,\n appliesTo: options.appliesTo,\n collect,\n };\n}\n"],"names":[],"mappings":"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"}
|