What's new
  • Visit Rebornbuddy
  • Visit Panda Profiles
  • Visit LLamamMagic
  • Visit Resources
  • Visit Downloads
  • Visit Portal

[Plugin Addon] "Item Rules" with a file based scripting language

Is there a way to check avg dmg on offhand?
Well. Currently if you really want to, you can do something like this:
Code:
[QUALITY] == Rare && [TYPE] == Orb # [INT] >= 100 && [CRIT%] >= 8 && [ARCONCRIT] >=8 && [MINDMG] >= 100 && [MAXDMG] >= 300
[QUALITY] == Rare && [TYPE] == Orb # [INT] >= 100 && [CRIT%] >= 8 && [ARCONCRIT] >=8 && [MINDMG] >= 90 && [MAXDMG] >= 310
[QUALITY] == Rare && [TYPE] == Orb # [INT] >= 100 && [CRIT%] >= 8 && [ARCONCRIT] >=8 && [MINDMG] >= 80 && [MAXDMG] >= 320
[QUALITY] == Rare && [TYPE] == Orb # [INT] >= 100 && [CRIT%] >= 8 && [ARCONCRIT] >=8 && [MINDMG] >= 70 && [MAXDMG] >= 330
[QUALITY] == Rare && [TYPE] == Orb # [INT] >= 100 && [CRIT%] >= 8 && [ARCONCRIT] >=8 && [MINDMG] >= 60 && [MAXDMG] >= 340
[QUALITY] == Rare && [TYPE] == Orb # [INT] >= 100 && [CRIT%] >= 8 && [ARCONCRIT] >=8 && [MINDMG] >= 50 && [MAXDMG] >= 350
[QUALITY] == Rare && [TYPE] == Orb # [INT] >= 100 && [CRIT%] >= 8 && [ARCONCRIT] >=8 && [MINDMG] >= 40 && [MAXDMG] >= 360
[QUALITY] == Rare && [TYPE] == Orb # [INT] >= 100 && [CRIT%] >= 8 && [ARCONCRIT] >=8 && [MINDMG] >= 30 && [MAXDMG] >= 370
[QUALITY] == Rare && [TYPE] == Orb # [INT] >= 100 && [CRIT%] >= 8 && [ARCONCRIT] >=8 && [MINDMG] >= 20 && [MAXDMG] >= 380
[QUALITY] == Rare && [TYPE] == Orb # [INT] >= 100 && [CRIT%] >= 8 && [ARCONCRIT] >=8 && [MINDMG] >= 10 && [MAXDMG] >= 390
[QUALITY] == Rare && [TYPE] == Orb # [INT] >= 100 && [CRIT%] >= 8 && [ARCONCRIT] >=8 && [MINDMG] > 0 && [MAXDMG] >= 400
:D
This will MOSTLY cover everything around 200+ AVG dmg. But as you can see, it's not exactly good, neither it is reliable, for example 9-399 (avg dmg 204) will not be caught. Though it will catch everything 205+ and some 200+ ones -_- But these are 11 rules, where 1 should actully be ok.
 
... has anyone a good set of rare rules ... ^^ to integrate in the next version?

i don't have to much time for the rules ... ^^
 
... has anyone a good set of rare rules ... ^^ to integrate in the next version?

i don't have to much time for the rules ... ^^

I am currently working on rares, but they are really freaking hard to cover, so random =( I've only done the easy stuff like shoulders, wrists and chest to my liking, now trying the OHs, then moving to belts/pants/boots, then helms and weapons, then the hardest ones - gloves and rings -_- Will probably take me a week or so with the amount of time I got so far =\
 
is this plugin only work for ENG version of d3? it seems doesnt work when the bot tries to TRASH the items if your d3 is not in ENG verison.
any buddy is using other language system such as Traditional Chinese / Russian / Korean...instead of ENG and work fine?
 
darkfriend77
can u add +itemID to rules? i think it can be solution for the name and language problem...

in giles is something like "BalancedID" or "ThisBalancedID"
 
isn't this the same as creating a custom loot rule? Or does this plugin do something that the custom loot rule feature from db core can't do? can anyone clarify? to me, it seems like just a custom loot table, but in plugin form. o.O
u might be right .... but ... if so ... show me the xml rule for ...

Code:
[TYPE] == Shield # [MAXSTATVIT] >= 150 && [CRIT%] >= 8 && [ALLRES] >= 60 && ( [MAXONERES] >= 40 ||  [LIFE%] >= 8 ) # [KEEP]

:rolleyes:

I was playing around with loot rules, would it be something like this?

Code:
  <Categories>
    <Category ruleType="Keep">
      <ItemRule ItemType="Shield">
        <StatRules>
          <Rule stat="Quality" value="Rare4" />
          <Rule stat="CritPercent" minValue="8" />
          <Rule stat="ResistAll" minValue="60" />
          <Rule stat="Vitality" minValue="50" />
          <Rule stat="Strength" minValue="100" logic="Or" />
          <Rule stat="Intelligence" minValue="100" logic="Or" />
          <Rule stat="Dexterity" minValue="100" />
          <Rule stat="ResistPhysical" minValue="40" logic="Or" />
          <Rule stat="ResistFire" minValue="40" logic="Or" />
          <Rule stat="ResistCold" minValue="40" logic="Or" />
          <Rule stat="ResistLightning" minValue="40" logic="Or" />
          <Rule stat="ResistArcane" minValue="40" logic="Or" />
          <Rule stat="ResistPoison" minValue="40" logic="Or" />
          <Rule stat="ResistHoly" minValue="40" logic="Or" />
          <Rule stat="LifePercent" minValue="8" />
        </StatRules>
      </ItemRule>
    </Category>
  </Category>

Might seem longer, but this way, we won't need a plugin and just use DB core features and maybe don't have to worry of any plugin bugs occurring. Just an idea. =)
 
Last edited:
I was playing around with loot rules, would it be something like this?

Code:
  <Categories>
    <Category ruleType="Keep">
      <ItemRule ItemType="Shield">
        <StatRules>
          <Rule stat="Quality" value="Rare4" />
          <Rule stat="CritPercent" minValue="8" />
          <Rule stat="ResistAll" minValue="60" />
          <Rule stat="Vitality" minValue="50" />
          <Rule stat="Strength" minValue="100" logic="Or" />
          <Rule stat="Intelligence" minValue="100" logic="Or" />
          <Rule stat="Dexterity" minValue="100" />
          <Rule stat="ResistPhysical" minValue="40" logic="Or" />
          <Rule stat="ResistFire" minValue="40" logic="Or" />
          <Rule stat="ResistCold" minValue="40" logic="Or" />
          <Rule stat="ResistLightning" minValue="40" logic="Or" />
          <Rule stat="ResistArcane" minValue="40" logic="Or" />
          <Rule stat="ResistPoison" minValue="40" logic="Or" />
          <Rule stat="ResistHoly" minValue="40" logic="Or" />
          <Rule stat="LifePercent" minValue="8" />
        </StatRules>
      </ItemRule>
    </Category>
  </Category>

Might seem longer, but this way, we won't need a plugin and just use DB core features and maybe don't have to worry of any plugin bugs occurring. Just an idea. =)

"might seem longer"? :D, Man, it's like 10 times more symbols. So it is 10 times more work and also 10 times more places to make mistakes in, also custom loot rules can't do something like:
item # condition1 # keep
item # condition2 #trash
item #condition3 #keep
Which is very useful for some types of items and some legendaries. First you just keep the godly rolls no matter what. Then you trash not even potentially good rolls. Then you keep the rest (if it's not godly and not trash, it might be ok). Useful for very random items.

is this plugin only work for ENG version of d3? it seems doesnt work when the bot tries to TRASH the items if your d3 is not in ENG verison.
any buddy is using other language system such as Traditional Chinese / Russian / Korean...instead of ENG and work fine?

Russian versions here. Works fine.

ps. For people who see to much trash stashed - you might want to remove all or most "safety rules" in the end of the rare.dis, some of them are really ridiculous (for example the [jewelry] # [damagefactor] > 4", that will stash pretty much any ring/amy with crit OR as. also the [armor] # [maxstatvit] > 400 rule seems to catch much crap. In any scenario safety rules in my opinion are more harm than good.
 
I am use ENG client ,I change my plugin to yours on the day befor yesterday.and I tested one day with my bots.and get nothing except some ring and many many QUIVER's,when I go back check the log .I find the plugin sold many good items.
1)pants
12112012233451: -----------------------------------------------------------------
12112012233451: TRASH: Pants,Legendary,Legs (63)
12112012233451: Rule:[QUALITY]==Legendary&&[BASETYPE]==Armor#[1]==1#[TRASH]
12112012233451: ---Pants,Legendary,Legs (63)
12112012233451: [BASETYPE]: Armor
12112012233451: [TYPE]: Legs
12112012233451: [QUALITY]: Legendary
12112012233451: [NAME]: Pants
12112012233451: [ONEHAND]: False
12112012233451: [TWOHAND]: False
12112012233451: [LEVEL]: 63
12112012233451: [STR]: 119
12112012233451: [DEX]: 93
12112012233451: [INT]: 150
12112012233451: [VIT]: 99
12112012233451: [LIFE%]: 11.99951
12112012233451: [LOH]: 456
12112012233451: [ARMOR]: 431.5
12112012233451: [ARMORTOT]: 431
12112012233451: [MF%]: 19.99512
12112012233451: [MAXSTAT]: 150
12112012233451: [MAXSTATVIT]: 249
12112012233451: [STRVIT]: 218
12112012233451: [DEXVIT]: 192
12112012233451: [INTVIT]: 249
you rules as follow
// - Blackthorne's Jousting Mail ----------------------------------------------+
// Set Pants
// 397–457 Armor
// +90-100 Strength
// +90-100 Dexterity
// +90-100 Intelligence
// +90-100 Vitality
// Each Hit Adds +329-479 Life
// +10-12% Life
// 19-20% Better Chance of Finding Magical Items
// +2 Random Magic Properties
// Blackthorne's Armor
// Item Level: 63
[QUALITY] == Legendary && [NAME] == Blackthorne's Jousting Mail # [1] == 1

2) a good Ice Climbers with high STR and VIT. (I can' find the log because I have delete all the client and down a new one)
your rules

// - Ice Climbers -------------------------------------------------------------+
// Legendary Boots
// 309–355 Armor
// +71-80 Resistance to All Elements
// +10-12% Life
// Reduces damage from Cold attacks by 7-10%.
// One of 3 Magic Properties (varies)
// +170-200 Intelligence
// +170-200 Dexterity
// +170-200 Strength
// +3 Random Magic Properties
// Empty Socket
// Item Level: 63
[QUALITY] == Legendary && [NAME] == Ice Climbers # [1] == 1

So can you told me what was the problem? .Thanks
 
I was playing around with loot rules, would it be something like this?

Code:
  <Categories>
    <Category ruleType="Keep">
      <ItemRule ItemType="Shield">
        <StatRules>
          <Rule stat="Quality" value="Rare4" />
          <Rule stat="CritPercent" minValue="8" />
          <Rule stat="ResistAll" minValue="60" />
          <Rule stat="Vitality" minValue="50" />
          <Rule stat="Strength" minValue="100" logic="Or" />
          <Rule stat="Intelligence" minValue="100" logic="Or" />
          <Rule stat="Dexterity" minValue="100" />
          <Rule stat="ResistPhysical" minValue="40" logic="Or" />
          <Rule stat="ResistFire" minValue="40" logic="Or" />
          <Rule stat="ResistCold" minValue="40" logic="Or" />
          <Rule stat="ResistLightning" minValue="40" logic="Or" />
          <Rule stat="ResistArcane" minValue="40" logic="Or" />
          <Rule stat="ResistPoison" minValue="40" logic="Or" />
          <Rule stat="ResistHoly" minValue="40" logic="Or" />
          <Rule stat="LifePercent" minValue="8" />
        </StatRules>
      </ItemRule>
    </Category>
  </Category>

Might seem longer, but this way, we won't need a plugin and just use DB core features and maybe don't have to worry of any plugin bugs occurring. Just an idea. =)

<Rule stat="Vitality" minValue="50" />
<Rule stat="Strength" minValue="100" logic="Or" />
<Rule stat="Intelligence" minValue="100" logic="Or" />
<Rule stat="Dexterity" minValue="100" />
MAXSTATVIT is = STR + VIT .... it would keep also 50 STR and 100 VIT and also ... 150 STR without VIT ...
Ur Rule only works for Rare4 ^^ u need it also for Rare5 and Rare6 ^^

ur loot rule is still far from beeing complet... and has already ..... ^^more complexity ...
 
darkfriend77
can u add +itemID to rules? i think it can be solution for the name and language problem...

in giles is something like "BalancedID" or "ThisBalancedID"

i will put it in the log ... first so u can see if it is useable ... for what u need ^^
 
I am use ENG client ,I change my plugin to yours on the day befor yesterday.and I tested one day with my bots.and get nothing except some ring and many many QUIVER's,when I go back check the log .I find the plugin sold many good items.
1)pants
12112012233451: -----------------------------------------------------------------
12112012233451: TRASH: Pants,Legendary,Legs (63)
12112012233451: Rule:[QUALITY]==Legendary&&[BASETYPE]==Armor#[1]==1#[TRASH]
12112012233451: ---Pants,Legendary,Legs (63)
12112012233451: [BASETYPE]: Armor
12112012233451: [TYPE]: Legs
12112012233451: [QUALITY]: Legendary
12112012233451: [NAME]: Pants
12112012233451: [ONEHAND]: False
12112012233451: [TWOHAND]: False
12112012233451: [LEVEL]: 63
12112012233451: [STR]: 119
12112012233451: [DEX]: 93
12112012233451: [INT]: 150
12112012233451: [VIT]: 99
12112012233451: [LIFE%]: 11.99951
12112012233451: [LOH]: 456
12112012233451: [ARMOR]: 431.5
12112012233451: [ARMORTOT]: 431
12112012233451: [MF%]: 19.99512
12112012233451: [MAXSTAT]: 150
12112012233451: [MAXSTATVIT]: 249
12112012233451: [STRVIT]: 218
12112012233451: [DEXVIT]: 192
12112012233451: [INTVIT]: 249
you rules as follow
// - Blackthorne's Jousting Mail ----------------------------------------------+
// Set Pants
// 397?457 Armor
// +90-100 Strength
// +90-100 Dexterity
// +90-100 Intelligence
// +90-100 Vitality
// Each Hit Adds +329-479 Life
// +10-12% Life
// 19-20% Better Chance of Finding Magical Items
// +2 Random Magic Properties
// Blackthorne's Armor
// Item Level: 63
[QUALITY] == Legendary && [NAME] == Blackthorne's Jousting Mail # [1] == 1

2) a good Ice Climbers with high STR and VIT. (I can' find the log because I have delete all the client and down a new one)
your rules

// - Ice Climbers -------------------------------------------------------------+
// Legendary Boots
// 309?355 Armor
// +71-80 Resistance to All Elements
// +10-12% Life
// Reduces damage from Cold attacks by 7-10%.
// One of 3 Magic Properties (varies)
// +170-200 Intelligence
// +170-200 Dexterity
// +170-200 Strength
// +3 Random Magic Properties
// Empty Socket
// Item Level: 63
[QUALITY] == Legendary && [NAME] == Ice Climbers # [1] == 1

So can you told me what was the problem? .Thanks


something is wrong with ur log !

normally u get the legendary name in the log ...

ur log shows only

Code:
12112012233451: TRASH: Pants,Legendary,Legs (63)

in my logs i have qualifing names loke ...

Code:
14112012012013: TRASH: Won Khim Lau,Legendary,FistWeapon (62)
14112012012013: Rule:[QUALITY]==Legendary&&[BASETYPE]==Weapon#[1]==1#[TRASH]
14112012012013: ---Won Khim Lau,Legendary,FistWeapon (62)

sry...seems u messed something up
 
Code:
[14:37:43.906 N] Compiler Error: c:\Users\Nic\Downloads\Demonbuddy 1.0.1162.284\Plugins\GilesTrinity\GilesTrinity.cs(2949,41) : warning CS0162: Unreachable code detected
[14:37:43.906 N] Compiler Error: c:\Users\Nic\Downloads\Demonbuddy 1.0.1162.284\Plugins\GilesTrinity\GilesTrinity.cs(10419,36) : warning CS0162: Unreachable code detected
[14:37:43.906 N] Compiler Error: c:\Users\Nic\Downloads\Demonbuddy 1.0.1162.284\Plugins\GilesTrinity\GilesTrinity.cs(10423,32) : warning CS0162: Unreachable code detected
[14:37:43.906 N] Compiler Error: c:\Users\Nic\Downloads\Demonbuddy 1.0.1162.284\Plugins\GilesTrinity\GilesTrinity.cs(10489,40) : warning CS0162: Unreachable code detected
[14:37:43.906 N] Compiler Error: c:\Users\Nic\Downloads\Demonbuddy 1.0.1162.284\Plugins\GilesTrinity\GilesTrinity.cs(10766,44) : warning CS0162: Unreachable code detected
[14:37:43.906 N] Compiler Error: c:\Users\Nic\Downloads\Demonbuddy 1.0.1162.284\Plugins\GilesTrinity\GilesTrinity.cs(11120,44) : warning CS0162: Unreachable code detected
[14:37:43.906 N] Compiler Error: c:\Users\Nic\Downloads\Demonbuddy 1.0.1162.284\Plugins\GilesTrinity\GilesTrinity.cs(11130,44) : warning CS0162: Unreachable code detected
[14:37:43.906 N] Compiler Error: c:\Users\Nic\Downloads\Demonbuddy 1.0.1162.284\Plugins\GilesTrinity\GilesTrinity.cs(11167,32) : warning CS0162: Unreachable code detected
[14:37:43.906 N] Compiler Error: c:\Users\Nic\Downloads\Demonbuddy 1.0.1162.284\Plugins\GilesTrinity\GilesTrinity.cs(11400,32) : warning CS0162: Unreachable code detected
[14:37:43.906 N] Compiler Error: c:\Users\Nic\Downloads\Demonbuddy 1.0.1162.284\Plugins\GilesTrinity\GilesTrinity.cs(11401,32) : warning CS0162: Unreachable code detected
[14:37:43.906 N] Compiler Error: c:\Users\Nic\Downloads\Demonbuddy 1.0.1162.284\Plugins\GilesTrinity\GilesTrinity.cs(11499,21) : error CS1525: Invalid expression term 'else'
[14:37:43.906 N] Compiler Error: c:\Users\Nic\Downloads\Demonbuddy 1.0.1162.284\Plugins\GilesTrinity\GilesTrinity.cs(11499,25) : error CS1002: ; expected
[14:37:43.906 N] Compiler Error: c:\Users\Nic\Downloads\Demonbuddy 1.0.1162.284\Plugins\GilesTrinity\GilesTrinity.cs(15329,17) : warning CS0162: Unreachable code detected

Revision 85
 
Does the || work for [TYPE] and/or [QUALITY]?

For example:

[QUALITY] == (Rare || Legendary) && [TYPE] == (Shield || Gloves || Boots) # [MAXSTATVIT] > 400 || [DMGFACTOR] > 15

Would those "or" work?
 
I have a suggestion, that introduce a global percentage, which can let user to adjust how good their item to be stashed.

For example For the shoulders default rules is
[QUALITY] == Rare && [TYPE] == Shoulder # ([DEX] >= 150 || [STR] >= 200 || [INT] >= 150) && ([VIT] >= 60 || [LIFE%] >= 9) && [ALLRES] >= 50 # [KEEP]

We modify it to
[QUALITY] == Rare && [TYPE] == Shoulder # ([DEX] >= 150 * YY || [STR] >= 200 * YY || [INT] >= 150 * YY) && ([VIT] >= 60 || [LIFE%] >= 9 * YY) && [ALLRES] >= 50 * YY # [KEEP]

And by default, YY=1 ,and user can adjust it to 0.5, if they need some entry level gear, and adjust it to YY = 1.2 if they only want that something really good.
 
I just saw bot trashing this cindercoat. Which should have been kept by cindercoat rule:
[QUALITY] == Legendary && [NAME] == Cindercoat # [MAXSTATVIT] > 300 || ([SOCKETS] > 0 && [MAXSTATVIT] > 200)

It didn't name cindercoat in the trash rule so didn't it identify it as cindercoat? This worries me it will trash even better items...


14112012125147: -----------------------------------------------------------------
14112012125147: TRASH: Chest Armor,Legendary,Chest (60)
14112012125147: Rule:[QUALITY]==Legendary&&[BASETYPE]==Armor#[1]==1#[TRASH]
14112012125147: ---Chest Armor,Legendary,Chest (60)
14112012125147: [BASETYPE]: Armor
14112012125147: [TYPE]: Chest
14112012125147: [QUALITY]: Legendary
14112012125147: [NAME]: ChestArmor
14112012125147: [ONEHAND]: False
14112012125147: [TWOHAND]: False
14112012125147: [LEVEL]: 60
14112012125147: [STR]: 128
14112012125147: [DEX]: 96
14112012125147: [VIT]: 87
14112012125147: [LIFE%]: 4,998779
14112012125147: [ALLRES]: 41
14112012125147: [RESFIRE]: 59
14112012125147: [ARMOR]: 290
14112012125147: [ARMORTOT]: 290
14112012125147: [SOCKETS]: 2
14112012125147: [THORNS]: 1532
14112012125147: [MAXSTAT]: 128
14112012125147: [MAXSTATVIT]: 215
14112012125147: [MAXONERES]: 59
14112012125147: [TOTRES]: 100
14112012125147: [STRVIT]: 215
14112012125147: [DEXVIT]: 183
14112012125147: [INTVIT]: 87
 
I have a suggestion, that introduce a global percentage, which can let user to adjust how good their item to be stashed.

For example For the shoulders default rules is
[QUALITY] == Rare && [TYPE] == Shoulder # ([DEX] >= 150 || [STR] >= 200 || [INT] >= 150) && ([VIT] >= 60 || [LIFE%] >= 9) && [ALLRES] >= 50 # [KEEP]

We modify it to
[QUALITY] == Rare && [TYPE] == Shoulder # ([DEX] >= 150 * YY || [STR] >= 200 * YY || [INT] >= 150 * YY) && ([VIT] >= 60 || [LIFE%] >= 9 * YY) && [ALLRES] >= 50 * YY # [KEEP]

And by default, YY=1 ,and user can adjust it to 0.5, if they need some entry level gear, and adjust it to YY = 1.2 if they only want that something really good.

If you want better or lower items to be stashed, just change the rules. There is no need for something like YY because everyone have his own rules. The included rules are just examples and you have to adjust them to your needs. And thats the reason why this plugin is that great.
 
I just saw bot trashing this cindercoat. Which should have been kept by cindercoat rule:
[QUALITY] == Legendary && [NAME] == Cindercoat # [MAXSTATVIT] > 300 || ([SOCKETS] > 0 && [MAXSTATVIT] > 200)

It didn't name cindercoat in the trash rule so didn't it identify it as cindercoat? This worries me it will trash even better items...


14112012125147: -----------------------------------------------------------------
14112012125147: TRASH: Chest Armor,Legendary,Chest (60)
14112012125147: Rule:[QUALITY]==Legendary&&[BASETYPE]==Armor#[1]==1#[TRASH]
14112012125147: ---Chest Armor,Legendary,Chest (60)
14112012125147: [BASETYPE]: Armor
14112012125147: [TYPE]: Chest
14112012125147: [QUALITY]: Legendary
14112012125147: [NAME]: ChestArmor
14112012125147: [ONEHAND]: False
14112012125147: [TWOHAND]: False
14112012125147: [LEVEL]: 60
14112012125147: [STR]: 128
14112012125147: [DEX]: 96
14112012125147: [VIT]: 87
14112012125147: [LIFE%]: 4,998779
14112012125147: [ALLRES]: 41
14112012125147: [RESFIRE]: 59
14112012125147: [ARMOR]: 290
14112012125147: [ARMORTOT]: 290
14112012125147: [SOCKETS]: 2
14112012125147: [THORNS]: 1532
14112012125147: [MAXSTAT]: 128
14112012125147: [MAXSTATVIT]: 215
14112012125147: [MAXONERES]: 59
14112012125147: [TOTRES]: 100
14112012125147: [STRVIT]: 215
14112012125147: [DEXVIT]: 183
14112012125147: [INTVIT]: 87


14112012125147: [NAME]: ChestArmor

That might be the problem, the names don't match. Your rule says [NAME] == Cindercoat, but the log says [NAME]: ChestArmor
 
Could it be possible to implement an option for "at least 2 of the following", meaning i could write something like this:

[DEX] >= 150 && ([VIT] >= 100 || [LIFE%] >= 10 || [CRIT%] >= 3 || [SOCKETS] > 0)^2 && [ALLRES] >= 30

The ^X will mean at least X rules from inside, will make it easier for anything with multiple good options so it won't be needed to write 50 lines per item just to catch 4 possible affix we like.

btw great job :) working nicelyyyy
 
Back
Top